2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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 節。)

單行 SELECT

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. 使用遊標 #

要檢索包含多行的結果集,應用程式必須宣告一個遊標並從遊標中獲取每一行。使用遊標的步驟如下:宣告遊標,開啟遊標,從遊標獲取一行,重複此過程,最後關閉遊標。

使用遊標進行 Select

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 後端。在執行 OPEN 命令時,會在後端(使用後端的 DECLARE 命令)開啟遊標。

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 節

提交更正

如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表格 報告文件問題。