36.3. 运行 SQL 命令 #
任何 SQL 命令都可以在一个嵌入式 SQL 应用中被运行。下面是一些在嵌入式 SQL 应用中运行 SQL 命令的例子。
36.3.1. 执行 SQL 语句 #
创建一个表:
EXEC SQL CREATE TABLE foo (number integer, ascii char(16)); EXEC SQL CREATE UNIQUE INDEX num1 ON foo(number); EXEC SQL COMMIT;
插入行:
EXEC SQL INSERT INTO foo (number, ascii) VALUES (9999, 'doodad'); EXEC SQL COMMIT;
删除行:
EXEC SQL DELETE FROM foo WHERE number = 9999; EXEC SQL COMMIT;
更新:
EXEC SQL UPDATE foo
SET ascii = 'foobar'
WHERE number = 9999;
EXEC SQL COMMIT;
返回一个单一结果行的 SELECT 语句也可以直接使用 EXEC SQL 执行。要处理有多行的结果集,一个应用必须使用一个游标,可参考下面的第 36.3.2 节(作为一种特殊情况,一个应用可以一次取出多行到一个数组主变量中,参考第 36.4.4.3.1 节)。
单行选择:
EXEC SQL SELECT foo INTO :FooBar FROM table1 WHERE ascii = 'doodad';
还有,一个配置参数可以用 SHOW 命令检索:
EXEC SQL SHOW search_path INTO :var;
: 形式的词元是主变量,即它们指向 C 程序中的变量。其说明见第 36.4 节。
something
36.3.2. 使用游标 #
要读取包含多行的结果集,应用程序必须声明一个游标,并从中逐行取出数据。使用游标的步骤如下:声明游标、打开游标、从中取出一行、重复取行,最后关闭游标。
使用游标选择:
EXEC SQL DECLARE foo_bar CURSOR FOR
SELECT number, ascii FROM foo
ORDER BY ascii;
EXEC SQL OPEN foo_bar;
EXEC SQL FETCH foo_bar INTO :FooBar, DooDad;
...
EXEC SQL CLOSE foo_bar;
EXEC SQL COMMIT;
有关声明游标的更多细节,参见 DECLARE;有关从游标中取回行的更多细节,参见 FETCH。
注意
ECPG DECLARE 命令实际上不会向 PostgreSQL 后端发送语句。在执行 OPEN 命令时,游标才会在后端被打开(使用后端的 DECLARE 命令)。
36.3.3. 管理事务 #
在默认模式下,只有发出 EXEC SQL COMMIT 时命令才会提交。嵌入式 SQL 接口也支持事务自动提交(类似于 psql 的默认行为),可以通过 ecpg 的 -t 命令行选项(见 ecpg)或者 EXEC SQL SET AUTOCOMMIT TO ON 语句启用。在自动提交模式中,除非位于显式事务块内,每条命令都会自动提交。这种模式也可以通过 EXEC SQL SET AUTOCOMMIT TO OFF 显式关闭。
可以使用下列事务管理命令:
EXEC SQL COMMIT#提交一个进行中的事务。
EXEC SQL ROLLBACK#回滚一个进行中的事务。
EXEC SQL PREPARE TRANSACTIONtransaction_id#为两阶段提交预备当前事务。
EXEC SQL COMMIT PREPAREDtransaction_id#提交一个处于预备状态的事务。
EXEC SQL ROLLBACK PREPAREDtransaction_id#回滚一个处于预备状态的事务。
EXEC SQL SET AUTOCOMMIT TO ON#启用自动提交模式。
EXEC SQL SET AUTOCOMMIT TO OFF#禁用自动提交模式。这是默认值。
36.3.4. 预备语句 #
当要传给 SQL 语句的值在编译时未知,或者同一语句将使用多次时,预备语句就很有用。
语句使用命令 PREPARE 进行预备。对于还未知的值,使用占位符“?”:
EXEC SQL PREPARE stmt1 FROM "SELECT oid, datname FROM pg_database WHERE oid = ?";
如果一个语句返回一个单一行,应用可以在 PREPARE 之后调用 EXECUTE 来执行该语句,同时要用一个 USING 子句为占位符提供真实的值:
EXEC SQL EXECUTE stmt1 INTO :dboid, :dbname USING 1;
如果一个语句返回多行,应用可以使用一个基于该预备语句声明的游标。要绑定输入参数,该游标必须用一个 USING 子句打开:
EXEC SQL PREPARE stmt1 FROM "SELECT oid,datname FROM pg_database WHERE oid > ?";
EXEC SQL DECLARE foo_bar CURSOR FOR stmt1;
/* 到达结果集末尾时,跳出 while 循环 */
EXEC SQL WHENEVER NOT FOUND DO BREAK;
EXEC SQL OPEN foo_bar USING 100;
...
while (1)
{
EXEC SQL FETCH NEXT FROM foo_bar INTO :dboid, :dbname;
...
}
EXEC SQL CLOSE foo_bar;
当你不再需要该预备语句时,你应该释放它:
EXEC SQL DEALLOCATE PREPARE name;
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.