返回首页

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

更新日期:2024年09月11日

使用 DEFINE 语句声明 SPL 例程使用的本地变量,或声明可由几个 SPL 例程
共享的全局变量。
语法

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

元素
描述
限制
语法
column
列名
必须已经存在于 table 或
view 中
标识符
data_type
SPL_var 的类

请参阅声明全局变量
数据类型
distinct_type
Distinct 类

必须已经在数据库中定义
数据类型
opaque_type
Opaque 类型
必须已经在数据库中定义
数据类型
SPL_var
新 SPL 变量
在语句块中必须是唯一的
标识符
synonym,
table, view
表、视图或同
义词的名称
当发出 DEFINE 时它所指向
的同义词和表或视图必须存

标识符
用法
DEFINE 语句不是可执行语句。DEFINE 语句必须出现在例程头之后,任何其它
语句之前。如果声明一个局部变量(通过使用不带 GLOBAL 关键字的

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1191
DEFINE),则它的引用作用域是定义了此局部变量的语句块。您可以在该语句块
中使用该变量。在语句块之外具有不同定义的另一个变量可有相同的名称。
具有 GLOBAL 关键字的变量在作用域中是全局的并且在语句块之外且对于其它
SPL 例程是可用的。全局变量可以是除 BIGSERIAL 、BLOB 、BYTE 、
CLOB 、SERIAL 、SERIAL8 或 TEXT 之外的任何内置数据类型。本地变量可
以是除 BIGSERIAL 、BYTE 、SERIAL 、SERIAL8 或 TEXT 之外的任何内置
数据类型。如果 column 是 BIGSERIAL 、SERIAL 或 SERIAL8 数据类型,则
声明 BIGINT 、INT 或 INT8 变量(分别地)以存储其值。
将 SQL 关键字的名称或其它数据库对象的标识符声明为 SPL 变量会在某些上下
文中产生错误或意外结果。有关涉及 SPL 变量的名称冲突的一些潜在问题的讨
论,请参阅下面的相关概念。
引用 TEXT 和 BYTE 变量
REFERENCES 关键字使您能够使用 BYTE 和 TEXT 变量。这些不包括实际数
据,但是是实际数据的指针。REFERENCES 关键字表示 SPL 变量仅仅是一个指
针。您可以使用 BYTE 和 TEXT 变量就像您使用 SPL 中的任何其它变量一
样。
重新声明或重新定义
如果您在同一语句块中将相同变量定义两次,则会收到错误消息。您可以在嵌套
块中重新定义变量,在此情况下它临时隐藏外层声明。以下示例会产生错误:
CREATE PROCEDURE example1()
DEFINE n INT; DEFINE j INT;
DEFINE n CHAR (1); -- 重定义产生错误
重新声明在以下示例中是有效的。在嵌套语句块中,n 是一个字符变量。在块之
外,n 是一个整型变量。
CREATE PROCEDURE example2()
DEFINE n INT; DEFINE j INT;
...
BEGIN
DEFINE n CHAR (1); -- character n masks global integer variable
...

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1192
END;
声明全局变量
语法:

元素
描述
限制
语法
data_type
SPL_var 的类型 请参阅 声明全局变量.
数据类型
SPL_var
新的 SPL 变量
在语句块中必须是唯一的
标识符
GLOBAL 关键字表示跟随的变量的引用作用域包含所有在给定的 DB-Access 或
SQL 管理 API 会话中运行的 SPL 例程。这些变量的数据类型必须与全局环境中
的变量数据类型相匹配。全局变量是由所有 SPL 例程使用的内存。这些例程在给
定的 DB-Access 或 SQL 管理 API 会话中运行。全局变量的值存储在内存中。
在当前会话中运行的 SPL 例程共享全局变量。因为数据库服务器不将全局变量保
存在数据库中,所有当前会话关闭时不保留全局变量。
全局变量的第一个声明建立全局环境中的变量;后续全局声明只是将该变量绑定
到全局环境并在此时建立变量的值。
以下示例显示两个 SPL 过程,proc1 和 proc2;每个过程都已定义了全局变量
gl_out:

