30.11. 處理嵌入的 SQL 程序

既然現在你已經有了如何構成嵌入的 SQL C 程序的概念, 那麼你可能就會向知道如何編譯它們。在編譯之前,你先 用嵌入的 SQL C 預編譯器 處理文件,于編譯器會把你使用的 SQL 語句轉換成 特殊的函數調用。在編譯之後,你必須用一個包含所需要的函數的特殊 庫來鏈接目標文件。這些函數從參數中抓取信息,用 libpq 接口執行 SQL 命令,然後把結果放到聲明為 輸出的參數中。

預處理程序叫做 ecpg,包含在正常的 PostgreSQL 安裝裡面。嵌入的 SQL 程序通常 的擴展名是 .pgc。如果你有一個叫做 prog1.pgc 的程序文件,那麼你可以簡單 地調用

ecpg prog1.pgc

來處理它。這樣將創建一個叫做 prog1.c 的文件。 如果你的輸入文件不遵循建議的命名模式,那麼你可以用 -o 選項 明確地聲明輸出文件。

處理後的文件可以正常編譯,比如:

cc -c prog1.c

生成的 C 源文件包含來自 PostgreSQL 安裝的 頭文件,這樣,如果你在一個缺省不查找的位置安裝了 PostgreSQL, 那麼你就必須在編譯命令行上增加類似 -I/usr/local/pgsql/include 這樣的 選項。

要鏈接一個嵌入的 SQL 程序,你需要包含 libecpg 庫, 像這樣:

cc -o myprog prog1.o prog2.o ... -lecpg

另外,你可能還需要增加一個類似 -L/usr/local/pgsql/lib 這樣的選項到這個命令行上。

如果你用 make 把制作過程融合到 一個大的項目中,那麼在你的 makefile 裡包含下面的隱含規則 可能會比較方便:

ECPG = ecpg

%.c: %.pgc
        $(ECPG) $<

ecpg 命令的復雜語法在 ecpg 裡有詳細介紹。

如果使用 configure--enable-thread-safety 選項編譯了 ecpg,那麼它是線程安全的。 (你可能需要使用其它線程命令行選項編譯你的客戶端代碼。)