
# 赋值语句
#### 变量语法
给变量赋值的语法请参见[图1]。
图1assignment_value::=   
![](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/figure/zh-cn_image_0000002235102925.png "点击放大")
对以上语法格式的解释如下：
- variable_name：变量名。
- value：可以是值或表达式。值value的类型需要和变量variable_name的类型兼容才能正确赋值。
示例：
```
gaussdb=# 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]。
图2nested_assignment_value::=   
![](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/figure/zh-cn_image_0000002235223089.png "点击放大")
对以上语法格式的解释如下：[图2]
- variable_name：变量名。
- col_name：列名。
- subscript：下标，针对数组变量使用，可以是值或表达式，类型必须为int。
- value：可以是值或表达式。值value的类型需要和变量variable_name的类型兼容才能正确赋值。
示例：
```
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
```
![](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
INTO方式赋值仅支持对第一层列赋值，且不支持二维及以上数组。
#### INTO/BULK COLLECT INTO
- 将存储过程内语句返回的值存储到变量内，BULK COLLECT INTO允许将部分或全部返回值暂存到数组内部。
- 支持返回空结果集。
 
#### 语法格式
```
SELECT select_expressions INTO [STRICT] target FROM ...
SELECT INTO [STRICT] target expression [FROM ..]
```
![](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 通过基础 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只支持在A兼容性数据库下使用。
 
示例：
```
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 a FROM test WHERE a=1; -- 返回空结果集
            RETURN b;
    END;
    $function$;
gaussdb=# SELECT check_test();
 check_test 
------------
          1
(1 row)
gaussdb=# DROP TABLE customers；
DROP TABLE
gaussdb=# DROP TABLE test；
DROP TABLE
```
![](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
- 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不支持返回空结果集。
- 给多个变量赋值时，由于后面的变量存在语法错误，所以均不赋值。
 
