更新时间:2024-08-20 GMT+08:00
赋值语句
变量语法
给变量赋值的语法请参见图1。
对以上语法格式的解释如下:
- variable_name:变量名。
- value:可以是值或表达式。值value的类型需要和变量variable_name的类型兼容才能正确赋值。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
DECLARE emp_id INTEGER := 7788;--赋值 BEGIN emp_id := 5;--赋值 DBE_OUTPUT.PRINT_LINE(emp_id); emp_id := 5*7784; DBE_OUTPUT.PRINT_LINE(emp_id); END; / --结果如下: 5 38920 ANONYMOUS BLOCK EXECUTE |
嵌套赋值
给变量嵌套赋值的语法请参见图2。
对以上语法格式的解释如下:图2
- variable_name:变量名。
- col_name:列名。
- subscript:下标,针对数组变量使用,可以是值或表达式,类型必须为INT。
- value:可以是值或表达式。值value的类型需要和变量variable_name的类型兼容才能正确赋值。
示例:
1 2 3 4 5 6 7 8 9 10 11 |
gaussdb=# CREATE TYPE o1 AS (a int, b int); CREATE TYPE gaussdb=# DECLARE TYPE r1 is VARRAY(10) of o1; emp_id r1; BEGIN emp_id(1).a := 5;--赋值 emp_id(1).b := 5*7784; END; / ANONYMOUS BLOCK EXECUTE |
INTO方式赋值仅支持对第一层列赋值,且不支持二维及以上数组。
INTO/BULK COLLECT INTO
- 将存储过程内语句返回的值存储到变量内,BULK COLLECT INTO允许将部分或全部返回值暂存到数组内部。
- 支持返回空结果集。
语法格式
SELECT select_expressions INTO [STRICT] target FROM ... SELECT INTO [STRICT] target [FROM ..] EXECUTE [IMMEDIATE] select_expressions BULK COLLECT INTO target ...
对以上语法格式的解释如下:
- select_expressions:查询的SQL语句。通过基础SQL命令加INTO子句可以将单行或多列的结果赋值给一个变量(记录、行类型、标量变量列表)。
- target :目标变量。可以是一个记录变量、一个行变量或一个有逗号分隔的简单变量和记录/行域列表。
- STRICT:可选。在开启参数set behavior_compat_options = 'select_into_return_null'的前提下(默认未开启),若指定该选项则该查询必须刚好返回一行不为空的结果集,否则会报错,报错信息可能是NO_DATA_FOUND(没有行)、TOO_MANY_ROWS(多于一行)或QUERY_RETURNED_NO_ROWS (没有数据返回)。若不指定该选项则没有该限定,且支持返回空结果集。
- BULK COLLECT INTO只支持批量赋值给数组或集合。集合类型合理使用LIMIT字段避免操作过量数据导致性能下降。
- INTO/BULK COLLECT INTO只支持4层以下Record类型直接嵌套。
- 返回空结果集需要数据库初始化使用PG兼容参数,配置GUC参数set behavior_compat_options = 'select_into_return_null'为开启。配置GUC参数set behavior_compat_options = ''则关闭。
- 对于数组变量,小括号“()”将优先识别为下标,因此对于带括号的表达式,不支持写在数组变量后面。如对于select (1+3) into va(5),不支持写为select into va(5) (1+3)或select into va[5] (1+3)。
- INSERT INTO、UPDATE INTO、DELETE INTO和EXECUTION INTO不支持返回空结果集。
- 给多个变量赋值时,由于后面的变量存在语法错误,所以均不赋值。
- BULK COLLECT INTO只支持在A兼容性数据库下使用。
- IMMEDIATE关键字仅用作语法兼容,无实际意义。
示例:
gaussdb=# DROP TABLE IF EXISTS customers; NOTICE: table "customers" does not exist, skipping DROP TABLE gaussdb=# CREATE TABLE customers(id int,name varchar); CREATE TABLE gaussdb=# INSERT INTO customers VALUES(1,'ab'); gaussdb=# DECLARE my_id integer; BEGIN select id into my_id from customers limit 1; -- 赋值 END; / ANONYMOUS BLOCK EXECUTE gaussdb=# DECLARE type id_list is varray(6) of customers.id%type; id_arr id_list; BEGIN select id bulk collect into id_arr from customers order by id DESC limit 20; -- 批量赋值 END; / ANONYMOUS BLOCK EXECUTE gaussdb=# CREATE TABLE test(a integer); CREATE TABLE gaussdb=# INSERT INTO test VALUES(1); INSERT 0 1 gaussdb=# CREATE OR REPLACE FUNCTION check_test() RETURNS integer language plpgsql AS $function$ DECLARE b integer; BEGIN SELECT INTO b FROM test WHERE a=1; -- 返回空结果集 RETURN b; END; $function$; CREATE FUNCTION gaussdb=# SELECT check_test(); check_test ------------ 1 (1 row) gaussdb=# DECLARE TYPE id_list IS varray(6) OF customers.id%type; id_arr id_list; sql_qry varchar2(150); BEGIN sql_qry := 'SELECT id FROM customers ORDER BY id DESC LIMIT 20'; EXECUTE IMMEDIATE sql_qry BULK COLLECT INTO id_arr; -- 批量赋值 END; / ANONYMOUS BLOCK EXECUTE
父主题: 基本语句