声明语法
功能描述
声明存储过程使用的变量。
注意事项
- 存储过程的变量必须先声明后使用。但存在一种特例,即使用FOR循环遍历游标时,FOR循环中的循环变量(index_name)可直接使用,无需在使用前进行变量声明。
- 当前GaussDB 100的声明语法就是定义具体的变量。在后续函数、存储过程、匿名块和触发器的实现块中,查找变量时以存储过程定义的变量为第一优先级。
- 存储过程定义的变量名必须使用合法的标识符,禁止使用关键字或者数字。
- 声明普通变量时,支持的数据类型请参考数据类型。普通变量可以指定缺省值。
- SYS_REFCURSOR是一个系统游标,可用于直接声明一个系统游标变量。其效果等价于先使用“TYPE type_name1 IS REF CURSOR”语句定义一个REF游标类型,再使用该REF游标类型声明一个游标变量。
- 游标变量目前实现均为弱数据类型相关,不支持在游标类型的定义语句中使用“RETURN return_type”子句指定返回结果的数据类型,而是以游标打开的行记录的数据类型为准。
- 声明记录类型时,该记录各字段的数据类型可以是基础数据类型,也可以是记录类型,但不支持游标类型。
- 使用TYPE语句只是定义一个游标类型或一个记录类型,不会生成真正的变量。只有使用已声明的游标类型或记录类型声明一个变量时,才会生成对应的变量。
语法格式
- 声明普通变量及其默认值。
DECLARE variant_name data_type [ { := | DEFAULT } default_expr];
- 声明系统游标变量。
DECLARE cursor_name SYS_REFCURSOR;
- 定义一个游标类型并声明一个该类型变量。
DECLARE TYPE type_name1 IS REF CURSOR; ref_cursor_name type_name1;
- 定义一个记录类型并声明一个该类型变量。
DECLARE TYPE type_name2 IS RECORD ( field_name data_type [,...] ); rec_name type_name2;
参数说明
- variant_name
变量名。
- data_type
参数的数据类型。可用类型参考数据类型。
- DEFAULT default_expr
指定变量的默认值。默认值可以是常量或运算表达式。
- cursor_name
声明的系统游标变量的名称。
- SYS_REFCURSOR
使用该关键字表示声明的游标为系统游标。
- TYPE type_name1 IS REF CURSOR
定义一个游标类型。type_name1是定义的游标类型的名称。
- ref_cursor_name type_name1
使用自定义的游标类型定义一个游标变量。与“TYPE type_name1 IS REF CURSOR”结合使用。
- TYPE type_name2 IS RECORD ( field_name data_type [,...] )
定义一个记录类型。type_name2是定义的记录类型的名称。
- rec_name type_name2
使用自定义的记录类型定义一个记录变量。与“TYPE type_name2 IS RECORD ( field_name data_type [,... ] )”结合使用。
示例
- 准备数据(创建一张名为test的表,并插入一行数据)。
--删除已存在的同名表。 DROP TABLE IF EXISTS test;
--创建表test。 CREATE TABLE test(f_int1 INTEGER,f_int2 INTEGER, f_int3 INTEGER, f_bigint1 BIGINT, f_bigint2 BIGINT, f_bigint3 BIGINT, f_bool1 INTEGER, f_bool2 INTEGER, f_num1 NUMBER(38, 0),f_num2 NUMBER(38, 0), f_dec1 DECIMAL(38, 0), f_dec2 DECIMAL(38, 0), f_num10 NUMBER(38, 10), f_dec10 DECIMAL(38, 10), f_float FLOAT,f_double DOUBLE, f_real REAL, f_char1 CHAR(128),f_char2 CHAR(128), f_varchar1 VARCHAR(512),f_varchar2 VARCHAR2(512), f_date1 DATE, f_date2 DATE, f_time DATE, f_timestamp TIMESTAMP);
--向表test中插入记录。 INSERT INTO test VALUES(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,'a','b','c','d','2017-01-01','2017-01-01','2017-01-01','2017-01-01'); --提交事务。 COMMIT;
- 声明普通变量(以粗体显示)。
DECLARE f_int1 INTEGER; f_int2 INTEGER; f_int3 INTEGER; f_bigint1 BIGINT; f_bigint2 BIGINT; f_bigint3 BIGINT; f_bool1 INTEGER; f_bool2 INTEGER; f_num1 NUMBER(38, 0); f_num2 NUMBER(38, 0); f_dec1 DECIMAL(38, 0); f_dec2 DECIMAL(38, 0); f_num10 NUMBER(38, 10); f_dec10 DECIMAL(38, 10); f_float FLOAT; f_double DOUBLE; f_real REAL; f_char1 CHAR(128); f_char2 CHAR(128); f_varchar1 VARCHAR(512); f_varchar2 VARCHAR2(512); f_date1 DATE; f_date2 DATE; f_time DATE; f_timestamp TIMESTAMP; BEGIN SELECT * INTO f_int1,f_int2,f_int3,f_bigint1,f_bigint2,f_bigint3,f_bool1,f_bool2,f_num1,f_num2,f_dec1,f_dec2,f_num10,f_dec10,f_float,f_double,f_real,f_char1,f_char2,f_varchar1,f_varchar2,f_date1,f_date2,f_time,f_timestamp from test; DBMS_OUTPUT.PUT_LINE('f_int1 is ' || f_int1 ); DBMS_OUTPUT.PUT_LINE('f_int2 is ' || f_int2 ); DBMS_OUTPUT.PUT_LINE('f_int3 is ' || f_int3 ); DBMS_OUTPUT.PUT_LINE('f_bigint1 is ' || f_bigint1 ); DBMS_OUTPUT.PUT_LINE('f_bigint2 is ' || f_bigint2 ); DBMS_OUTPUT.PUT_LINE('f_bigint3 is ' || f_bigint3 ); DBMS_OUTPUT.PUT_LINE('f_bool1 is ' || f_bool1 ); DBMS_OUTPUT.PUT_LINE('f_bool2 is ' || f_bool2 ); DBMS_OUTPUT.PUT_LINE('f_num1 is ' || f_num1 ); DBMS_OUTPUT.PUT_LINE('f_num2 is ' || f_num2 ); DBMS_OUTPUT.PUT_LINE('f_dec1 is ' || f_dec1 ); DBMS_OUTPUT.PUT_LINE('f_dec2 is ' || f_dec2 ); DBMS_OUTPUT.PUT_LINE('f_num10 is ' || f_num10 ); DBMS_OUTPUT.PUT_LINE('f_dec10 is ' || f_dec10 ); DBMS_OUTPUT.PUT_LINE('f_float is ' || f_float ); DBMS_OUTPUT.PUT_LINE('f_double is ' || f_double ); DBMS_OUTPUT.PUT_LINE('f_real is ' || f_real ); DBMS_OUTPUT.PUT_LINE('f_char1 is ' || f_char1 ); DBMS_OUTPUT.PUT_LINE('f_char2 is ' || f_char2 ); DBMS_OUTPUT.PUT_LINE('f_varchar1 is ' || f_varchar1 ); DBMS_OUTPUT.PUT_LINE('f_varchar2 is ' || f_varchar2 ); DBMS_OUTPUT.PUT_LINE('f_date1 is ' || f_date1 ); DBMS_OUTPUT.PUT_LINE('f_date2 is ' || f_date2 ); DBMS_OUTPUT.PUT_LINE('f_time is ' || f_time ); DBMS_OUTPUT.PUT_LINE('f_timestamp is ' || f_timestamp); END; /
- 声明系统游标变量(以粗体显示)。
DECLARE b INT; c1 SYS_REFCURSOR; BEGIN OPEN c1 FOR SELECT f_int1 FROM test; FETCH c1 INTO b; DBMS_OUTPUT.PUT_LINE('result is:' || b); FETCH c1 INTO b; DBMS_OUTPUT.PUT_LINE('result is:' || b); CLOSE c1; END; /
- 声明一个名为tcur的自定义游标类型及一个名为cursor_k的游标变量(以粗体显示)。
DECLARE TYPE tcur IS REF CURSOR; cursor_k tcur; rec test%rowtype; BEGIN OPEN cursor_k FOR SELECT * FROM test; FETCH cursor_k INTO rec; CLOSE cursor_k; END; /
- 定义一个名为item_def的记录类型,并声明一个名为item的记录变量(以粗体显示)。
DECLARE TYPE item_def IS RECORD ( f_int1 integer, f_int2 integer, f_int3 integer, f_bigint1 bigint, f_bigint2 bigint, f_bigint3 bigint, f_bool1 integer, f_bool2 integer, f_num1 number(38, 0), f_num2 number(38, 0), f_dec1 DECIMAL(38, 0), f_dec2 DECIMAL(38, 0), f_num10 number(38, 10), f_dec10 decimal(38, 10), f_float float, f_double double, f_real real, f_char1 char(128), f_char2 char(128), f_varchar1 varchar(512), f_varchar2 varchar2(512), f_date1 date, f_date2 date, f_time date, f_timestamp timestamp ); item item_def; BEGIN SELECT * INTO item FROM test; DBMS_OUTPUT.PUT_LINE('item.f_int1 is ' || item.f_int1 ); DBMS_OUTPUT.PUT_LINE('item.f_int2 is ' || item.f_int2 ); DBMS_OUTPUT.PUT_LINE('item.f_int3 is ' || item.f_int3 ); DBMS_OUTPUT.PUT_LINE('item.f_bigint1 is ' || item.f_bigint1 ); DBMS_OUTPUT.PUT_LINE('item.f_bigint2 is ' || item.f_bigint2 ); DBMS_OUTPUT.PUT_LINE('item.f_bigint3 is ' || item.f_bigint3 ); DBMS_OUTPUT.PUT_LINE('item.f_bool1 is ' || item.f_bool1 ); DBMS_OUTPUT.PUT_LINE('item.f_bool2 is ' || item.f_bool2 ); DBMS_OUTPUT.PUT_LINE('item.f_num1 is ' || item.f_num1 ); DBMS_OUTPUT.PUT_LINE('item.f_num2 is ' || item.f_num2 ); DBMS_OUTPUT.PUT_LINE('item.f_dec1 is ' || item.f_dec1 ); DBMS_OUTPUT.PUT_LINE('item.f_dec2 is ' || item.f_dec2 ); DBMS_OUTPUT.PUT_LINE('item.f_num10 is ' || item.f_num10 ); DBMS_OUTPUT.PUT_LINE('item.f_dec10 is ' || item.f_dec10 ); DBMS_OUTPUT.PUT_LINE('item.f_float is ' || item.f_float ); DBMS_OUTPUT.PUT_LINE('item.f_double is ' || item.f_double ); DBMS_OUTPUT.PUT_LINE('item.f_real is ' || item.f_real ); DBMS_OUTPUT.PUT_LINE('item.f_char1 is ' || item.f_char1 ); DBMS_OUTPUT.PUT_LINE('item.f_char2 is ' || item.f_char2 ); DBMS_OUTPUT.PUT_LINE('item.f_varchar1 is ' || item.f_varchar1 ); DBMS_OUTPUT.PUT_LINE('item.f_varchar2 is ' || item.f_varchar2 ); DBMS_OUTPUT.PUT_LINE('item.f_date1 is ' || item.f_date1 ); DBMS_OUTPUT.PUT_LINE('item.f_date2 is ' || item.f_date2 ); DBMS_OUTPUT.PUT_LINE('item.f_time is ' || item.f_time ); DBMS_OUTPUT.PUT_LINE('item.f_timestamp is ' || item.f_timestamp); END; /
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」关注作者【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。评论
- 声明一个名为tcur的自定义游标类型及一个名为cursor_k的游标变量(以粗体显示)。
- 声明系统游标变量(以粗体显示)。
- 声明普通变量(以粗体显示)。
- 声明系统游标变量。