历史版本。 PostgreSQL 7.4 已结束支持。 请参阅 当前版本手册.
30.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';
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;