返回首页

gbase数据、南大通用产品文档:GBase8sBIGINT 和 BIGSERIAL 数据类型

更新日期:2024年09月11日

BIGINT 和 BIGSERIAL 数据类型与 INT8 和 SERIAL8 数据类型有相同的值域。然而,
BIGINT 和 BIGSERIAL 比 INT8 和 SERIAL8 更利于存储和计算。
BIGINT 和 BIGSERIAL 数据类型都映射至 java.sql.Types 类中的 BIGINT Java™ 类型。当
从数据库检索数据时,BIGINT 和 BIGSERIAL 数据类型映射至 long Java 类型。
通过 getBigSerial() ,GBase 8s JDBC Driver 提供对 GBase 8s BIGSERIAL 和 BIGINT 数据
类型的支持,其为 java.sql.Statement 接口的一部分。
由于 BIGSERIAL 和 BIGINT 数据类型没有向来自 java.sql.Types 类的 JDBC API 数据类
型的明显映射,因此,您必须将特定于 GBase 8s 的类导入至 Java 程序,来处理
BIGSERIAL 和 BIGINT 列。要这么做,请将下列导入行添加至 Java 程序:
import com.gbasedbt.jdbc.*;
在 INSERT 语句之后,请使用 getBigSerial() 方法来返回插入至表的 BIGSERIAL 或
BIGINT 列内的值。
如果您想要使用 getBigSerial() 方法,
则必须将 Statement 或 PreparedStatement 对象强制转型
为 IfmxStatement,
其为特定于 GBase 8s的 Statement 接口的实现。
下列示例展示如何执行强
制转型:
cmd = "insert into serialTable(i) values (100)";
stmt.executeUpdate(cmd);
System.out.println(cmd+"...okay");
int serialValue = ((IfmxStatement)stmt).getSerial();
System.out.println("serial value: " + serialValue);
这些类型是 com.gbasedbt.lang.IfxTypes 类的一部分。要了解 IfxTypes 常量和对应的 GBase
8s 数据类型,请参阅 IfxTypes 类 表。

内容可同sqlhosts.cm1

GBase 8s 共享存储集群安装手册
南大通用数据技术股份有限公司 - 12 -

使用 EXECUTE FUNCTION 语句来调用用户定义的函数或返回值的内建例程。
该语句是对 SQL 的 ANSI/ISO 标准的扩展。
语法

元素
描述
限制
语法
function 要执行的用户定
义函数的名称
必须在数据库中注册
数据库对象

SPL_var 包含要执行的
SPL 例程名称的
变量
必须为包含现有 SPL 函数的非
NULL 名称的 CHAR、VARCHAR、
NCHAR 或 NVARCHAR 数据类型
标识符
用法
EXECUTE FUNCTION 语句以参数调用用户定义函数(UDF),并指定结果要返
回到哪里。
外部的 C 或 Java™ 语言函数仅返回一个值。
SPL 函数可返回一个或多个值。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 606
您不可使用 EXECUTE FUNCTION 语句来调用不返回值的任何类型的用户定义
过程。而是使用 EXECUTE PROCEDURE 或 EXECUTE ROUTINE 语句来执行
过程。
您必须对用户定义函数拥有 Execute 权限。
要获取更多信息,请参阅 GRANT 语句。
在支持隐式事务的符合 ANSI/ISO 的数据库中,在缺省情况下,EXECUTE
FUNCTION 不开启新的事务。然而,被调用函数内的 SQL 语句可开启新的事
务。
否定函数及其伴随函数
如果返回 BOOLEAN 值的 UDF 有伴随函数,则执行该函数的任何用户必须对
该函数及其伴随函数都有 Execute 权限。例如,如果函数有否定函数,则执行该
函数的任何用户都必须对该函数及其否定函数 都有 Execute 权限。此外,伴随函
数必须与其否定函数有相同的所有者。
要获取关于如何将 UDF 指定为其否定函数的伴随函数的信息,请参阅
NEGATOR。
EXECUTE FUNCTION 语句的工作机制
对于要随同 EXECUTE FUNCTION 语句执行的用户定义的函数(UDF),必须
存在下列条件:

限定的函数名称或函数特征符(带有参数列表的函数名称),在名称空间
或数据库内必须是唯一的。

在当前数据库中,该函数必须存在。
如果 EXECUTE FUNCTION 指定的参数少于用户自定义的函数预期,则未指定
的参数称为丢失的。将丢失的参数初始化为它们相应的缺省值,如果已经定义了
这些缺省值。在 例程参数列表 中描述为参数指定缺省值的语法。
在下列条件下,EXECUTE FUNCTION 返回错误:

EXECUTE FUNCTION 指定的参数多于 UDF 预期。

丢失一个或多个参数,且没有缺省值。

完全限定的函数名称或函数特征符不是唯一的。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 607

找不到指定名称的函数或您指定的特征符。

EXECUTE FUNCTION 尝试调用用户定义的过程。
如果在数据库内 function 名称不唯一,则必须指定足够的 parameter_type 信息
来明确该名称。要获取更多关于调用函数时如何指定参数的信息,请参阅 参数
一节。
在一些 DDL 语句中,外部 UDR 的 specific name 有效,但在调用该函数的上
下文中无效。
如果 GBase 8s 不可解析模糊的函数名称,该名称的特征符不同于仅在未命名
ROW 类型参数中的另一例程的特征符,则返回错误。(当定义该模糊函数时,
数据库服务器不可预料到该错误。)
INTO 子句
INTO 子句

