GaussDB-赋值语句

68 阅读2分钟

GaussDB-赋值语句

变量语法

给变量赋值的语法如图1所示。

图1 assignment_value::=

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

  • 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

| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

#### 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://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/c0f3814b5a664567997b61530425bdf2~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771844932&x-signature=ljfWLxDrTBtL7kRWpcJYHqByWew%3D)

-   BULK COLLECT INTO只支持批量赋值给数组类型,合理使用LIMIT字段避免操作过量数据导致性能下降。
-   INTO/BULK COLLECT INTO只支持4层以下Record类型直接嵌套。
-   对于数组变量,小括号()将优先识别为下标,因此对于带括号的表达式,不支持写在数组变量后面。如对于SELECT (1+3) INTO va(5),不支持写为SELECT INTO va(5) (1+3)或SELECT INTO va[5] (1+3)。
-   BULK COLLECT INTO 只支持在ORA兼容性数据库下使用。
-   IMMEDIATE关键字仅用作语法兼容,无实际意义。

#### 示例

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 id_arr int[]; BEGIN select id bulk collect into id_arr from customers order by id DESC limit 20; -- 批量赋值 END; / ANONYMOUS BLOCK EXECUTE gaussdb=# DECLARE id_arr int[]; 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


更多详情请参考GaussDB 文档中心:<https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/productdesc/qlh_03_0001.html>