GBase 8s SQL 指南:教程 南大通用数据技术股份有限公司 - 276 - LET x = 5; LET y = 10; LET z = x + y; --z is 15 BEGIN DEFINE x, q INT; DEFINE z CHAR(5); LET x = 100; LET q = x + y; -- q = 110 LET z = 'silly'; -- z receives a character value END LET y = x; -- y is now 5 LET x = z; -- z is now 15, not 'silly' END PROCEDURE; BEGIN 与 END 语句标记在其中定义整数变量 x 和 q 以及 CHAR 变量 z 的嵌套的语句 块。在嵌套的块内,重新定义的变量 x 掩盖原始的变量 x。在标记该嵌套的块结束的 END 语句之后,可再次访问 x 的原始值。
声明内建的数据类型的变量 声明为内建的 SQL 数据类型的变量可持有从那个内建的类型的列检索的值。您可将 SPL 变量声明为大部分内建的类型, 除了 BIGSERIAL、SERIAL 和 SERIAL8 之外,如下图所 示。 图: 内建的类型变量。 DEFINE x INT; DEFINE y INT8; DEFINE name CHAR(15); DEFINE this_day DATETIME YEAR TO DAY; 您可声明适当的整数数据类型(诸如 BIGINT、INT 或 INT8)的 SPL 变量,来存储序列 列或序列对象的值。
声明简单大对象的变量 简单大对象(TEXT 或 BYTE 对象)的变量不包含该对象本身,而是执行该对象的指针。 当您对 TEXT 或 BYTE 数据类型定义变量时,您必须在数据类型之前使用关键字 REFERENCES,如下图所示。 图: 在数据类型之前使用 REFERENCES 关键字。 DEFINE t REFERENCES TEXT; DEFINE b REFERENCES BYTE;
声明集合变量 为了保持从数据库访存的集合,变量必须为类型 SET、MULTISET 或 LIST。 重要: 必须将集合变量定义为本地变量。您不可将集合变量定义为全局变量。 SET、MULTISET 或 LIST 类型的变量是保存在 DEFINE 语句中命名的类型的集合的集合变 量。下图展示如何定义 typed 集合变量。 图: 定义 typed 集合变量。 DEFINE a SET ( INT NOT NULL );
DEFINE b MULTISET ( ROW ( b1 INT, b2 CHAR(50), ) NOT NULL );
DEFINE c LIST ( SET (DECIMAL NOT NULL) NOT NULL); 您必须始终将集合变量的元素定义为 NOT NULL。在此示例中,定义变量 a 来保存非 NULL 整数的 SET;变量 b 保存非 NULL row 类型的 MULTISET;变量 c 保存非 NULL 十进制值的非 NULL 集合的 LIST。 在变量定义中,您可在任何组合或深度中嵌套复合的类型,来与存储在您的数据库中的数 据类型相匹配。 您不可将一种类型的集合变量分配给另一类型的集合变量。例如,如果您将集合变量定义 为 SET,则您不可将另一 MULTISET 或 LIST 类型的集合变量分配给它。
SELECT customer.lname INTO lname FROM customer WHERE customer_num = 502; . . . END PROCEDURE; 变量和 SQL 函数 如果您为 SPL 变量使用与为 SQL 函数一样的标识符, 则数据库服务器假定该表达式的每 一实例都是变量,并不允许使用该 SQL 函数。在定义该变量的代码块内,您不可使用该 SQL 函数。下图中的示例展示在其中定义名为 user 的变量的 SPL 过程内的块。此定义不 允许在 BEGIN END 块中使用 USER 函数。 图: 不允许在 BEGIN END 块中使用 USER 函数的过程。 CREATE PROCEDURE user_test() DEFINE name CHAR(10); DEFINE name2 CHAR(10); LET name = user; -- the SQL function
GBase 8s SQL 指南:教程 南大通用数据技术股份有限公司 - 282 - BEGIN DEFINE user CHAR(15); -- disables user function LET user = 'Miller'; LET name = user; -- assigns 'Miller' to variable name END . . . LET name2 = user; -- SQL function again