元素
描述
限制
语法
data_structure
声明为主变量的结构 结构的单个元素必须
与返回值的数据类型
兼容
特定于语

data_var
用于接收用户定义的
函数返回值的变量
请参阅 数据变量。
特定于语

indicator_var
如果相应的
data_var 收到 NULL
值,则用于存储返回
码的程序变量
如果相应的 data_var
可能为 NULL,则使用
指示符变量
特定于语


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 608
您必须随同 EXECUTE FUNCTION 包括 INTO 子句来指定接收用户定义的函数
返回值的变量。如果该函数返回值多于一个,则这些值以您指定的顺序返回到变
量列表中。
如果 EXECUTE FUNCTION 语句独立(即,它不是 DECLARE 语句的一部分且不使用
INTO 子句),则它必须执行非游标函数。 非游标函数仅返回一行值。下列示例
展示 GBase 8s ESQL/C 中的 SELECT 语句:
EXEC SQL EXECUTE FUNCTION
cust_num(fname, lname, company_name) INTO :c_num;
数据变量
如果您在 GBase 8s ESQL/C 程序内发出 EXECUTE FUNCTION 语句,则
data_var 必须为主变量。在 SPL 例程内,data_var 必须为 SPL 变量。
如果您在 CREATE TRIGGER 内发出 EXECUTE FUNCTION 语句,则 data_var
必须为触发器表中或另一表中的列名。
带有指示符变量(ESQL/C)的 INTO 子句
如果存在从用户定义的函数返回的数据为 NULL 的可能性,则您应使用指示符变
量。要获取更多关于指示符变量的信息,请参阅 GBase 8s ESQL/C 程序员手册。
带有游标的 INTO 子句
如果 EXECUTE FUNCTION 调用返回多行值的 UDF,则它必须执行游标函数。
游标函数可返回一行或多行值,且必须与要执行的函数游标相关联。
如果 SPL 函数返回多于一行,或返回集合数据类型,则您必须以游标访问这些行
或集合元素。
要返回多于一行值,必须将一个外部函数(用 C 或 Java™ 语言编写)定义为迭
代函数。要获得关于迭代函数的更多信息,请参阅 GBase 8s DataBlade API 程序
员指南。
在 SPL 例程中,如果 SELECT 返回多于一行,则您必须使用 FOREACH 语句
来逐个地访问这些行。SELECT 语句的 INTO 子句可存储取得的值。要获取更多
信息,请参阅 FOREACH。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 609
要返回多行值,SPL 函数必须在其 RETURN 语句中包括 WITH RESUME 关键
字。关于如何写 SPL 函数的更多信息,请参阅 GBase 8s SQL 教程指南。
在 GBase 8s ESQL/C 程序中,DECLARE 语句可声明函数游标,且 FETCH 语句可
从游标逐个地返回行。 您可将 INTO 子句放在 EXECUTE FUNCTION 语句中或放在
FETCH 语句中,但您不可两个都放。下列 GBase 8s ESQL/C 代码示例展示您可
使用 INTO 子句的不同方法:

使用 EXECUTE FUNCTION 语句中的 INTO 子句:
EXEC SQL declare f_curs cursor for
execute function get_orders(customer_num)
into :ord_num, :ord_date;
EXEC SQL open f_curs;
while (SQLCODE == 0)
EXEC SQL fetch f_curs;
EXEC SQL close f_curs;
使用 FETCH 语句中的 INTO 子句:
EXEC SQL declare f_curs cursor for
execute function get_orders(customer_num);
EXEC SQL open f_curs;
while (SQLCODE == 0)
EXEC SQL fetch f_curs into :ord_num, :ord_date;
EXEC SQL close f_curs;
PREPARE ... EXECUTE FUNCTION ... INTO 的备用选择
在 ESQL/C 中,您不可准备包括 INTO 子句的 EXECUTE FUNCTION 语句。然
而,对于类似的功能,请遵循这些步骤:
1. 准备不带有 INTO 子句的 EXECUTE FUNCTION 语句。
2. 为准备好的语句声明函数游标。
3. 打开游标。
4. 执行带有 INTO 子句的 FETCH 语句来将返回值放到程序变量内。
作为备用选择,您可执行下列操作:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 610
1. 为未首先准备语句的 EXECUTE FUNCTION 语句声明游标,并在声明游
标时在 EXECUTE FUNCTION 中包括 INTO 子句。
2. 打开游标。
3. 不使用 FETCH 语句的 INTO 子句,从游标访存返回的值。
SPL 函数的动态例程名称规范
动态例程名称规范简化 SPL 函数的编写,该函数调用另一个直到运行时才知道其
名字的 SPL 例程。要在 EXECUTE FUNCTION 语句中指定 SPL 例程的名称,
而不是罗列 SPL 例程的显示名称,则可使用 SPL 变量来保留例程名称。要了解
更多关于如何动态地执行 SPL 函数的信息,请参阅 GBase 8s SQL 教程指南。