返回首页

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

更新日期:2024年09月11日


如果需要更新一个UDF/UDAF 函数,,那么需要用户删除此UDF/UDAF 后,
同时删除引用的同一动态库(.so)的所有UDF/UDAF 函数,然后再重新创建
UDF/UDAF 函数。否则后面引用的时候可能产生宕机。

我们建议一个UDF/UDAF 函数编译时构建一个动态库(.so),以避免
UDF/UDAF 更新产生的异常。

不能使用CREATE AGGREGATE FUNCTION 创建一个已经被创建的函数。

如果需要重新创建函数,
应该用DROP FUNCTION 删除它,
然后用CREATE
AGGREGATE FUNCTION 重新创建它。例如,如果重新编译函数的一个新
版本,以便GBase 获得新版本,需要删除函数并重新创建,否则GBase 将继
续使用旧版本。

在您成功地创建并运行 SPL 例程之后,
您可遇到逻辑错误。如果例程有逻辑错误,
则请使
用 TRACE 语句来帮助查找它们。您可跟踪下列项的值:

变量

参数

返回值

SQL 错误代码

ISAM 错误代码
要生成被跟踪的值的列表,
首先请使用 SQL 语句 SET DEBUG FILE 来命名包含被跟踪的
输出的文件。当您创建 SPL 例程时,请包括 TRACE 语句。
下列方法指定 TRACE 输出的形式。
语句
操作
TRACE ON
跟踪 SQL 语句之外的所有语句。在使用变量之前,打印它们的内容。跟踪例程调
用和返回的值。
TRACE PROCEDURE
仅跟踪例程调用和返回的值。
TRACE expression
打印文字或表达式。如果必要,在将表达式的值发送至文件之前,计算它。
下图演示您可如何使用 TRACE 语句来监视 SPL 函数执行的方式。
图: TRACE 语句。
CREATE FUNCTION read_many (lastname CHAR(15))
RETURNING CHAR(15), CHAR(15), CHAR(20), CHAR(15),
CHAR(2), CHAR(5);


GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 330 -
DEFINE p_lname,p_fname, p_city CHAR(15);
DEFINE p_add CHAR(20);
DEFINE p_state CHAR(2);
DEFINE p_zip CHAR(5);
DEFINE lcount, i INT;

LET lcount = 1;

TRACE ON; -- 从此开始跟踪每个表达式
TRACE 'Foreach starts'; -- 跟踪带有文字的语句

FOREACH
SELECT fname, lname, address1, city, state, zipcode
INTO p_fname, p_lname, p_add, p_city, p_state, p_zip

FROM customer
WHERE lname = lastname
RETURN p_fname, p_lname, p_add, p_city, p_state, p_zip
WITH RESUME;
LET lcount = lcount + 1; -- 对返回的地址计数
END FOREACH

TRACE 'Loop starts'; -- 另一文字
FOR i IN (1 TO 5)
BEGIN
RETURN i , i+1, i*i, i/i, i-1,i WITH RESUME;
END
END FOR;

END FUNCTION;
使用 TRACE ON 语句,
在您每次执行被跟踪的例程时,
都将条目添加到您在 SET DEBUG
FILE 语句中指定了的文件。要查看调试条目,请使用任何文本编辑器来查看该输出文件。

下列列表包含前面的示例中函数生成的一些输出。每一被跟踪的语句之后是对它的内容的
解释。
语句
操作

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 331 -
TRACE ON
回送 TRACE ON 语句。
TRACE Foreach starts
在此情况下,跟踪表达式,文字字符串 Foreach 开始。
start select cursor
提供打开游标来处理 FOREACH 循环的通知。
select cursor iteration
提供选择游标的每一迭代的开始的通知。
expression: (+lcount, 1)
对遇到的表达式 (lcount+1) 求值为 2。
let lcount = 2
以该值回送每一 LET 语句。

在您可访问和处理简单的或嵌套的集合的个别元素之前,您必须执行下列任务:

声明集合变量来保存该集合。

声明元素变量来保存集合的个别元素。

将集合从数据库选择至集合变量内。
在您做了这些初始的步骤之后,您可将元素插入到集合内,或选择或处理已在集合中的元
素。
在下列部分中,使用 numbers 表为示例,说明每一步骤。
提示: 您可在任何 SPL 例程中处理集合。

声明集合变量
在您可从数据库将集合检索至 SPL 例程内之前,
您必须声明集合变量。
下图展示如何声明
集合变量来从 numbers 表检索 primes 列。
图: 声明集合变量。
DEFINE p_coll SET( INTEGER NOT NULL );
DEFINE 语句声明集合变量 p_coll,
其类型与存储在 primes 列中的集合的数据类型相匹配。


声明元素变量
在您声明集合变量之后,请声明元素变量来保存该集合的个别元素。元素变量的数据类型
必须与集合元素的数据类型相匹配。
例如,要保存 primes 列中 SET 的元素,请使用诸如下图所示的一种元素变量声明。
图: 元素变量声明。
DEFINE p INTEGER;
要声明保存 twin_primes 列的元素的变量,其保存嵌套的集合,请使用诸如下图所示的一种
变量声明。
图: 变量声明。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 300 -
DEFINE s SET( INTEGER NOT NULL );
变量 s 保存整数的 SET。每一 SET 是存储在 twin_primes 中的 LIST 的一个元素。

将集合选择至集合变量内
在您声明集合变量之后,您可将集合访存至它内。要将集合访存至集合变量内,请输入
SELECT INTO 语句,该语句从数据库将集合列选择至您已命名了的集合变量内。
例如,要选择保存在 numbers 的 primes 列的一行中的集合,请添加 SELECT 语句至您的
SPL 例程,诸如下图展示的一个。
图: 添加 SELECT 语句来选择存储在一行中的集合。
SELECT primes INTO p_coll FROM numbers
WHERE id = 220;
SELECT 语句中的 WHERE 子句指定您想要选择只存储在 numbers 的一行中的集合。
该语
句将集合放置到集合变量 p_coll 内,图 1 声明它。
现在,变量 p_coll 保存来自 primes 列的集合,它会包含值 SET {5,7,31,19,13}。