返回首页

gbase数据、南大通用产品文档:GBase8sESQL/C 头文件

更新日期:2024年09月11日

当安装 GBase 8s ESQL/C 时,安装脚本将头文件存储在 $GBASEDBTDIR/incl/esql
目录
(在 UNIX™ 操作系统上)
和 %GBASEDBTDIR%\incl\esql 目录中
(在 Windows™ 环
境中)。
下表显示了 GBase 8s ESQL/C 产品提供的头文件。
表 1. ESQL/C 头文件
头文件
内容
其它信息
datetime.h
GBase 8s ESQL/C datetime 和 interval 结构的定
义,它们是 DATETIME 和 INTERVAL 列的主变量
时间数据类型
decimal.h
GBase 8s ESQL/C decimal 数据类型的定义,是
DECIMAL 和 MONEY 数据类型的主变量
Numeric 数据
类型
gls.h
用于 GLS 功能的函数原型和数据结构
GBase 8s
GLS 用户指

ifxtypes.h
精确映射 GBase 8s 数据类型 int1 、int2 、int4 、
mint 、mlong 、MSHORT 和 MCHAR ,用于
32 位和 64 位平台
整数主机变量
类型
locator.h
GBase 8s ESQL/C 定位器结构(ifx_loc_t 或 loc_t)
的定义,它是字节和文本列的主变量
简单大对象

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 27 -
sqlca.h
ESQL/C 用来存储错误状态代码的结构的定义
当 esql 预处理器预处理程序时,自动包含此文件。
异常处理
sqlda.h
值指针和结构定义以及动态定义变量的描述
确定 SQL 语

sqlhdr.h
该文件包含 sqlda.h 头文件、其它头文件以及函数原
型。
预处理器预处理程序时自动包含该文件。
在程序中包含
头文件
sqliapi.h
内部库 API 函数原型
仅供内部 GBase 8s ESQL/C 使用。

sqlstype.h
SQL 语句常量的定义
DESCRIBE 语句使用这些常量描述动态准备的 SQL
语句
确定 SQL 语

sqltypes.h
定义与 ESQL/C 和 SQL 数据类型相对应的常量
当程序包含 DESCRIBE 语句时,
ESQL/C 使用这些常
量。
数据类型常量
sqlxtype.h
当在 X/Open 模式时定义与 GBase 8s ESQL/C 和
SQL 数据类型相对应的常量
当程序包含 DESCRIBE 语句时,
ESQL/C 使用这些常
量。
X/Open 数据
类型常量
value.h
GBase 8s ESQL/C 使用的值结构
仅供内部 GBase 8s ESQL/C 使用。

varchar.h
可以使用 VARCHAR 数据类型的宏
字符和字符串
数据类型
下图显示了特定于 GBase 8s 的 GBase 8s ESQL/C 头文件。
表 2. GBase 8s 的 ESQL/C 头文件
头文件
内容
其它信息
collct.h
GBase 8s ESQL/C 中复杂类型的数据结构的定义
复杂数据类型

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 28 -
头文件
内容
其它信息
ifxgls.h
用于 GLS 应用程序编程接口的函数原型
仅供内部 GBase 8s ESQL/C 使用。

