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 库,那么它是线程安全的。 (你可能需要使用其它线程命令行选项编译你的客户端代码。)