29.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 庫,那麼它是線程安全的。 (您可能需要使用其它線程命令行選項編譯您的客戶端代碼。)