任何 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 節。)
單列選取
EXEC SQL SELECT foo INTO :FooBar FROM table1 WHERE ascii = 'doodad';
此外,可以使用 SHOW
指令檢索組態參數
EXEC SQL SHOW search_path INTO :var;
形式為 :
的權杖是主機變數,也就是說,它們指的是 C 程式中的變數。它們在第 34.4 節中進行說明。something
若要檢索保存多列的結果集,應用程式必須宣告游標並從游標中提取每一列。 使用游標的步驟如下:宣告游標、開啟游標、從游標中提取一列、重複,最後關閉游標。
使用游標進行選取
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
指令時。
在預設模式下,只有在發出 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 節,以獲取有關使用佔位符和輸入參數的更多詳細資訊。
如果您發現文件中的任何內容不正確、與您使用特定功能的經驗不符,或需要進一步說明,請使用此表單報告文件問題。