pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
在很多情况中,一个应用必须要执行的特定 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;
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。