int8.h
存储 INT8 数据类型结构的定义
int8 数据类型
下表显示了特定于 Windows 环境的 GBase 8s ESQL/C 头文件。
表 3. Windows 环境中的 ESQL/C 头文件
头文件
内容
其它信息
sqlproto.h
所有 ESQL/C 库函数的函数原型,用于不完全符合
ANSI C 标准的源
声明函数原型
infxcexp.c
包含用于导出 ESQL 客户端接口 DLL 使用的所有 C
运行时例程的地址的 C 代码
相同运行例程的版本独
立性
login.h
InetLogin 和 HostInfoStruct 结构的定义,为应用
程序定制配置参数
因为此文件不包含 ESQL 语句,
所以不需要使用 ESQL
include 伪指令包含它。而是用 C #include 预处理器
伪指令。
InetLogin 结构的字段
声明函数原型
GBase 8s ESQL/C 提供 sqlproto.h 头文件为所有 GBase 8s ESQL/C 库函数声明函数
原型。您使用 ANSI C 编译器的 GBase 8s ESQL/C 源文件需要这些函数原。缺省情况下,
esql 命令处理器不包含函数原型声明。
使处理器包含符合 GBase 8s ESQL/C 函数的 ANSI
兼容的函数原型可以防止 ANSI C 编译器生成警告。
限制:
尽管可以使用 ANSI C 编译器,
GBase 8s ESQL/C 预处理器并不全支持 ANSI
C,因此您可能不能处理遵循 ANSI C 标准的全部程序。
因为 sqlproto.h 文件不包含任何 GBase 8s ESQL/C 语句,使用可用使用以下方法包
含此文件:
使用 GBase 8s ESQL/C include 预处理器伪指令:
EXEC SQL include sqlproto;
使用 C #include 预处理器伪指令:
#include "sqlproto.h";
在程序中包含头文件
GBase 8s ESQL/C 预处理器在程序中自动包含以下 GBase 8s ESQL/C 头文件:

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 29 -
sqlhdr.h 文件为您的 GBase 8s ESQL/C 程序提供和游标相关的结构。
该头文件自动包含 sqlda.h 和 ifxtypes.h 头文件。
sqlca.h 文件,允许您的查询检查带有 SQLSTATE 或 SQLCODE 变量的 GBase 8s
ESQL/C 语句的成功或失败。
限制: 尽管现在使用 ANSI C 编译器,GBase 8s ESQL/C 预处理器也不完全支持
ANSI C,因此可能不能处理所有遵循 ANSI C 标准的程序。
要在您的 GBase 8s ESQL/C 程序中包含任何其它头文件,必须使用 include 预处理
器伪指令。但是,如果您的程序引用头文件定义的结构或定义,则必须包含 GBase 8s
ESQL/C 头文件。例如:如果您的程序访问 datetime 数据,那么必须包含 datetime.h 头文
件,如下所示:
EXEC SQL include datetime.h;
确保使用分号结束代码行。一些其它示例如下:
EXEC SQL include varchar.h;
EXEC SQL include sqlda;
$include sqlstype;
提示: 不需要对 GBase 8s ESQL/C 头文件输入 .h 文件扩展名;esql 预处理器假
定 .h 扩展。

./gcluster_services all start

NUMA 绑定准备
检查硬件numa 支持情况:
# dmesg | grep -i numa
[

功能说明
存储过程和函数是由CREATE PROCEDURE 和CREATE FUNCTION 语句所创
建的程序。

存储过程通过CALL 语句来调用,而且只能通过输出变量得到返回值。函数
可以像其它函数一样从语句内部来调用(通过调用函数名),并返回一个标
量值。存储程序(过程和函数)也可以调用其它存储程序(过程和函数);

每个存储过程或函数都与一个特定的数据库相联系。当存储程序(过程和函
数)被调用时,隐含的USE database_name 被执行(当存储程序(过程和函

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1343
数)结束时完成),不允许在存储程序(过程和函数)中使用USE 语句。用
户能使用数据库名来限定存储程序(过程和函数)名。这可以用来指明不在
当前数据库中的存储程序(过程和函数)。例如,要调用一个与gbase 数据
库相关联的存储过程p 或函数f,用户可以使用CALL gbase.p()或gbase.f()。
当一个数据库被删除了,所有与它相关的存储程序(过程和函数)也都被删
除了;

GBase 8a MPP Cluster 可以在存储过程中使用标准的SELECT 语句。这样,
一个查询的结果简单直接地传送到客户端。
多个SELECT 语句产生多个结果
集,
所以客户端必须使用一个支持多结果集的GBase 8a MPP Cluster 客户端
库;

要创建一个存储程序(过程和函数),必须具有CREATE ROUTINE 权限。
如果用户创建了PROCEDURE | FUNCTION,那么会自动赋予用户对该PR
OCEDURE | FUNCTION 的ALTER ROUTINE 和EXECUTE 权限者。如果
开启更新日志,用户可能需要SUPER 权限;

在默认情况下,存储程序(过程和函数)与当前的数据库相关联。要显式的
将过程与数据库联系起来,那用户创建存储程序(过程和函数)时需要将它
的名字的格式写为vc_name.database_name.sp_name;

在括号中必须要有参数列表。如果没有参数,应该使用空的参数列表();默
认参数为IN 参数。如果要将一个参数指定为其它类型,则请在参数名前指
定参数类型;

使用RETURNS 子句(只有FUNCTION 才能指定RETURNS 子句)指明函
数的返回类型时,函数体中必须包含一个RETURN 语句;

如果一个存储过程或函数对同样的输入参数得到同样的结果,
则被认为它是"
确定的"(DETERMINISTIC),否则就是"非确定"的(NOT DETERMINIST
IC)。默认是NOT DETERMINISTIC;

