PostgreSQL7.0手冊-用戶手冊-20. 應用 - ecpg
2019-09-08 23:33:32
供稿:網友
ecpg
名稱
ecpg ― 嵌入的 SQL C 預處理器
語法
ecpg [ -v ] [ -t ] [ -I include-path ] [ -o outfile ] file1 [ file2 ] [ ... ]
輸入
ecpg 接受下面命令行參數:
-v
打印版本信息.
-t
關閉自動事務模式.
-I path
聲明一個附加的包含路徑.缺省是 ., /usr/local/include,Postgres 包含路徑是在編譯時定義的(缺省:/usr/local/pgsql/lib)和 /usr/include.
-o
聲明 ecpg 應該把它的所有輸出寫到輸出文件里.如果沒有給出這個選項,則寫到 name.c,假設輸入文件是 name.pgc.如果輸入文件有預期的 .pgc 后綴,那么輸出文件將在輸入文件后附加 .pgc (?不是吧?).
file
要處理的文件.
輸出
ecpg將創建一個文件或者寫到標準輸出(stdout).
return value
成功完成后,ecpg 給 shell 返回一個 0,如果出錯返回 -1.
描述
ecpg 是一個嵌入的用于Postgres 和 C 語言的 SQL 預編譯器.她使得用嵌入的 SQL 代碼書寫 C 程序成為可能.
Linus Tolke (又叫 Linus :)是 ecpg 最初的作者(直到版本 0.2).Michael Meskes 是目前的 ecpg 的維護人員和作者.Thomas Good 是 ecpg 手冊頁最新版本的作者,這個手冊頁也是這份文檔的基礎.
用法
為編譯預編譯
一個嵌入的 SQL 源文件在編譯前必須做預處理:
ecpg [ -d ] [ -o file ] file.pgc
這里選項 -d 標志打開調試..pgc 是標識 ecpg 源程序的任意標識.
你可能需要把預處理輸出重定向到一個文件里.
編譯和鏈接
假設 Postgres 二進制在 /usr/local/pgsql,你將需要象下面這樣編譯和鏈接你的預處理過的源文件:
gcc -g -I /usr/local/pgsql/include [ -o file ] file.c -L /usr/local/pgsql/lib -lecpg -lpq
語法
庫
預處理器將包含兩個目錄到源文件里:
#include
#include
變量定義
在 ecpg 源程序里的變量定義必須前導:
EXEC SQL BEGIN DECLARE SECTION;
類似的,變量定義段必須以下面語句結束:
EXEC SQL END DECLARE SECTION;
注意:在 2.1.0 以前,每個變量都必須在一個獨立的行里.到了 2.1.0,可以在一行里定義多個變量:
char foo(16), bar(16);
錯誤控制
SQL 交互部分定義如下:
EXEC SQL INCLUDE sqlca;
注意:sqlca 是小寫.盡管可以使用 SQL 傳統,也就是說,利用大寫字符來區分嵌入的 SQL 和 C 語句,而 sqlca (它包含 sqlca.h 頭文件)必須小寫.這是因為 EXEC SQL 前綴表明這個 INCLUDE 將被 ecpg 分析.ecpg 區分大小寫地檢查頭文件(SQLCA.h 將不會被找到.)考慮大小寫后,EXEC SQL INCLUDE 還可以包含其他頭文件.
sqlprint 命令和 EXEC SQL WHENEVER 語句一起使用用以打開整個程序的錯誤控制:
EXEC SQL WHENEVER sqlerror sqlprint;
和
EXEC SQL WHENEVER not found sqlprint;
注意:這些并不是 EXEC SQL WHENEVER 語句全部用法的例子.其用法的更多的例子可以在 SQL 手冊里找到(例如, `The LAN TIMES Guide to SQL' by Groff and Weinberg).
于數據庫服務器聯接
一種聯接使用下面語句:
EXEC SQL CONNECT dbname;
這里數據庫名稱沒有用引號引起.在 2.1.0 以前,數據庫的名稱要求被單引號引起.
在聯接語句里聲明服務器名和端口名也同樣可以.語法時:
dbname[@server][:port]
或者
:postgresql://server[:port][/dbname][?options]
查詢
通常,其他應用,如 psql ,可以接受的話SQL 查詢都可以嵌入到你的 C 代碼里.下面是幾個如何做的例子.
創建表:
EXEC SQL CREATE TABLE foo (number int4, 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 SELECT foo INTO :FooBar FROM table1 WHERE ascii = 'doodad';
使用游標選擇:
EXEC SQL DECLARE foo_bar CURSOR FOR
SELECT number, ascii FROM foo
ORDER BY ascii;
EXEC SQL FETCH foo_bar INTO :FooBar, DooDad;
...
EXEC SQL CLOSE foo_bar;
EXEC SQL COMMIT;
更新:
EXEC SQL UPDATE foo
SET ascii = 'foobar'
WHERE number = 9999;
EXEC SQL COMMIT;
注意
沒有 EXEC SQL PREPARE 語句.
所有結構定義必須列在定義節里面.
參閱源文件里的 TODO 文件獲取更多缺失特性的描述.