↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 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
历史版本。 PostgreSQL 8.0 已结束支持。 请参阅 当前版本手册.

29.7. 动态 SQL #

在很多情况中,一个应用必须要执行的特定 SQL 语句在编写该应用时就已知。不过在某些情况中,SQL 语句在运行时构造或者由一个外部来源提供。这样你就不能直接把 SQL 语句嵌入到 C 源代码,不过有一种功能允许你调用在一个字符串变量中提供的任意 SQL 语句。

执行一个任意 SQL 语句的最简单方法是使用命令EXECUTE IMMEDIATE。例如:

EXEC SQL BEGIN DECLARE SECTION;
const char *stmt = "CREATE TABLE test1 (...);";
EXEC SQL END DECLARE SECTION;

EXEC SQL EXECUTE IMMEDIATE :stmt;

你不能用这种方法执行检索数据的语句(例如SELECT)。

执行任意 SQL 语句的一种更强大的方法是将语句预备一次,然后在每次需要时执行该预备语句。也可以预备一个一般化的语句,然后通过替换参数执行它的特定版本。在预备语句时,在你想要稍后替换参数的地方写上问号。例如:

EXEC SQL BEGIN DECLARE SECTION;
const char *stmt = "INSERT INTO test1 VALUES(?, ?);";
EXEC SQL END DECLARE SECTION;

EXEC SQL PREPARE mystmt FROM :stmt;
 ...
EXEC SQL EXECUTE mystmt USING 42, 'foobar';

如果你正在执行的语句返回值,那么加上一个INTO子句:

EXEC SQL BEGIN DECLARE SECTION;
const char *stmt = "SELECT a, b, c FROM test1 WHERE a > ?";
int v1, v2;
VARCHAR v3;
EXEC SQL END DECLARE SECTION;

EXEC SQL PREPARE mystmt FROM :stmt;
 ...
EXEC SQL EXECUTE mystmt INTO v1, v2, v3 USING 37;

一个EXECUTE命令可以带INTO子句、USING子句、两者都带或两者都不带。

当你不再需要该预备语句时,你应该释放它:

EXEC SQL DEALLOCATE PREPARE name;

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.