就复制来说,使用NOW()函数(或它的同义字)或RAND()并不会生成一个
非确定性程序。对于NOW(),更新日志包括时间戳并能进行正确的复制。如
果在一个程序中只调用一次,RAND()也能正确地复制;

当前DETERMINISTIC 特性是可接受的,但并不被优化器所使用。然而,如
果更新日志被激活,
这个特性将影响到GBase 8a MPP Cluster 是否接受过程
的定义;

以下几个特征参数提供了程序的数据使用信息:

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1344
1. SQL SECURITY 参数用来指明,此程序的执行权限是赋予创建者还是调
用者。
默认的值是DEFINER。
创建者和调用者必须要有对与程序相关的数据
库的访问权。要执行存储程序(过程和函数)必须具有EXECUTE 权限,必
须具有这个权限的用户要么是定义者,要么是调用者,这依赖于如何设置S
QL SECURITY 特征;
2. COMMENT 语句是GBase 8a MPP Cluster 的扩展,可以用来描述存储过
程。可以使用SHOW CREATE PROCEDURE、SHOW CREATE FUNCTI
ON 语句来显示这些信息。

GBase 8a MPP Cluster 允许存储程序(过程和函数)包含DDL 语句(比如
CREATE 和DROP)和SQL 事务语句(比如COMMIT)。这不是标准所需
要的,只是特定的实现;

返回结果集的语句不能用在函数中。这些语句包括不使用INTO 将列值赋给
变量的SELECT 语句,
SHOW 语句等。
对于在函数定义时就返回结果集的语
句返回一个“Not allowed to return a result set from a function”错误(ER_S
P_NO_RETSET_IN_FUNC)。对于在函数运行时才返回结果集的语句,返回
“PROCEDURE%s can't return a result set in the given context”错误(ER_S
P_BADSELECT)。
语法格式
存储过程
CREATE PROCEDURE ([[,…]
[,proc_parameter_n]])
[characteristic ...] routine_body
CREATE FUNCTION ([[,…]
[,func_parameter_n]])
RETURNS
type
[characteristic ...] routine_body
Proc_parameter:
{IN | OUT | INOUT } param_name type
Func_parameter:
Param_name type

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1345
Characteristic:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
表5- 167 参数说明
字段名称
含义说明
proc_name
要创建的存储过程的名称,在同一VC 下,存储过程的名称
必须唯一。
存储过程名称只允许a~z、
A~Z、
0~9、下划线,
且不能只包含数字。
proc_parameter
定义存储过程的参数,每一个参数的定义格式是:<参数方
向><参数名称><参数数据类型>。
func_name
要创建的函数的名称,在同一VC 下,函数的名称必须唯一。
函数名称只允许a~z、A~Z、0~9、下划线,且不能只包含
数字。
func_parameter
定义函数的参数,每一个参数的定义格式是:<参数名称><
参数数据类型>。
IN | OUT | INOUT
确定参数是输入、输出还是输入输出,只能取IN、OUT、
INOUT 中的一个。
param_name
参数名称,
在同一个存储过程/函数中必须唯一,
只允许a~z、
A~Z、0~9、下划线,且不能只包含数字;
type
参数数据类型,
取值为GBase 8a MPP Cluster 支持的数据类型
LANGUAGE SQL
说明routine_body 部分是由SQL 语句组成的,SQL 是
LANGUAGE 特性的唯一值,表示当前仅支持SQL 语句。
[NOT]
DETERMINISTIC
指明存储过程执行的结果是否是确定的。
DETERMINISTIC 表示结果是确定的。
每次执行存储过程时,
相同的输入会得到相同的输出。
NOT DETERMINISTIC 表示结果是不确定的,相同的输入可
能得到不同的输出。如果没有指定任意一个值,默认为NOT
DETERMINISTIC
CONTAINS
SQL
|
NO SQL | READS
SQL
DATA
|
MODIFIES
SQL
DATA
表示子程序使用SQL 语句的限制。
CONTAINS SQL 表明子程序包含SQL 语句,
但是不包含读写
数据的语句,默认情况下,系统会指定为CONTAINS SQL;
NO SQL 表明子程序不包含SQL 语句;
READS SQL DATA:说明子程序包含读数据的语句;
MODIFIES SQL DATA 表明子程序包含写数据的语句。
SQL
SECURITY
{
DEFINER
|
INVOKER }
指明谁有权限来执行。
DEFINER 表示只有定义者才能执行,
默认情况下,
系统指定
为DEFINER ;

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1346
字段名称
含义说明
INVOKER 表示拥有权限的调用者可以执行。
COMMENT ‘string’
注释信息,可以用来描述存储过程或函数
routine_body
是一系列的SQL 语句的组合,其中包含一些数据操作以完成
一定的功能逻辑。
可以用BEGIN...END 来表示SQL 代码的开
始和结束
说明

