返回首页

gbase数据、南大通用产品文档:GBase8a|

更新日期:2024年09月11日

|
13 | 140000 | 186203.892319613 | -46203.8923196126 |
|
14 | 148000 | 155946.739425521 | -7946.73942552117 |
|
15 |
65000 | 94497.4293105379 | -29497.4293105379 |
+------+--------+------------------+-------------------+
15 rows in set (Elapsed: 00:00:00.00)
如上的结果是对房屋价格的线性回归预测,其中price 列是房屋的实际价格,
predict 列是通过模型预测的价格,
residual 列是实际价格-预测价格的差值,
从结果可以看出线性模型的基本正确的。

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1430

SQL 代码的示例在整个出版物中出现。
除非另有说明,
代码不特定于任何单个的 GBase 8s
应用程序开发工具。
如果示例中仅列出 SQL 语句,那么它们将不用分号定界。例如:您可能看到以下示例中
的代码:
CONNECT TO stores_demo

GBase 8s DB-Access 用户指南
南大通用数据技术股份有限公司 - 4 -
...

DELETE FROM customer
WHERE customer_num = 121
...

COMMIT WORK
DISCONNECT CURRENT
要将此 SQL 代码用于特定产品,必须应用该产品的语法规则。例如,如果使用的是 SQL
API,那么必须在每条语句的开头使用 EXEC SQL,并在每条语句的结尾使用分号(或其
他合适的定界符)。 如果使用的是 DB–Access,那么必须用分号将多条语句隔开。
提示: 代码示例中的省略点表示在整个应用程序中将添加更多的代码,但是不必显示它以
描述正在讨论的概念。
有关使用特定应用程序开发工具或 SQL API 的 SQL 语句的详细指导,
请参阅您的产品文
档。


GBase 8s DB-Access 用户指南
南大通用数据技术股份有限公司 - 5 -
2 DB-Access 入门
DB-Access 提供了用于输入、运行和调试结构化查询语言 (SQL) 语句与存储过程语言
(SPL) 例程的菜单驱动型界面。您还可以从命令行以交互方式运行 DB-Access。
使用 SQL 和 SPL 命令可执行数据定义任务(例如,指定表中数据列的数量和类型)和数
据管理任务(例如,存储、查看和更改表数据)。
您可以使用 DB-Access 执行下列方面的数据库处理:
l
运行很少执行的特别查询
l
连接至一个或多个数据库、在数据库和外部文本文件之间传输数据以及显示有关数据
库的信息
l
显示数据库的系统目录表和信息模式
l
练习 GBase 8s SQL 指南:
教程 或
《GBase 8s 数据库设计和实现指南》
中提供的 SQL
和 SPL 语句和示例
l
测试您要存储以供在生产环境中使用的应用程序
l
创建演示数据库
重要:
DB-Access 未计划用作应用程序开发环境。
当在 DB-Access 中运行 SQL 语句时,
不能有条件地转移或循环执行这些语句。
GBase 8s 服务器和 GBase 8s Client Software Development Kit 随附了 DB-Access 实用程
序。

要从 GBase 8s ESQL/C 源文件创建可执行 C 程序,请使用 esql 命令。GBase 8s 安
装脚本将 esql 命令作为 GBase 8s ESQL/C 产品的一部分进行安装。
本节描述 esql 命令的
作用以及如何使用它。
esql 命令按以下步骤执行:
将嵌入式 SQL 语句转换为 C 语言代码。
将 ESQL/C 源文件转换为 C 语言源文件。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 45 -

编译由 C 编译器生成的文件以创建对象文件。
创建资源编译器并链接您在 Windows™ 的 esql 命令行上指定的任何资源文件。
将对象文件与 GBase 8s ESQL/C 库和您自己的库链接。
使用 esql 命令的要求
在使用 esql 之前,请确保:
GBase 8s ESQL/C 源文件的文件名称具有 .ec 扩展名。
如果希望在 GBase 8s ESQL/C
预处理器执行之前运行 C 预处理器,可以使用 .ecp 扩展名。
已正确设置 GBASEDBTDIR 环境变量和包含 GBASEDBTDIR 目录的 BIN 目录的
路径(在 UNIX™ 操作系统中是$GBASEDBTDIR/bin ,在 Windows™ 环境中
是 %GBASEDBTDIR%\bin ) PATH 环境变量。
esql 目录的语法
下列主题描述了 esql 命令的语法。
本节安装影响处理的阶段组织命令行选项:
预处理选项确定 esql 如何转换嵌入式 SQL 语句。
当 C 编译器将 C 源转换为对象文件时,编译选项影响编译阶段。
当 C 编译器链接对象代码以生成可执行文件时,链接选项影响链接阶段。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 46 -


