返回首页

gbase数据、南大通用产品文档:GBase8s从 SPL 例程执行游标函数

更新日期:2024年09月11日

游标函数是返回一行或多行数据的用户定义的函数,因此需要游标来执行。游标函数可为
系列函数之一:

其 RETURN 语句包括 WITH RESUME 的 SPL 函数

定义作为迭代函数的外部函数

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 321 -
游标函数的行为与 SPL 函数或外部函数都一样。然而,SPL 游标函数每迭代可返回多个
值,而外部游标函数(迭代函数)每迭代仅可返回一个值。
要从 SPL 例程执行游标函数,您必须在 SPL 例程的 FOREACH 循环中包括该函数。下
列示例展示在 FOREACH 循环中执行游标函数的不同方式:
FOREACH SELECT cur_func1(col_name) INTO spl_var FROM tab1
INSERT INTO tab2 VALUES (spl_var);
END FOREACH

FOREACH EXECUTE FUNCTION cur_func2() INTO spl_var
INSERT INTO tab2 VALUES (spl_var);
END FOREACH

字符数据类型存储字符串值。
1.内置字符类型
表 1. 内置字符数据类型的属性

大小(以字节计) 缺省值
保留
整理
长度
CHAR(n)
1 至 32,767
1 个字节

代码集
固定
NCHAR(n)
1 至 32,767
1 个字节

本地化
固定

GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 114 -


大小(以字节计) 缺省值
保留
整理
长度
VARCHAR(m, r)
1 到 32,765
对于 r 为 0
0 至
32,765
个字节
代码集
可变
NVARCHAR(m, r)
1 到 32,765
对于 r 为 0
0 至
32,765
个字节
本地化
可变
LVARCHAR(m)
1 至 32,739
2048 个字节

代码集
可变

数据库服务器还可以使用 LVARCHAR 表示不透明数据类型的外部格式。在数据库服务
器的 I/O 操作中,除文件大小限制、操作系统或硬件资源的限制之外,LVARCHAR 数据值
的大小没有上限。
2.字符类型声明中的逻辑字符语义
GBase 8s 支持配置参数 SQL_LOGICAL_CHAR,其设置可指示 SQL 解析器将 CREATE
TABLE 或 ALTER
TABLE 语句数据类型声明中字符列的最大大小解释为逻辑字符,而不是以
字节为单位。
创建数据库之后,数据库服务器的当前 SQL_LOGICAL_CHAR 设置会记录在系统目录的
systables 表中。设置为 OFF 或 1 时,该功能对随后在数据库中创建或变更的表没有影
响。
然而,在 SQL_LOGICAL_CHAR 设置为 ON 或为 2、3 或 4 之间的数字的数据库中,针
对以下字符类型,
SQL 解析器会将显式和隐式大小声明解释为 SPL 变量声明和数据库表中
的列声明中的逻辑字符:
CHAR 和 CHARACTER
CHARACTER VARYING 和 VARCHAR
LVARCHAR
NCHAR
NVARCHAR
以上所列出数据类型的 DISTINCT 类型
那些 DISTINCT 类型的 DISTINCT 类型
以上所列出类型的 ROW 数据类型字段。
以上所列出类型的 LIST、MULTISET 和 SET 元素。
此功能对之前表中列出的字符类型的最大存储大小限制没有影响。然而,对于使用多
字节语言环境的数据库,可在将字符串插入到字符列或指定给字符变量时,降低数据截断
的风险。

GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 115 -

