任何 SQL 命令都可以在嵌入式 SQL 应用程序中运行。下面是一些关于如何执行 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
执行。要处理包含多行的结果集,应用程序必须使用游标;请参见下面的 第 34.3.2 节。(作为一种特殊情况,应用程序可以一次将多行提取到数组宿主变量中;请参见 第 34.4.4.3.1 节。)
单行选择
EXEC SQL SELECT foo INTO :FooBar FROM table1 WHERE ascii = 'doodad';
此外,可以使用 SHOW
命令检索配置参数
EXEC SQL SHOW search_path INTO :var;
形如 :
的标记是宿主变量,也就是说,它们指的是 C 程序中的变量。它们在 第 34.4 节中进行了解释。something
要检索包含多行的结果集,应用程序必须声明游标并从游标中提取每一行。使用游标的步骤如下:声明游标、打开游标、从游标中提取一行、重复,最后关闭游标。
使用游标进行选择
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
命令)。
在默认模式下,只有在发出 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 TRANSACTION
transaction_id
#准备当前事务以进行两阶段提交。
EXEC SQL COMMIT PREPARED
transaction_id
#提交处于准备状态的事务。
EXEC SQL ROLLBACK PREPARED
transaction_id
#回滚处于准备状态的事务。
EXEC SQL SET AUTOCOMMIT TO ON
#启用自动提交模式。
EXEC SQL SET AUTOCOMMIT TO OFF
#禁用自动提交模式。这是默认设置。
当传递给 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; /* when end of result set reached, break out of while loop */ 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
;
有关 PREPARE
的更多详细信息,请参见 PREPARE。另请参见 第 34.5 节,了解有关使用占位符和输入参数的更多详细信息。
如果您发现文档中任何不正确、与您使用特定功能的经验不符或需要进一步澄清的地方,请使用此表格报告文档问题。