SPL procedure proc1
CREATE PROCEDURE proc1()
...
DEFINE GLOBAL gl_out INT DEFAULT 13;
...
LET gl_out = gl_out + 1;
END PROCEDURE;

SPL procedure proc2

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1193
CREATE PROCEDURE proc2()
...
DEFINE GLOBAL gl_out INT DEFAULT 23;
DEFINE tmp INT;
...
LET tmp = gl_out
END PROCEDURE;
如果首先调用 proc1,则 gl_out 被设置为 13,然后增加为 14。如果接下来调
用 proc2,它会发现 gl_out 已被定义,这样就不应用缺省值 23 。然后,proc2
将现有值 14 分配给 tmp。如果首先调用了 proc2 ,则 gl_out 会被设置为
23,并且 23 可能被分配给 tmp。以后对 proc1 的调用将不应用缺省值 13。
不同数据库服务器实例的数据库不共享全局变量,但是在单个会话中,同一个数
据库服务器实例的所有数据库可以共享全局 SPL 变量。然而,数据库服务器和任
何应用程序开发工具都不共享全局变量。
缺省值
全局变量可以拥有文字值、NULL 值 或者系统常量缺省值。
缺省值

如果您指定缺省值,则全局变量使用指定的值初始化。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1194
CURRENT
CURRENT 是仅用于 DATETIME 变量的有效缺省值。如果 YEAR TO FRACTION(3) 是
其声明的精度,则不需要限定符。否则,当 CURRENT 是缺省值时必须指定相同的
DATETIME 限定符,如以下 DATETIME 变量的示例所示:
DEFINE GLOBAL d_var DATETIME YEAR TO MONTH
DEFAULT CURRENT YEAR TO MONTH;
SYSDATE
SYSDATE 是仅用于 DATETIME 变量的有效缺省值。如果 YEAR TO FRACTION(5) 是
其声明的精度,则不需要限定符。否则,当 SYSDATE 是缺省值时必须指定相同的
DATETIME 限定符,如以下 DATETIME 变量的示例所示:
DEFINE GLOBAL dt_var DATETIME YEAR TO DAY
DEFAULT SYSDATE YEAR TO DAY;
USER
如果使用 USER 的值,或者它的同义词 CURRENT_USER 返回的值作为缺省
值,则变量必须定义为 CHAR 、VARCHAR 、NCHAR 或 NVARCHAR 数据
类型。建议变量的长度最少为 32 个字节。如果变量长度太短而无法存储缺省
值,则在 INSERT 和 ALTER TABLE 操作期间会有得到错误消息的风险。
TODAY
如果您使用 TODAY 作为缺省值,则该变量必须是 DATE 值。(有关 TODAY
和可出现在缺省值子句中的其它系统常量的描述,请参阅常量表达式。)
BYTE 和 TEXT
对于 BYTE 或 TEXT 变量,唯一有效的缺省值是 NULL。以下示例定义称为
l_blob 的 TEXT 全局变量:
CREATE PROCEDURE use_text()
DEFINE i INT;
DEFINE GLOBAL l_blob REFERENCES TEXT DEFAULT NULL;
...

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1195
END PROCEDURE
这里需要 REFERENCES 关键字,因为 DEFINE 语句无法直接声明 BYTE 或
TEXT 数据类型;l_blob 变量是指向存储在全局环境中的 TEXT 值的指针。
SITENAME 或 DBSERVERNAME
如果您声明 SITENAME 或 DBSERVERNAME 关键字作为缺省值,则变量必须
是 CHAR 、VARCHAR 、NCHAR 、NVARCHAR 或 LVARCHAR 数据类
型。它的缺省值是数据库服务器在运行时的名称。建议该变量的大小至少为 128
个字节。如果该变量的长度太短而无法存储缺省值,则在 INSERT 和 ALTER
TABLE 操作期间会有得到错误消息的风险。
以下示例使用 SITENAME 关键字指定缺省值。该示例还将 BYTE 全局变量初始化
为 NULL:
CREATE PROCEDURE gl_def()
DEFINE GLOBAL gl_site CHAR(200) DEFAULT SITENAME;
DEFINE GLOBAL gl_byte REFERENCES BYTE DEFAULT NULL;
...
END PROCEDURE
声明本地变量
本地变量有其引用作用域,在该作用域中声明例程。如果省略 GLOBAL 关键
字,则在 DEFINE 语句中声明的任何变量都是本地变量,并且在其它 SPL 例程
中不可见。
出于此原因,声明相同名称的本地变量的不同 SPL 例程可在同一 DB-Access 或
SQL 管理 API 会话中运行而无冲突。
如果本地变量和全局变量具有相同的名称,那么全局变量在声明了本地变量的
SPL 例程中不可见。(在所有其它 SPL 例程中,只有全局变量在作用域中。)
语法:

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