定义存储过程时,
存储过程/函数时名称后面的括号是必需的,
即使没有任
何参数,也不能省略;

如果存储过程、
函数中的routine_body 仅包含一条SQL 语句,则可以省略
BEGIN 和END,否则,在定义存储过程/函数时,必须使用BEGIN...END
结构把相关的SQL 语句组织在一起形成routine_body;

存储过程、函数可以嵌套。
示例
下面是一个使用IN,OUT 参数的简单的存储过程的示例。这个示例在存储过程
定义前,使用delimiter 命令来把语句定界符从“;”变为“//”。这样就允许用在存储
程序体中的“;”定界符传递到服务器,而不是被解释。
注意

“DELIMITER //”语句的作用是将SQL 的结束符设置为“//”,因为默认
的语句结束符为分号“;”,为了避免与存储过程中SQL 语句结束符相冲
突,需要使用DELIMITER 改变存储过程的结束符,并以“END //”结束
存储过程。

存储过程定义完毕之后再使用“DELIMITER ;”恢复默认结束符。
DELIMITER 也可以指定其他符号为结束符。

书写时需注意:结束符前均有空格。如“DELIMITER //”和“END //”语
句的结束符//前均有空格,sql 语句的结束符前也需要有空格。
示例1:创建proce_count 存储过程,并调用。
gbase> DELIMITER //
gbase> CREATE PROCEDURE proc_count (OUT param1 INT,IN param2
VARCHAR(10))
BEGIN
SELECT COUNT(*) INTO param1 FROM ssbm.customer WHERE
c_nation= param2;
END //

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1347
Query OK, 0 rows affected
gbase> CALL proc_count(@count1,'JORDAN') //
Query OK, 0 rows affected
gbase> DELIMITER ;
gbase> SELECT @count1;
+---------+
| @count1 |
+---------+
|
1182 |
+---------+
1 row in set
说明
当使用定界符命令时,
用户应该避免使用反斜杆
(在GBase 8a MPP Cluster 中表
示转义字符)。
示例2:创建含有参数的hello 函数,使用SQL 函数执行操作并返回结果。
gbase> DELIMITER //
gbase> CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50)
RETURN CONCAT('Hello, ',s,'!'); //
Query OK, 0 rows affected
gbase> DELIMITER ;
gbase> SET @result = hello('world');
Query OK, 0 rows affected
gbase> SELECT @result;
+----------------------------------------------------+
| @result
|
+----------------------------------------------------+
| Hello, world
!
|
+----------------------------------------------------+
1 row in set
说明
如果一个函数的RETURN 语句返回的值与函数中RETURNS 子句指明的值类型
不同,返回的值强制转换为函数定义的返回值类型。

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1348
示例3:创建fn_count 函数,过程定义中包含SQL 语句。
gbase> DELIMITER //
gbase> CREATE FUNCTION fn_count (param
varchar(10)) RETURNS
INT
BEGIN
SELECT
COUNT(*)/5
INTO
@count
FROM
ssbm.customer
WHERE c_nation= param;
RETURN @count;
END //
Query OK, 0 rows affected
gbase> DELIMITER ;
gbase> SET @result = fn_count('JORDAN');
Query OK, 0 rows affected
gbase> SELECT @result;
+---------+
| @result |
+---------+
|
236 |
+---------+
1 row in set