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';
If the statement you are executing returns values, then add an INTO clause:
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;
An EXECUTE command may have an INTO clause, a USING clause, both, or neither.
当你不再需要该预备语句时,你应该释放它:
EXEC SQL DEALLOCATE PREPARE name;
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。