VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

赋值语句

语法

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

assignment_value::=

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

  • variable_name:变量名。

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

示例

DECLARE 
  emp_id  INTEGER := 7788;--赋值 
BEGIN 
  emp_id := 5;--赋值 
  emp_id := 5*7784; 
END; 
/

嵌套赋值

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

nested_assignment_value::=

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

  • variable_name:变量名。

  • col_name:列名。

  • subscript:下标,针对数组变量使用,可以是值或表达式,类型必须为int。

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

示例:

CREATE TYPE o1 as (a int, b int);
DECLARE
    TYPE r1 is VARRAY(10) of o1;
    emp_id  r1;
BEGIN
    emp_id(1).a := 5;--赋值
    emp_id(1).b := 5*7784;
END;
/

INTO 方式赋值仅支持对第一层列赋值,且不支持二维及以上数组; 引用嵌套的列值时,若存在数组下标,目前仅支持在前三层列中只存在一个小括号情况,建议使用方括号[ ]引用下标;

INTO/BULK COLLECT INTO

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

示例:

CREATE TABLE customers(id integer);
INSERT INTO customers VALUES(generate_series(1,100)); 
DECLARE
    my_id integer;
BEGIN
    select id into my_id from customers limit 1; -- 赋值
END;
/

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;
/

CREATE TABLE test(a integer);
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$;

SELECT check_test();

查询结果为如下:

 check_test
------------

(1 row)
  • BULK COLLECT INTO 只支持批量赋值给数组。合理使用LIMIT字段避免操作过量数据导致性能下降。

  • 对于数组变量,小括号“()”将优先识别为下标,因此对于带括号的表达式,不支持写在数组变量后面。如对于select (1+3) into va(5),不支持写为select into va(5) (1+3)或select into va[5] (1+3)。