# 赋值语句
#### 变量语法
给变量赋值的语法如[图1]所示。
图1assignment_value::=   
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002793707867.png "点击放大")
对以上语法格式的解释如下：
- variable_name，为变量名。
- value，可以是值或表达式。值value的类型需与变量variable_name的类型兼容才能正确赋值。
 
#### 变量赋值示例
```
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
```
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
在打开GUC参数（即SET behavior_compat_options = 'proc_outparam_override';）后，赋值语句的值value不支持返回类型为复合类型或数组类型的重载函数以引用字段的形式调用（例如func(x).a或func(x)\[1\]）。
#### 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（没有数据返回）。若不指定该选项，则没有该限定，且支持返回空结果集。
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- BULK COLLECT INTO只支持批量赋值给数组或集合类型，合理使用LIMIT子句避免操作过多数据导致性能下降。
- INTO/BULK COLLECT INTO只支持4层以下Record类型直接嵌套。
- 返回空结果集需要数据库初始化使用PG兼容参数，配置GUC参数behavior_compat_options = 'select_into_return_null' 为开启。配置GUC参数behavior_compat_options = ''则关闭。
- 对于数组变量，小括号()将优先识别为下标，因此对于带括号的表达式，不支持写在数组变量后面。如对于SELECT (1+3) INTO va(5)，不支持写为SELECT INTO va(5) (1+3)或SELECT INTO va\[5\] (1+3)。
- BULK COLLECT INTO 只支持在ORA兼容性数据库下使用。
- IMMEDIATE关键字仅用作语法兼容，无实际意义。
- 存储过程内SELECT INTO数据放入指定的输出变量中，当输出变量的个数大于实际查询结果集合的数据列时，会给多出的变量赋空值，不会产生报错；当输出变量的个数小于实际游标查询结果集合的数据列时，多余的列将被静默丢弃，不会产生报错。
 
#### 示例
```
gaussdb=# DROP TABLE IF EXISTS customers;
gaussdb=# CREATE TABLE customers(id int,name varchar);
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=#  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
```