-ansi
如果源文件对 ANSI 标准 SQL 语法使用 GBase 8s 扩展,则导致 esql 发出警告。
该参数仅影响命令行右侧的源文件。
-cc ccargs
将 ccargs 传递给 C 编译器,而无需解释或更改它们。变量 ccargs 表示 -cc 和下
一个出现在任何这些参数之间的所有参数。
-l(仅限于 Windows™)
-r(仅限于 Windows)
-f(仅限于 Windows)
任何文件名称(除了为此选项的参数的文件名称)
-e
仅进行预处理,
不编译或链接。
ESQL/C 预处理器生成一个具有 .c 扩展名的 C 源文
件。-EDname
创建 name 的定义。其效果与源文件中包含 name 的 ESQL/C define 指令相同。
如果包含 value = ,那么此定义设置为 value。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 47 -

-EUname
取消定义名为 name 的 GBase 8s ESQL/C 定义。
就像源文件为此名称包含 GBase 8s
ESQL/C undef 指令。
-g
将源文件的最后的 -G 选项的作用转换到命令行上该选项的右侧。
-G
通常 #line 指令将添加到 C 源代码中,以便 C 编译器在 C 文件中检测到错误时,
可以将它引导到 GBase 8s ESQL/C 文件中的正确行。
-G 选项会关闭在命令行中跟随它的
GBase 8s ESQL/C 源文件的此功能。
使用 -g 参数重启此功能。
-nln 参数是 -G 的同义词。

-Ipathname
将 pathname 添加到 GBase 8s ESQL/C 和 C include 文件的搜索路径。搜索路径用
于搜索和 include 和 #include 指令中命名的文件。
-icheck
告诉 esql 添加代码,如果将空值返回没有与其相关联的指示变量的主机变量,则会
生成错误。此参数仅影响命令行右侧的源文件。
-local
指定在源文件中声明的静态游标名称和语句 ID 是文件的本地名称。如果不使用
-local 选项,游标名称和语句 ID 缺省情况下为全局实体。此参数只影响命令行右侧的源
文件。
-log logfile
将 GBase 8s ESQL/C 预处理器生成的错误和警告消息发送给指定的文件而不是标准
输出。该选项仅影响预处理器错误和警告。
-libs
防止所有编译和链接,并显示所有基于其他选项的链接的库的名称。
-nln
-G 的同义词
-nowarn
抑制来自预处理器的警告消息。仍会发出错误消息。此参数只影响命令行右侧的源文
件的预处理。
-o outfile
指定由编译器创建的输出文件的名称。
otherarg
esql 无法直接识别或处理的参数传递给 C 编译器。
此过程允许您在命令行中包含库、

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 48 -

资源文件、C 编译器选项和类似的参数。如果传递给 C 编译器的参数与 esql 参数之一冲
突,则使用 -cc 选项将其从 esql 中保护。
source.ec
具有缺省后缀 .ec 的 GBase 8s ESQL/C 源文件。
-thread
告诉 GBase 8s ESQL/C 预处理器创建线程安全代码。
-static
链接 GBase 8s 静态库而不是缺省 GBase 8s 标准库。
-V
打印您的 GBase 8s ESQL/C 预处理器的版本信息然后退出。如果指定此参数将忽略
其它参数。
-version
打印您的 GBase 8s ESQL/C 预处理器的版本和安装信息然后退出。如果指定此参数
将忽略其它参数。
-xopen
为使用 GBase 8s 扩展到 X/Open 标准的 SQL 语句生成警告消息。它还表明动态
SQL 语句使用数据类型的 X/Open 代码集(使用 GET DESCRIPTOR 和 SET
DESCRIPTOR 语句或 sqlda 结构时)。
仅限于 UNIX 的参数

-cp
在处理 source.ec 文件时导致 esql 在 GBase 8s ESQL/C 预处理器之前运行 C 预
处理器。文件中的 SQL 关键字被保护以防止被 C 预处理器解析,此保护在 C 预处理器
运行完毕后撤销。此参数只影响命令行右侧的源文件。
-glu
编译使您的应用程序可以使用 GLU(对于 Unicode 为 GLS)。
-np
在 GBase 8s ESQL/C 预处理器处理之前,防止由 C 预处理器处理的源文件中的
SQL 语句的保护。此参数仅影响命令行右侧的源文件。
-nup
无取消保护模式。SQL 关键字包含在 C 预处理器运行完后不会被删除。该编译在 C

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 49 -

预处理器之后停止,结果放置扩展名为 .icp 的文件中。
-onlycp
这种模式类似于 -cp 模式。它强制 C 预处理器在 GBase 8s ESQL/C 预处理器之前
首先运行。但是,在 C 预处理器运行之后停止处理,将结果留在 .icp 文件中。
source.ecp
带有特殊后缀 .ecp 的 GBase 8s ESQL/C 源文件。它被视为正在使用 -cp 选项的
GBase 8s ESQL/C 文件。
仅限于 Windows 的参数
@ respfile
指定包含其它选项的文件。
-bc
告诉预处理器使用 Borland C 编译器而不是 Microsoft™ Visual C++ 编译器。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 50 -

