30.7. 動態 SQL

在許多情況下,應用要執行的具體的 SQL 語句在書寫應用的時候就已經知道了。 不過,在某些情況下,SQL 語句是在運行時或者由外部的數據提供的。在這種 情況下,我們不能直接在 C 代碼嵌入 SQL 語句,但是有個機制可以允許你調用 放在一個字串變量裡的任何 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;