| PostgreSQL 8.0.0 中文文件(轉譯自 PostgreSQL 中國 製作的簡體中文版本) | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 29. ecpg - 在 C 裡嵌入 SQL | Fast Forward | Next |
在許多情況下,應用要執行的具體的 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;