-cpu:
如果正在使用 Borland C 编译则此参数无效。该参数告诉 esql 什么类型的处理器希
望被可执行程序优化。有三个可能值:
alpha
对于与 Alpha 架构兼容的处理器。
i386
适用于与 Intel386 架构兼容的处理器。这是缺省值。
mips
适用于使用 MIPS32 或 MIPS64 指令集架构(ISA)的处理器。
-dcmdl
显示用于启动 C 编译器的命令行。这使您可以直观地验证所使用的选项。
-f filename
指定包含其它 GBase 8s ESQL/C 源文件名称的文件的名称。
-l largs
将 largs 传递给链接,
而不需解释或更改它们。
largs 是 -cc 和 -r 选项或行末尾之
间的所有参数。
-lw:width
当 GBase 8s ESQL/C 源文件转换为 C 因为我时,该参数导致 C 源文件中的行被包
装在 width 指示的列的位置。此参数仅影响命令行右侧的源文件。
-mc
告诉预处理器使用 Microsoft Visual C++ 编译器编译和链接。
-mserr
提供 Microsoft 样式消息和警告。
-n
防止 esql 在运行时输出版本消息。
-p
-e 的同义词。
-pa
-cpu:alpha 的同义词。
-pi
-cpu:i386 的同义词。
-pm

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 51 -

-cpu:mips 的同义词。
-rt:
-runtime: 的同义词。
-runtime:
确定 C 运行时与可执行文件链接的库的类型。库类型的指示符必须遵循此选项并且
两者之间不能有空格。该类型必须是以下之一:
d
链接多线程共享库。如果未指定 -runtime: 则它是缺省库。还可以使用库名称的代
替 d。
如果使用 Microsoft Visual C++ 编译,
则库的名称是 msvcrt。
如果使用 Borland C,
则是 cw32mti。
m
链接静态多线程共享库。
还可使用库名称代替 m。
如果使用 Microsoft Visual C++ 编
译,则库的名称是 libcmt。如果使用 Borland C,则是 cw32mt。不能与 -static 选项一
起使用。
s
链接静态单线程库。
还可以使用使用库名称代替 s。
如果使用 Microsoft Visual C++ 编
译,则库的名称是 libc。如果使用 Borland C,则是 cw32。不能与 -static 选项一起使
用。
t
仅在使用 Borland C 时才能使用此选项。它链接静态多线程库。还可以使用使用库名
称 cw32i 代替 t。不能与 -static 选项一起使用。
-Sc
-subsystem:console 的同义词。
-ss:
-subsystem: 的同义词。
-Sw
-subsystem:windows 的同义词。
-subsystem:
确定要链接到可执行文件中的子系统。子系统类型的指示符必须遵循此选项,之间不
能有空格。该类型必须是以下之一:
console
缺省类型。它创建控制台应用程序。该指示符可以缩写为 c.
windows

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 52 -

创建 Windows 应用程序。该指示符可以缩写为 w。
-subsystem: 选项可以缩写为 -ss:。
-target:
确定创建文件的类型。目标类型的指示符必须遵循此选项,并且两端不能具有空格。
该指示符必须是以下一种:
dll
创建动态加载库(DLL)文件。
exe
缺省类型。会创建常规的可执行文件。
-ts:width
在创建 C 源文件时,告诉预处理器在每个 width 列上定义制表位。默认情况下,预
处理器集选项卡每八列停止一次。
-v
-V 的同义词。
-wd
-target:dll 的同义词。
-we
-target:exe 的同义词
影响预处理的选项
GBase 8s ESQL/C 程序必须在 C 编译器能编译它之前进行预处理。
GBase 8s ESQL/C
预处理器将嵌入式 SQL 语句转换为 C 语言代码。
可以使用以下主题描述的所有预处理器选项。仅用于预处理,或用于预处理、编译和
链接。
检查版本号
GBase 8s ESQL/C 程序必须在 C 编译器能编译它之前进行预处理。
GBase 8s ESQL/C
预处理器将嵌入式 SQL 语句转换为 C 语言代码。
可以使用以下主题描述的所有预处理器选项。仅用于预处理,或用于预处理、编译和
链接。
将选项与文件相关联
许多预处理器仅影响命令行选项右侧显示的文件。例如此命令行:
esql -G source1.ec -ansi source2.ec
-G 选项影响 source1.ec 文件,-ansi 和 -G 选项影响 source2.ec 文件。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 53 -

