选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.2 已于 2017 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

33.3. 运行 SQL 命令 #

任何 SQL 命令都可以在一个嵌入式 SQL 应用中被运行。下面是一些在嵌入式 SQL 应用中运行 SQL 命令的例子。

33.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执行。要处理有多行的结果集,一个应用必须使用一个游标,可参考下面的第 33.3.2 节(作为一种特殊情况,一个应用可以一次取出多行到一个数组主变量中,参考第 33.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 程序中的变量。其说明见第 33.4 节

33.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 命令的详细信息,参见 FETCH

注意

ECPG DECLARE命令实际上不会向 PostgreSQL 后端发送语句。在执行OPEN命令时,游标才会在后端被打开(使用后端的DECLARE命令)。

33.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 SET AUTOCOMMIT TO ON

启用自动提交模式。

SET AUTOCOMMIT TO OFF

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

33.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;

更多有关PREPARE的细节,可参考PREPARE。关于使用占位符和输入参数的细节,可参考第 33.5 节

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。