在嵌入式 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 節。
如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表格 報告文件問題。