例如,如果数据库的 SQL_LOGICAL_CHAR 设置是 4,那么 VARCHAR(10, 5) 规范会解
释为要求最大 40 个字节的存储,保留这些字节中的 5 个,在标准 SQL 表示法中创建
VARCHAR(40, 5) 数据类型,而不是声明中指定的规范。
由于多字节字符的最小大小是 1 个字节,因此 VARCHAR 和 NVARCHAR 数据类型的保
留大小参数不受 SQL_LOGICAL_CHAR 设置影响。
在此示例中,
5 多字节字符的最小大小是 5
个字节,大小保持不变。
请参阅《GBase
8s 管理员参考》中对 SQL_LOGICAL_CHAR 配置参数的描述,以获取有
关 SQL_LOGICAL_CHAR 设置对 DB_LOCALE 指定多字节语言环境的数据库的影响的更多信
息。有关多字节语言环境和逻辑字符的更多信息,请参阅《GBase 8s GLS 用户指南》。
3.IDSSECURITYLABEL
GBase
8s 还支持将 IDSSECURITYLABEL 数据类型用于实现基于标号的访问控制 (LBAC)
的系统。此内置数据类型可正式归类为字符类型,因为其定义为 VARCHAR(128) 的
DISTINCT 数据类型,
但只有拥有 DBSECADM 角色的用户可在 DDL 操作中声明此数据类型。
它支持 LBAC 安全性功能,而不是作为通用字符类型发挥功能。
4.数据类型提升
对于 GBase 8s 的一些字符串操纵操作,上面列出的五个内置字符数据类型支持数据
类型提升,
以降低由于返回的字符串太大而无法存储在 NVARCHAR 或 VARCHAR 列或程序变
量中,
从而导致字符串操作失败的风险。
请参阅 GBase
8s
SQL 指南:
语法 中的
“从 CONCAT
和 String 操纵函数返回的类型”主题,以获取在 GBase 8s 字符类型之间进行数据类型
提升的详细信息。
5.本地语言支持
有时,NCHAR 和 NVARCHAR 类型称为本地语言支持数据类型,因为其支持本地化的整
理。
由于 VARCHAR 或 NVARCHAR 类型的列没有缺省大小,
因此您必须在声明中指定大小
(不
大于 32765 )。
6.NLSCASE lNSENSITIVE 数据库
在使用 NLSCASE
INSENSITIVE 关键字选项创建的数据库中,
对 NCHAR 或 NVARCHAR 类
型数据字符串的操作不区分相同字母的大小写变体。行使用装入字符时所用字母大小写存
储在 NCHAR 或 NVARCHAR 列中,
但由相同字母以相同顺序组成的数据字符串将求值为重复,
即使某些字母的大小写不同。例如,三个 NCHAR 字符串 "ABC"、"AbC" 和 "abC" 将视为
重复。其他内置字符类型(包括 CHAR、LVARCHAR 和 VARCHAR)遵循缺省的区分大小写规
则,以便 CHAR 列中的三个相同字符串求值为不同值。
使用 NLSCASE INSENSITIVE 属性的数据库还忽略基本类型为 NCHAR 或 NVARCHAR 的
DISTINCT 数据类型的字母大小写,以及已命名或未命名 ROW 类型中的 NCHAR 或
NVARCHAR 字段、COLLECTION 数据类型的 NCHAR 或 NVARCHAR 元素,包括 LIST、SET 或

GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 116 -

MULTISET。
在不区分 NCHAR 或 NVARCHAR 值的字母大小写的数据库中,
字符串操纵操作可能会生
成意外的结果(如果它们将 CHAR、LVARCHAR 或 VARCHAR 操作数或参数隐式强制转型为
NCHAR 或 NVARCHAR 数据类型)。在一些上下文中,操作可能返回重复字符串,尽管数据
库服务器不会将这些字母大小写变体视为原始数据类型的重复值。

说明
指定字符位置脱敏函数keymask(substr,padding,pos)
功能:指定字符为初始计数位置,指定位数内脱敏功能。keymask 脱敏函数只
用于varchar/char 列进行脱敏,其他类型列使用该函数将报错返回。
参数说明如下:


参数类型
参数说明
sub
str
varchar/ch
ar
需要查找的子字符串,如:
xiaoming@gbase.cn 的substr 被设置为"@"。
注,
substr 长度不可长于被查找字符串长度,否则不
进行脱敏操作,并生成warnings

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 286
pad
ding
varchar/ch
ar
表示在查找到substr位置的之前或者之后用
于覆盖的字符串。如,"xxx"、"***"等
pos
int
0/1 覆盖方向,0 表示向前覆盖,1 表示向后
覆盖
脱敏规则如下:
1)如果在内容中未发现substr,则不做脱敏操作。并在show warnings 中看到对
应不脱敏操作的原因。如:substr ‘xxxx’is not exist in string ‘xxxxxx’。

2)
如果待查找字符串中存在多个substr,
那么只处理第一次出现的substr 的位置。

3)如果脱敏后的字符串超过字段定义的列宽,则按照pos 的值在前或在后截断。
示例
create table t(a varchar(255) masked with(function='keymas
k("@gbase","****",0)'));



示例:
create table t(a varchar(14) masked with(function='keymask
("@","*******",0)'));



create table t(a varchar(14) masked with(function='keymask
("@","***************",1)'));