2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3

34.3. 执行 SQL 命令 #

在嵌入式 SQL 应用程序中,可以执行任何 SQL 命令。以下是一些执行此操作的示例。

34.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 执行。要处理多行结果集,应用程序必须使用游标;请参阅下面的 第 34.3.2 节。(作为特例,应用程序可以一次将多行获取到数组主机变量中;请参阅 第 34.4.4.3.1 节。)

单行 SELECT

EXEC SQL SELECT foo INTO :FooBar FROM table1 WHERE ascii = 'doodad';

此外,还可以使用 SHOW 命令检索配置参数

EXEC SQL SHOW search_path INTO :var;

形式为 :something 的标记是主机变量,也就是说,它们引用 C 程序中的变量。它们在 第 34.4 节 中进行了说明。

34.3.2. 使用游标 #

要检索包含多行的结果集,应用程序必须声明一个游标并从游标中获取每一行。使用游标的步骤如下:声明游标,打开游标,从游标获取一行,重复此过程,最后关闭游标。

使用游标进行 Select

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 命令)打开游标。

34.3.3. 管理事务 #

在默认模式下,只有在发出 EXEC SQL COMMIT 时才会提交语句。嵌入式 SQL 接口还通过 ecpg 的命令行选项 -t(请参阅 ecpg)或通过 EXEC SQL SET AUTOCOMMIT TO ON 语句支持事务自动提交(类似于 psql 的默认行为)。在自动提交模式下,每个命令都会自动提交,除非它在显式事务块中。可以通过使用 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 #

禁用自动提交模式。这是默认设置。

34.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。有关使用占位符和输入参数的更多详细信息,请参阅 第 34.5 节

提交更正

如果您在文档中看到任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表格 报告文档问题。