预处理,无需编译和链接
缺省情况下,esql 命令使 GBase 8s ESQL/C 程序被预处理、编译和链接。esql 命令
的输出时一个可执行文件。可以指定 -e 选项抑制您的 GBase 8s ESQL/C 程序编译和链接。
使用此选项,esql 只预处理处理此代码。该命令的输出是 C 源文件(.c 扩展名)。
例如,要处理 demo1.ec 文件中的查询,使用以下命令:
esql -e demo1.ec
上面的命令会生成名为 demo1.c 的 C 源文件。下面的 esql 命令预处理 demo1.ec,
检查 ANSI 标准语法的 GBase 8s 扩展,并且不使用行编号:
esql -e -ansi -G demo1.ec
生成线程安全代码
可以使用 -thread 选项指示预处理器生成线程安全代码。
必须与THREADLIB 环境变量一起使用此选项在编译应用程序时指定使用哪个线程
包。
对于 Windows™ 环境,
GBase 8s 通用库
(libgen 、
libos 、
libgls 、
libafs 和 libsql)
是共享的、线程安全的 DLL。因此 esql 命令自动链接是共享的、线程安全的 DLL。当在
Windows 环境中编译多线程应用程序时不要设置 THREADLIB 环境变量。
检查 ANSI 标准 SQL 语法
当编译 GBase 8s ESQL/C 程序是,可以指示预处理器按照以下两种方法之一检查
ANSI 标准 SQL 语法的 GBase 8s 扩展:
设置 DBANSIWARN 环境变量。
设置 DBANSIWARN 环境变量之后,每次编译或运行 GBase 8s ESQL/C 程序时,
GBase 8s ESQL/C 检查是否符合 ANSI。
可以在编译时指定 -ansi 选项以检查 ANSI 兼容性。
-ansi 选项不会使 GBase 8s ESQL/C 在运行时检查 ANSI 兼容性。
使用 -ansi 选项,GBase 8s ESQL/C 预处理器在遇到 ANSI SQL 语法的 GBase 8s
扩展时生成警告消息。下面的 esql 命令预处理、编译并链接 demo1.ec 程序并验证它不包
含 ANSI 标准语法的 GBase 8s 扩展:
esql -ansi demo1.ec
如果使用 -ansi 和 -xopen 选项编译程序,则 GBase 8s ESQL/C 预处理器对 ANSI
和 X/Open SQL 语法的 GBase 8s 扩展生成警告消息。
在预处理时定义和取消定义
可以使用 -ED 和 -EU 选项在 GBase 8s ESQL/C 预处理时创建或删除定义。
创建全局定义,使用以下任一格式的 -ED 选项:
使用 -EDname 语法定义 Boolean 符号,如下所示:

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 54 -

esql -EDENABLE_CODE define_ex.ec
使用 -EDname=value 语法定义整数常量,如下所示:
esql -EDMAXLENGTH=10 demo1.ec
-EDname 等价于在您的 GBase 8s ESQL/C 程序上方带有 name 的 define 预处理
程序指令($define 或 EXEC SQL define)。
要删除或取消定义,使用以下 -EU 选项的语法:
-EUname
-EU 选项对整个文件具有全局影响,无论 name 其它的 define 指令如何。
限制: 在 ED 或 EU 和符号名称之间不要有空格。
与 define 和 undef 语句一样,
GBase 8s ESQL/C 预处理器在预处理的第 1 阶段处
理 -ED 和 -EU 选项(在它预处理源文件中的代码之前)。
下图显示使用条件编译的代码段(ifdef 和 ifndef 指令)。
图: 使用 ifdef 、ifndef 和 endif 的 ESQL/C 摘录
/* define_ex.ec */
#include
EXEC SQL include sqlca;
EXEC SQL define ENABLE_CODE;

main()
{


EXEC SQL ifdef ENABLE_CODE;
printf("First block enabled");
EXEC SQL endif ENABLE_CODE;


EXEC SQL ifndef ENABLE_CODE;
EXEC SQL define ENABLE_CODE;
EXEC SQL endif ENABLE_CODE;


EXEC SQL ifdef ENABLE_CODE;
printf("Second block enabled");
EXEC SQL endif ENABLE_CODE;
}
对于图 1 中显示的代码段,
以下 esql 命令行不会生成代码,
因为命令行删除了整个
源文件的 ENABLE_CODE 定义:
esql -EUENABLE_CODE define_ex.ec
检查缺失的指示变量
如果包含 -icheck 选项,
GBase 8s ESQL/C 预处理器会在程序中生成代码,
如果 SQL

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 55 -

语句将 null 值返回给没有关联指示变量的主变量,则会返回运行时错误的代码。例如,以
下命令告诉预处理器将检查空值的代码插入到 demo1.ec 程序中:
esql -icheck demo1.ec
如果未使用 -icheck 选项,则当数据库服务器将 null 值返回给不带有指示变量的主
变量时,GBase 8s ESQL/C 不会生成错误。
命名 include 文件的位置
-I 预处理器选项允许您为预处理器搜索的 GBase 8s ESQL/C 和 C include 文件的目
录命名。
该选项对 GBase 8s ESQL/C 和 C 预处理都有效,如下所示:
GBase 8s ESQL/C 预处理程序(esql)只处理 GBase 8s ESQL/C include 文件。
可以使用 include 预处理器指令 $include 或 EXEC SQL include 指定这些文件。