元素
描述
限制
语法
column
列名
必须已经存在于 table 或 view

标识符;
data_type
SPL_var
的类型
不能是 BIGSERIAL 、BYTE 、
SERIAL 、SERIAL8 或 TEXT
数据类型
distinct_type
Distinct
类型
必须已经在数据库中定义
标识符
opaque_type
Opaque 类

必须已经在数据库中定义
标识符
SPL_var
新的 SPL
变量
在语句块中必须是唯一的
标识符;
synonym,
table, view
表、视图
或同义词
的名称
当发出此语句时它所指向的同义词
和表或视图必须存在
数据库对
象名
本地变量不支持缺省值。以下示例显示本地变量的典型定义:
CREATE PROCEDURE def_ex()

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1197
DEFINE i INT;
DEFINE word CHAR(15);
DEFINE b_day DATE;
DEFINE c_name LIKE customer.fname;
DEFINE b_text REFERENCES TEXT;
END PROCEDURE
复杂数据类型的子集
可以使用以下语法将 SPL 变量声明为已归类的或类属集合,或者已命名的、未命
名的或类属 ROW 数据类型。
复杂数据类型(子集)

元素
描述
限制
语法
data_type
集合元素的类型
或未命名的 ROW
类型字段的类型
必须与变量将存储的值的数据
类型相匹配。不能是
BIGSERIAL、 BLOB 、BYTE 、
CLOB 、SERIAL 、SERIAL8 或
TEXT。
数据类型
field
未命名的 ROW 字

