在嵌入式 SQL 應用程式中,可以執行任何 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;
形式為 : 的標記是主機變數,也就是說,它們引用 C 程式中的變數。它們在 第 34.4 節 中進行了說明。something
要檢索包含多行的結果集,應用程式必須宣告一個遊標並從遊標中獲取每一行。使用遊標的步驟如下:宣告遊標,開啟遊標,從遊標獲取一行,重複此過程,最後關閉遊標。
使用遊標進行 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 命令)開啟遊標。
在預設模式下,只有在發出 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 #停用自動提交模式。這是預設設定。
當要傳遞給 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 節。
如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表格 報告文件問題。