C 预处理程序(cc)仅处理 C include 文件。
可以使用 #include 预处理器程序语句指定这些文件。因为 C 预处理在 GBase 8s
ESQL/C 编译完成后开始,GBase 8s ESQL/C include 文件处理后再处理 C include 文件。
预处理程序在预处理 C include 文件
(#include 预处理程序语句指定的文件)
之前将
-I 选项传递给 C。-I 选项的语法如下:
esql -Idirectory esqlcprogram.ec
如果标准 C 库函数 fopen() 、fread() 和 fclose() 可以访问它们,则该 directory 可
以安装在远程文件系统上。
以下 esql 命令命名 UNIX™ 目录 /usr/johnd/incls ,以在 demo1 程序中搜索
GBase 8s ESQL/C 和 C include 文件:
esql -I/usr/johnd/incls demo1.ec
一个 -I 选项列出一个目录。要列出多个目录,必须在命令行列出多个 -I 选项。
要在 Windows™ 环境中的 C:\dorrie\incl 和 C:\johnd\incls 目录中搜索,必须发出以
下命令:
esql -IC:dorrie\incl -IC:\johnd\incls demo1.ec
当预处理器收到 include 指令时,它会通过搜索路径查看要包含的文件。它按照以
下顺序搜索目录:
当前目录
-I 预处理程序制定的目录 (按照在命令行中指定的顺序)
UNIX 操作系统上的 $GBASEDBTDIR/incl/esql 目录以及 Windows 环境中
的 %GBASEDBTDIR%\incl\esql 目录($GBASEDBTDIR 和 %GBASEDBTDIR% 表示该
名称环境变量的内容)
/usr/include 目录

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 56 -

行号
缺省情况下,GBase 8s ESQL/C 预处理器将 #line 目录放在 .c 文件中,以便如果 C
编译器检测到错误,则会引导您在 GBase 8s ESQL/C 源文件中生成问题 C 代码的行。如
果您想要定向到 C 文件中的问题行,
可以使用 -G 选项关闭行号。
-G 选项可以防止在命
令行中的源代码文件中生成 #line 指令。
要重新使用行号,
请使用 -g 选项,-g 选项后面
的文件将生成 #line 指令。
游标名称和语句 ID
缺省情况下,GBase 8s ESQL/C 将游标名称和语句 ID 定义为全局实体。如果使用
-local 选项,您在文件中声明的静态游标名称和静态语句 ID 是该文件的局部变量。
要创建本地名称,GBase 8s ESQL/C 将向 GBase 8s ESQL/C 程序中的游标名称和语
句 ID 添加一个唯一的标记(长度为 2 到 9 个字符)。如果游标名称(或语句 ID)和唯
一标记的长度超过 128 个字符,则会收到一条警告消息。
-local 选项主要用于与以前版本的 GBase 8s ESQL/C 创建的应用程序的兼容性。当
编译新的应用程序时不要使用此选项。不要将此消息与 -local 标志混淆。如果混淆它们,
您可能接收到不可预知的结果。
如果使用 -local 选项,必须在每次重命名源文件时重新编译它们。
重定向错误和警告
缺省情况下,esql 会将其生成的错误和警告消息指向标准输出。如果要将错误和警告
放入文件中,请使用 -log 选项和文件名。
例如,下面的 esql 命令编译程序 demo1.ec 并将错误发送到 err.out 文件:
esql -log err.out -o demorun demo1.ec
此选项仅影响 GBase 8s ESQL/C 预处理程序生成的错误警告。编译和链接阶段的警
告仍然转到标准错误输出,例如 UNIX™ 上的 stderr。
抑制警告
缺省情况下,预处理器在处理 GBase 8s ESQL/C 文件时生成警告。要抑制这些警告
消息,使用 -nowarn 选项。该选项对错误消息没有影响。
启用 GLS(Unicode)GLU 功能
GLS Unicode
(GLU)
是一种功能,
允许您的应用程序在处理 Unicode 是使用 Unicode
的国际标准组件库而不是一般的 GLS 库。
使用 ICU 库的主要优势是,在对 Unicode 字符进行整理时,它们会考虑区域设置,
GLS 库不会。
启用 GLU:
使用 esql 命令的 -glu 选项编译应用程序。
在客户端和数据库服务器的环境中将 GL_USEGLU 设置为 1。GL_USEGLU 环境变

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 57 -

量必须在服务器启动前和数据库创建前设置为 1。
选择使用 Unicode 或 GB18030-2000 作为代码集的区域设置。
X/Open 标准
-xopen 选项告诉 GBase 8s ESQL/C 预处理器您的程序使用 X/Open 标准。
当指定此选项时,预处理器执行以下任务:
它检查 X/Open 标准语法的 GBase 8s 扩展。
如果在您的代码中包含 X/Open 标准语法的 GBase 8s 扩展,则预处理器生成警告消
息。
使用用于 SQL 数据类型的 X/Open 代码集。
GBase 8s ESQL/C 在动态管理结构(系统描述符区间或 sqlda 结构)中使用这些代
码指示列数据类型。 GBase 8s 在 sqlxtype.h 头文件中定义这些代码。
如果在 GBase 8s ESQL/C 程序中使用 X/Open SQL,您必须使用 -xopen 选项编译
同一应用程序中的其它源文件。
如果使用 -xopen 和 -ansi 选项编译程序,GBase 8s ESQL/C 预处理器为 GBase 8s
扩展生成 X/Open 和 ANSI SQL 语法的警告消息。
在运行 ESQL/C 预处理前运行 C 预处理器
GBase 8s ESQL/C 源文件的编译可以遵循缺省顺序。GBase 8s ESQL/C 预处理首先在
源文件上运行,
或者可以允许 C 预处理器在 GBase 8s 源文件之前运行 GBase 8s ESQL/C
预处理。
GBase 8s ESQL/C 源文件的缺省编译顺序如下:
GBase 8s ESQL/C 预处理器执行以下步骤来从 GBase 8s ESQL/C 源文件创建 .c 文
件:
在处理所有 include 指令时($include 和 EXEC SQL include 语句)时,将 GBase 8s
ESQL/C 源文件合并到源文件中。
当处理所有 define($define 和 EXEC SQL define)和 undef($undef 和 EXEC SQL
undef)指令时,创建或删除编译时定义。
处理任何条件编译指令(ifdef 、ifndef 、else 、elif 、endif)并将嵌入式 SQL 语句
转换为 GBase 8s ESQL/C 函数调用和特定的数据结构。
C 预处理器执行以下操作:
在处理所有 include 指令(#include)时,将 C 头文件合并到源文件中。
当它处理所有的 C 语言指令 define(#define)和 undef(#undef)时,创建或删除编
译时定义。
处理 C 条件编译指令(#ifdef 、#ifndef 、#else 、 #elif 、 #endif)

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 58 -

C 编译器、汇编器和链接器以通常的方式运行,就像 C 源文件一样,将 C 代码文
件转换为可执行文件。
编译的缺省顺序是有限制的,
因为无法使用 C 系统文件或自定义 C 头文件中定义的
#defines 或 typedefs 来定义 GBase 8s ESQL/C 主机变量和常量,也不能将它们用于
GBase 8s ESQL/C 代码的条件编译。使用缺省编译顺序,直到 GBase 8s ESQL/C 预处理器
运行之后,C 头文件才被包含在 GBase 8s ESQL/C 源代码中,使这些定义对 GBase 8s
ESQL/C 预处理器不可用。
首先运行 C 预处理器的选项
可以首先在 GBase 8s ESQL/C 源文件上运行 C 预处理器,
从而在 GBase 8s ESQL/C
源文件之前扩展 GBase 8s ESQL/C 源文件中的任何依赖于 C 的 typedefs 或 #defines,
然后才能在该源文件上运行 此源文件。可以通过以下任何方式执行此操作:
将 -cp 或 -onlycp 选项传递给 esql 命令。
两者强制首先运行 C 预处理器。但是在 -cponly 选项的情况下,编译在 C 预处理
器运行后停止,并将结果放入 .icp 文件中。
创建带有 .ecp 扩展的 GBase 8s ESQL/C 源文件。
该处理自动触发文件上 -cp 选项。
将 CPFIRST 环境变量设置为 TRUE(使用大写字母)。
使用 eprotect.exe 实用程序。
CPFIRST 环境变量(UNIX(TM))
CPFIRST 环境变量指定 C 预处理器在所有的 GBase 8s ESQL/C 文件上在 GBase 8s
ESQL/C 预处理之前运行。
将此环境变量设置为 TRUE(仅限大写)以在所有的 GBase 8s ESQL/C 源文件上运
行 C 预处理器,
而不管 -cp 选项是否传递给 esql 命令,
无论源文件是否具有 .ec 或 .ecp
扩展名。
使用 eprotect.exe 应用程序(Windows(TM))
Windows™ 用户可使用 eprotect.exe 实用程序在 GBase 8s ESQL/C 源文件上运行预
处理器。
eprotect.exe 实用程序保护所有的 SQL 关键字不被 C 预处理器解析。eprotect.exe -u
选项移除 SQL 关键字的保护。
要更改 Windows 上 GBase 8s ESQL/C 源文件的预处理器顺序:
运行以下命令:
%GBASEDBTDIR%\lib\eprotect.exe filename.ec filename.c
该命令保护所有的 SQL 关键字不被 C 预处理器解析并将结果写到 filename.c 文
件中。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 59 -

运行以下命令:
cl /E filename.c > filename2.c
该命令在源文件 filename.c 上运行 C 预处理器,并将结果写到 filename2.c 文件
中。
运行以下命令:
%GBASEDBTDIR%\lib\eprotect.exe -u filename2.c filename.ec
该命令移除 SQL 关键字保护并将结果存储到 filename.ec 中。
在源文件上运行 esql 并编译它
C 预处理器首先运行时的编译顺序
当用户选择在 GBase 8s ESQL/C 预处理器之前在源文件上运行 C 预处理器时,
该文
件将经历一些编译顺序。
在源文件上运行 eprotect 实用程序以保护所有的 SQL 关键字不被 C 预处理器解析。

在源文件上运行 C 预处理器。
eprotect 实用程序使用 -u 模式在 C 预处理器的输出上运行,
以删除 SQL 关键字的
保护。
GBase 8s ESQL/C 预处理器在 C 预处理器的输出上运行,它不再具有任何 SQL 关
键字保护。
GBase 8s ESQL/C 预处理程序的输出由 C 编译器和链接器进行编译和链接,以生成
可执行文件。
定义基于 C #defines 和 typedefs 的主机变量
当在源文件上运行 C 预处理器,
它会扩展源文件中包含的所有 C 头文件的内容。

扩展使得可以根据 C 头文件中的类型和 #define 和 typedef 语句在 GBase 8s ESQL/C
源文件中使用主机变量。
这里给出的示例表示共享头文件的一些优点。
在以下示例中,
GBase
8s ESQL/C 和 C 源文件使用同一 C 头文件。
图: 共享 C 头文件的 ESQL/C 和 C 摘录
/*header file i.h*/
#define LEN 15
typedef struct customer_t{
int c_no;
char fname[LEN];
char lname[LEN];
} CUST_REC;


/*cust.ec*/
#include

EXEC SQL BEGIN DECLARE SECTION;

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 60 -

#include "i.h"
EXEC SQL END DECLARE SECTION;

int main()
{

EXEC SQL BEGIN DECLARE SECTION;
CUST_REC cust;
EXEC SQL END DECLARE SECTION;


}


/*name.c*/
#include “i.h”
int main ()
{...
CUST_REC cust;


}
在以下示例中,GBase 8s ESQL/C 源文件包含基于在 time.h 系统头文件中定义的类
型的主变量。
图: 使用 C 系统头文件中定义的类型的主机变量的 ESQL/C 摘录
/*time.ec*/

#include

main ()
{...
EXEC SQL BEGIN DECLARE SECTION;
time_t time_hostvar;
EXEC SQL END DECLARE SECTION;


}
C 头文件可以包含在 GBase 8s ESQL/C 源文件中的任何地方。
但是,
要基于 C 头文
件中定义的 #defines 和 typedefs 的 GBase 8s ESQL/C 文件中定义主机变量,必须在
EXEC SQL 声明部分包含 C 头文件。
对比图 3中的示例,导致错误 -33051: Syntax error on identifier or symbol
‘name_hostvar 其中图 1 中的示例不会。唯一的区别是,在图 1的示例中,具有
#define 的 C 头文件和在 EXEC SQL 声明部分中使用的 typedef 包含在该声明部分中。

图: 根据包含在声明部分之外的 C 头文件定义主机变量的 ESQL/C 摘录

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 61 -

/*header file i.h*/
#define LEN 15
typedef struct customer_t{
int c_no;
char fname[LEN];
char lname[LEN];
} CUST_REC;


/*cust.ec*/
#include "i.h"

int main()
{

EXEC SQL BEGIN DECLARE SECTION;
CUST_REC cust;


}


...Leads to error -33051...
在 EXEC SQL 声明部分中允许所有有效的 C 声明语法
当 GBase 8s ESQL/C 预处理器在文件上运行时,它会扩展 GBase 8s ESQL/C 源文件
中头文件的所有内容,
其中头文件包含在源文件中。
因此,
在 EXEC SQL 声明部分中包含
C 头文件的一个后果是,在它们通过 C 预处理器之后,所有类型的 C 声明语法都包含在
EXEC SQL 声明部分中。
现在,
您可以在 EXEC SQL 声明部分的 EXEC SQL 声明部分中
包含所有有效的 C 声明语法。
但是,
您只能根据主机变量数据类型中描述的某些类型声明
主机变量。
移除 C 头文件中的语句
如果 GBase 8s ESQL/C 预处理器在 C 头文件中存在某些语句的问题,
可以从 GBase
8s ESQL/C 预处理器执行的预处理中排除特定行。如下所示:
图: 使用通用 C 头文件的 ESQL/C 和 C 摘录
/*header file i.h*/
#ifndef ESBDS /*define empty macros, if included by a C\
source*/
#define ESBDS
#define ESEDS
#endif


ESEDS
statement that you do not want ESQL/C preprocessor to see
ESBDS

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 62 -



/*name.ec*/
#define ESBDS “EXEC SQL BEGIN DECLARE SECTION;”
#define ESEDS “EXEC SQL END DECLARE SECTION”
main ()
{...
EXEC SQL BEGIN DECLARE SECTION;
#include “i.h”
EXEC SQL END DECLARE SECTION;


}
SQL 关键字保护
如果 GBase 8s ESQL/C 文件中的代码在传递给 GBase 8s ESQL/C 预处理器之前未
保护地传递给 C 预处理器,则 C 预处理器可能解析某些 SQL 关键字。在以下示例中,
SQL 关键字 NULL 由值为零的 C 预处理替代,
该预处理器将创建了一个有效的 SQL 语
句,但是将一个值插入到 orders 表中,而不是程序员预期的值:
EXEC SQL insert into orders (shipcharge) values (NULL);
当用户提供在 GBase 8s ESQL/C 预处理器之前运行 C 预处理器的选项时,
实用程序
eprotect 在 GBase 8s ESQL/C 源文件上运行 C 预处理器之前运行。eprotect 实用程序向
前缀为 SQLKEYWORD_ 的 SQL 语句中发生的任何 SQL 关键字添加前缀。这个前
缀附在 SQL 语句中所有 SQL 关键字的上,以 EXEC SQL 指令开头,并以分号为结尾。
当包含前面提到的 select 语句 GBase 8s ESQL/C 源文件传递给 C 预处理器时,SELECT
语句具有以下格式:
EXEC SQL SQLKEYWORD_insert SQLKEYWORD_into orders (order_num)
SQLKEYWORD_values (SQLKEYWORD_NULL);
C 预处理器在 GBase 8s ESQL/C 源文件中运行后,esql 命令使用 -u 模式运行
eprotect 实用程序,在它在 C 预处理器的输出上运行 GBase 8s ESQL/C 预处理器之前删
除所有的 SQLKEYWORD_ 前缀。
SQL 关键字保护和美元符号($)
GBase 8s ESQL/C 源文件中的所有的 SQL 语句可以以 EXEC SQL 关键词开头或者
使用 $ 前缀。以下所有对语句都是等效的:
EXEC SQL BEGIN DECLARE SECTION;
$BEGIN DECLARE SECTION;

EXEC SQL connect to ‘database9’;
$connect to ‘database9’;

EXEC SQL select fname into :hostvar1 from table1;
$ select fname into :hostvar1 from table1;
但是,$ 符号还可以出现在 typedef 定义的开头,如下所示:

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 63 -

$int *ip = NULL;
在诸如前面的 typedef 示例的情况中,
程序逻辑可能需要 C 预处理器将值替换为关
键字 NULL 值。
在这种情况下,
不允许 C 预处理器进行值替换将导致错误。
因此,
eprotect
实用程序不会在以美元符号($)开头的 SQL 语句中显示的 SQL 关键字上的
SQLKEYWORD_ 前缀添加前缀。
重要: 如果要在 GBase 8s ESQL/C 预处理器之前在 GBase 8s ESQL/C 源文件上运
行 C 预处理器,并且如果不希望 C 预处理器在源文件中发生的 SQL 语句中替换 SQL
关键字的值。您必须使用关键字EXEC SQL 开始的每个语句,而不是使用美元符号($)。

特定于 Windows(TM) 环境的预处理器选项
如果在 Windows™ 环境中使用 GBase 8s ESQL/C,则可以使用以下其它预处理器选
项。
自动换行
GBase 8s ESQL/C 预处理器将一个嵌入式 SQL 语句转换为一个 C 行。长行可能导
致以下调试和编辑的问题。
可以使用 -lw 选项告诉预处理器在特定列位置自动换行。
例如,
以下 esql 命令告诉预处理器在 75 列自动换行:
esql -lw:75 demo.ec
如果省略 -lw 选项,则预处理器不会执行自动换行。
更改错误和警告显示
缺省情况下,GBase 8s ESQL/C 预处理器当它处理 GBase 8s ESQL/C 文件时生成错
误和警告消息。它在控制台窗口显示这些错误和警告。您可以使用以下命令行选项更改错
误和警告消息显示。
使用 -nowarn 选项抑制警告消息。该选项对错误消息没有影响。
使用 -mserr 选项显示错误和警告消息(以 Microsoft™ 错误消息的格式)。以下文
本编辑可以识别此格式并使用它来转到引起错误或警告的 GBase 8s ESQL/C 源文件中的
行。
设置制表位
缺省情况下,GBase 8s ESQL/C 预处理器在每八列的位置使用制表符格式化 C 源文
件。可以使用 -ts 选项设置不同的制表位。例如,以下的 esql 命令告诉预处理器每四个
字符设置制表位:
esql -ts:4 demo.ec