赋值语句

语法

给变量赋值的语法请参见图1。

图 1 assignment_value::= 赋值语句 - 图1

对以上语法格式的解释如下:

  • variable_name:变量名。
  • value:可以是值或表达式。值value的类型需要和变量variable_name的类型兼容才能正确赋值。

示例:

1. openGauss=# DECLARE
2. emp_id  INTEGER := 7788;--赋值
3. BEGIN
4. emp_id := 5;--赋值
5. emp_id := 5*7784;
6. END;
7. /

嵌套赋值

给变量嵌套赋值的语法请参见图2。

图 2 nested_assignment_value::= 赋值语句 - 图2

对以上语法格式的解释如下:图2

  • variable_name:变量名。
  • col_name:列名。
  • subscript:下标,针对数组变量使用,可以是值或表达式,类型必须为int。
  • value:可以是值或表达式。值value的类型需要和变量variable_name的类型兼容才能正确赋值。

示例:

1. openGauss=#CREATE TYPE o1 as (a int, b int);
2. openGauss=# DECLARE
3. TYPE r1 is VARRAY(10) of o1;
4. emp_id  r1;
5. BEGIN
6. emp_id(1).a := 5;--赋值
7. emp_id(1).b := 5*7784;
8. END;
9. /

赋值语句 - 图3 须知: INTO方式赋值仅支持对第一层列赋值,且不支持二维及以上数组。

INTO/BULK COLLECT INTO

  • 将存储过程内语句返回的值存储到变量内,BULK COLLECT INTO允许将部分或全部返回值暂存到数组内部。
  • 支持返回空结果集。

语法格式

1. SELECT select_expressions INTO [STRICT] target FROM ...
2. SELECT INTO [STRICT] target expression [FROM ..]

赋值语句 - 图4 说明:

  • 通过基础 SQL 命令加INTO子句可以将单行或多列的结果赋值给一个变量(记录、行类型、标量变量列表)。
  • target参数可以是一个记录变量、一个行变量或一个有逗号分隔的简单变量和记录/行域列表。
  • STRICT选项 在开启参数set behavior_compat_options = ‘select_into_return_null’的前提下(默认未开启),若指定该选项则该查询必须刚好返回一行不为空的结果集,否则会报错,报错信息可能是NO_DATA_FOUND(没有行)、TOO_MANY_ROWS(多于一行)或QUERY_RETURNED_NO_ROWS (没有数据返回)。若不指定该选项则没有该限定,且支持返回空结果集。

示例:

1. openGauss=# DECLARE
2. my_id integer;
3. BEGIN
4. select id into my_id from customers limit 1; -- 赋值
5. END;
6. /

8. openGauss=# DECLARE
9. type id_list is varray(6) of customers.id%type;
10. id_arr id_list;
11. BEGIN
12. select id bulk collect into id_arr from customers order by id DESC limit 20; -- 批量赋值
13. END;
14. /

16. openGauss=# CREATE TABLE test(a integer);
17. openGauss=# CREATE OR REPLACE FUNCTION check_test() RETURNS integer
18. language plpgsql
19. AS $function$
20. DECLARE
21. b integer;
22. BEGIN
23. SELECT INTO b a FROM test WHERE a=1; -- 返回空结果集
24. RETURN b;
25. END;
26. $function$;
27. openGauss=# SELECT check_test();
28. check_test
29. ------------

31. (1 row)

赋值语句 - 图5 须知:

  • 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不支持返回空结果集。
  • 给多个变量赋值时,由于后面的变量存在语法错误,所以均不赋值。
  • 不支持分布式。