必须在数据库中存在
标识符
row
已命名的 ROW 数
据类型
必须在数据库中存在
标识符

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1198
声明集合变量
类型为 COLLECTION 、SET 、MULTISET 或 LIST 的本地变量可保留取自数
据库的值的集合,您不能(使用 GLOBAL 关键字)或使用缺省值将集合变量定
义为全局(用于关键字)。
使用 COLLECTION 关键字声明的变量是可保留任何数据类型集合的未归类的
(或类属)集合变量。
已声明为 SET 、MULTISET 或 LIST 类型的变量是已归类的集合变量。它只能
保留指定的数据类型的集合。
当您定义已归类的集合变量的元素时,必须使用 NOT NULL 关键字,如下例所
示:
DEFINE a SET ( INT NOT NULL );
DEFINE b MULTISET ( ROW ( b1 INT,
b2 CHAR(50)
) NOT NULL );
DEFINE c LIST( SET( INTEGER NOT NULL ) NOT NULL );
通过变量 c,SET 中的 INTEGER 值和 LIST 中的 SET 值都被定义为 NOT
NULL。
您可以使用嵌套的复杂类型定义集合变量以保留匹配的嵌套复杂类型数据。允许
任何类型或深度的嵌套。您可以在集合类型中嵌套 ROW 类型,在 ROW 类型中
嵌套集合类型,在集合类型中嵌套集合类型,在集合和 ROW 类型中嵌套 ROW
类型,等等。
如果您将某个变量声明为 COLLECTION 类型,并且在相同的语句块中被重新指
定,则该变量获取各不相同的数据类型声明,如下例所示:
DEFINE a COLLECTION;
LET a = setB;
...
LET a = listC;
在此示例中,varA 是一个类属集合变量,它将其数据类型更改为当前指定的集合
的数据类型。第一个 LET 语句使 varA 成为 SET 变量。第二个 LET 语句使
varA 成为 LIST 变量。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1199
声明 ROW 变量
ROW 变量保留从命名的或未命名的 ROW 类型的数据。您可以定义类属 ROW
变量,已命名的 ROW 变量或未命名的 ROW 变量。
使用 ROW 关键字定义的类属 ROW 变量可以保留来自任何 ROW 类型的数
据。已命名的 ROW 变量保留来自变量声明中指定的已命名的 ROW 类型的数
据。
以下语句显示了类属 ROW 变量和已命名的 ROW 变量的示例:
DEFINE d ROW; -- generic ROW variable
DEFINE rectv rectangle_t; -- named ROW variable
已命名的 ROW 变量保留在变量声明中相同类型的已命名的 ROW 类型。
要定义一个变量(该变量将保留存储在未命名的 ROW 类型中的数据),请使用后
面跟有 ROW 类型的字段的 ROW 关键字,如:
DEFINE area ROW ( x int, y char(10) );
未命名的 ROW 类型是仅由等同结构检查的类型。如果两个未命名的 ROW 类型
具有相同的字段数量,并且具有相同的类型定义,那么这两个 ROW 类型被认为
是等同的。因此,您可以将以下 ROW 类型中任意一个访存到上面定义的变量
area 中:
ROW ( a int, b char(10) )
ROW ( area int, name char(10) )
就像 ROW 类型可以有字段一样,ROW 变量也可以有字段。要给 ROW 变量的
字段指定值,请使用限定符表示法 variableName.fieldName ,其后跟随表达
式,如以下示例中所示:
CREATE ROW TYPE rectangle_t (start point_t, length real, width real);
DEFINE r rectangle_t; -- Define a variable of a named ROW type
LET r.length = 45.5; -- Assign a value to a field of the variable
当您给 ROW 变量指定值时,可以使用任何有效的表达式。
声明 Opaque 类型变量
Opaque 类型变量保留从不透明数据类型中检索出的数据,这些不透明数据类型是
用 CREATE OPAQUE TYPE 语句创建的。不透明类型变量只能保留定义它所依

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1200
据的同一不透明类型的数据。以下示例定义 opaque 类型的变量 point,它保留
二维点的 x 和 y 坐标:
DEFINE b point;
声明变量 LIKE 列
如果使用 LIKE 子句,则数据库服务器指定变量的数据类型和表、同义词或视图
中指定列的数据类型相同。
定义为数据库列的变量的数据类型在运行时解析,因此在编译时不需要存在列和
表。
可以使用 LIKE 关键字声明某个变量类似于 serial 列,它声明:

如果列是 SERIAL 数据类型,就声明一个 INTEGER 变量

如果列是 SERIAL8 数据类型,就声明一个 INT8 变量

如果列是 BIGSERIAL 数据类型,就声明一个 BIGINT 变量
例如,如果 mytab 表中的 serialcol 列有 SERIAL 数据类型,则可以创建以下
的 SPL 函数:
CREATE FUNCTION func1()
DEFINE local_var LIKE mytab.serialcol;
RETURN;
END FUNCTION;
变量 local_var 被视为 INTEGER 变量。
使用逻辑字符语义定义变量
当为当前会话指定了 SQL_LOGICAL_CHAR 配置参数,设置为 'ON'或比 1 大的
值时, GBase 8s 在以下数据类型的 SPL 变量的声明中将大小声明解释为逻辑字
符,而不是字节:

CHAR 或 CHARACTER

CHARACTER VARYING 或 VARCHAR

LVARCHAR

NCHAR

NVARCHAR

基于内置字符数据类型的 DISTINCT 类型

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

基于之前列出的数据类型的 DISTINCT 类型

任何先前列出的数据类型的 ROW 数据类型字段

