支援版本:目前版本 (17) / 16 / 15 / 14 / 13
開發版本:devel
不再支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3

34.3. 執行 SQL 指令 #

任何 SQL 指令都可以在嵌入式 SQL 應用程式中執行。 以下是一些執行此操作的範例。

34.3.1. 執行 SQL 語句 #

建立資料表

EXEC SQL CREATE TABLE foo (number integer, ascii char(16));
EXEC SQL CREATE UNIQUE INDEX num1 ON foo(number);
EXEC SQL COMMIT;

插入列

EXEC SQL INSERT INTO foo (number, ascii) VALUES (9999, 'doodad');
EXEC SQL COMMIT;

刪除列

EXEC SQL DELETE FROM foo WHERE number = 9999;
EXEC SQL COMMIT;

更新

EXEC SQL UPDATE foo
    SET ascii = 'foobar'
    WHERE number = 9999;
EXEC SQL COMMIT;

返回單一結果列的 SELECT 語句也可以直接使用 EXEC SQL 執行。 若要處理具有多列的結果集,應用程式必須使用游標;請參閱下面的第 34.3.2 節。(在特殊情況下,應用程式可以一次將多列提取到陣列主機變數中;請參閱第 34.4.4.3.1 節。)

單列選取

EXEC SQL SELECT foo INTO :FooBar FROM table1 WHERE ascii = 'doodad';

此外,可以使用 SHOW 指令檢索組態參數

EXEC SQL SHOW search_path INTO :var;

形式為 :something 的權杖是主機變數,也就是說,它們指的是 C 程式中的變數。它們在第 34.4 節中進行說明。

34.3.2. 使用游標 #

若要檢索保存多列的結果集,應用程式必須宣告游標並從游標中提取每一列。 使用游標的步驟如下:宣告游標、開啟游標、從游標中提取一列、重複,最後關閉游標。

使用游標進行選取

EXEC SQL DECLARE foo_bar CURSOR FOR
    SELECT number, ascii FROM foo
    ORDER BY ascii;
EXEC SQL OPEN foo_bar;
EXEC SQL FETCH foo_bar INTO :FooBar, DooDad;
...
EXEC SQL CLOSE foo_bar;
EXEC SQL COMMIT;

有關宣告游標的更多詳細資訊,請參閱DECLARE;有關從游標中提取列的更多詳細資訊,請參閱FETCH

注意

ECPG DECLARE 指令實際上不會導致將語句傳送到 PostgreSQL 後端。 游標在後端開啟(使用後端的 DECLARE 指令),此開啟動作發生在執行 OPEN 指令時。

34.3.3. 管理交易 #

在預設模式下,只有在發出 EXEC SQL COMMIT 時才會提交語句。 嵌入式 SQL 介面也透過 ecpg-t 命令列選項(請參閱ecpg)或透過 EXEC SQL SET AUTOCOMMIT TO ON 語句來支援交易的自動提交(類似於 psql 的預設行為)。 在自動提交模式下,除非命令位於明確的交易區塊內,否則每個命令都會自動提交。 可以使用 EXEC SQL SET AUTOCOMMIT TO OFF 明確關閉此模式。

以下交易管理指令可用

EXEC SQL COMMIT #

提交進行中的交易。

EXEC SQL ROLLBACK #

回滾進行中的交易。

EXEC SQL PREPARE TRANSACTION transaction_id #

準備目前交易以進行兩階段提交。

EXEC SQL COMMIT PREPARED transaction_id #

提交處於預備狀態的交易。

EXEC SQL ROLLBACK PREPARED transaction_id #

回滾處於預備狀態的交易。

EXEC SQL SET AUTOCOMMIT TO ON #

啟用自動提交模式。

EXEC SQL SET AUTOCOMMIT TO OFF #

停用自動提交模式。這是預設值。

34.3.4. 預備語句 #

當要傳遞給 SQL 語句的值在編譯時未知,或者同一語句將被多次使用時,預備語句會很有用。

使用 PREPARE 命令來預備語句。對於尚未知道的值,請使用佔位符 ?

EXEC SQL PREPARE stmt1 FROM "SELECT oid, datname FROM pg_database WHERE oid = ?";

如果語句返回單一行,應用程式可以在 PREPARE 之後呼叫 EXECUTE 來執行該語句,並使用 USING 子句提供佔位符的實際值

EXEC SQL EXECUTE stmt1 INTO :dboid, :dbname USING 1;

如果語句返回多行,應用程式可以使用基於預備語句宣告的游標。要綁定輸入參數,必須使用 USING 子句開啟游標

EXEC SQL PREPARE stmt1 FROM "SELECT oid,datname FROM pg_database WHERE oid > ?";
EXEC SQL DECLARE foo_bar CURSOR FOR stmt1;

/* when end of result set reached, break out of while loop */
EXEC SQL WHENEVER NOT FOUND DO BREAK;

EXEC SQL OPEN foo_bar USING 100;
...
while (1)
{
    EXEC SQL FETCH NEXT FROM foo_bar INTO :dboid, :dbname;
    ...
}
EXEC SQL CLOSE foo_bar;

當您不再需要預備語句時,應該將其釋放。

EXEC SQL DEALLOCATE PREPARE name;

有關 PREPARE 的更多詳細資訊,請參閱 PREPARE。另請參閱 第 34.5 節,以獲取有關使用佔位符和輸入參數的更多詳細資訊。

提交更正

如果您發現文件中的任何內容不正確、與您使用特定功能的經驗不符,或需要進一步說明,請使用此表單報告文件問題。