36.3. 运行 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;
形式为:*
something*
的标记是宿主变量,即它们引用 C 程序中的变量。它们在第 36.4 节中进行了说明。
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。
注意
ECPGDECLARE
命令实际上不会导致向 PostgreSQL 后端发送语句。游标在后端打开(使用后端的DECLARE
命令),此时执行OPEN
命令。
36.3.3. 管理事务#
在默认模式下,仅当发出EXEC SQL COMMIT
时才提交语句。嵌入式 SQL 接口还通过-t
命令行选项支持自动提交事务(类似于psql的默认行为)到ecpg
(请参见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
#禁用自动提交模式。这是默认设置。
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;
/* 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。另请参阅第 36.5 节,以了解有关使用占位符和输入参数的更多详细信息。