LIST 、MULTISET 或 SET 集合数据类型中的数据类型的元素
为数据库语言环境启用逻辑字符语义可确保有足够的存储空间可供数据类型存储
指定数量的逻辑字符。SPL 变量的结构字节大小是数据类型的声明大小乘以
SQL_LOGICAL_CHAR 值,如果为 2 、3 或 4 或者(如果
SQL_LOGICAL_CHAR 设置为 'ON')乘以数字的乘积的数据库语言环境的代码集
中最大的逻辑字符所需的存储字节数。
如果客户端会话连接到在创建数据库时启用了 SQL_LOGICAL_CHAR 配置参数
的数据库,则该设置将在连接时生效。
在数据类型声明中使用 LIKE 关键字的 DEFINE 语句创建其数据类型与 LIKE
规范引用的列的模式匹配的 SPL 变量。如果已定义,SQL_LOGICAL_CHAR 设
置对 DEFINE 使用 LIKE 关键字声明的变量的内存大小没有影响。
有关使用多字节代码集(如 UTF-8)的语言环境中 SQL_LOGICAL_CHAR 设置
的影响的详细信息,其中单个逻辑字符可能需要多个字节的存储,请参阅 GBase
8s 管理员参考手册中有关 SQL_LOGICAL_CHAR 配置参数的描述。有关多字节
语言环境和逻辑字符的其它信息,请参阅 GBase 8s GLS 用户指南。
声明变量为 PROCEDURE 类型
PROCEDURE 关键字表示在当前作用域中,变量是对 UDR 的调用。
DEFINE 语句不支持 FUNCTION 关键字。不管您在调用用户定义的过程还有用
户定义的函数,都使用 PROCEDURE 关键字。
将变量声明为 PROCEDURE 类型表示在当前语句作用域中,该变量不是对内置函数
的调用。例如,以下语句定义 length 作为 SPL 例程,而不是作为内置 LENGTH
函数:
DEFINE length PROCEDURE;
...
LET x = length (a,b,c)
此定义在语句块的作用域中禁用内置 LENGTH 函数。如果您已使用名称 length
创建了用户定义的例程,则将使用这样的定义。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1202
如果您使用与聚集函数(SUM 、MAX 、MIN 、AVG 、COUNT)相同的名称
或使用名称 extend 创建 SPL 例程,则必须将例程名称限制为所有者名称。
为 BYTE 和 TEXT 数据声明变量
REFERENCES 关键字表示该变量不包含 BYTE 或 TEXT 值,但是是指向
BYTE 或 TEXT 值的指针。可以如同它保存了该值一样使用此变量。
以下示例定义本地 BYTE 变量:
CREATE PROCEDURE use_byte()
DEFINE i INT;
DEFINE l_byte REFERENCES BYTE;
END PROCEDURE --use_byte
如果将 BYTE 或 TEXT 数据类型的变量传递给 SPL 例程,则该数据会传递到
数据库服务器并存储在根数据库空间或者 DBSPACETEMP 环境变量指定的数据
库空间(如果已设置)。您不需要指定保留数据的文件的位置或名称。仅需要
BYTE 或 TEXT 变量在例程中被定义时的名称。

node (172.168.83.14)
Recover begin

全局变量将它的值存储在内存中,
其他 SPL 例程可用,
由相同的用户会话运行在同一数据
库上。全局变量有下列特征:

它需要缺省值。

可在任何 SPL 例程中使用它,虽然必须在使用它的每一例程中定义它。

它将它的值从一个 SPL 例程带到另一个,直到会话结束为止。
限制: 您不可将集合变量定义为全局变量。
下图展示分享一个全局变量的两个 SPL 函数。
图: 分享一个全局变量的两个 SPL 函数。
CREATE FUNCTION func1() RETURNING INT;
DEFINE GLOBAL gvar INT DEFAULT 2;
LET gvar = gvar + 1;
RETURN gvar;
END FUNCTION;

CREATE FUNCTION func2() RETURNING INT;
DEFINE GLOBAL gvar INT DEFAULT 5;
LET gvar = gvar + 1;
RETURN gvar;
END FUNCTION;
虽然您必须定义带有缺省值的全局变量,但仅在您首次使用它时,将变量设置为缺省值。
如果您以给定的顺序在下图中执行这两个函数,则 gvar的值将为 4。
图: 全局变量缺省值。
EXECUTE FUNCTION func1();
EXECUTE FUNCTION func2();
但是,如果您以相反的顺序执行函数,如下图所示,则 gvar 的值将为 7。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 277 -

图: 全局变量缺省值。
EXECUTE FUNCTION func2();
EXECUTE FUNCTION func1();
要了解更多信息,请参阅 执行例程。