VastbaseG100

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

Menu

record

record类型的变量

创建一个record变量的方式:定义一个record类型 ,然后使用该类型来声明一个变量。

语法

record类型的语法参见下图:

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

  • record_type:声明的类型名称。
  • field:record类型中的成员名称。
  • datatype:record类型中成员的类型。
  • expression:设置默认值的表达式。

在Vastbase中:

  • record类型变量的赋值支持:

    • 在函数或存储过程的声明阶段,声明一个record类型,并且可以在该类型中定义成员变量。
    • 一个record变量到另一个record变量的赋值。
    • SELECT INTO和FETCH向一个record类型的变量中赋值。
    • 将一个NULL值赋值给一个record变量。
  • 不支持INSERT和UPDATE语句使用record变量进行插入数据和更新数据。

  • 如果成员有复合类型,在声明阶段不支持指定默认值,该行为同声明阶段的变量一样。

示例

1、创建测试表。

CREATE TABLE emp_rec(empno numeric(4,0),ename character varying(10), job character varying(9), mgr numeric(4,0),hiredate timestamp(0) without time zone,sal numeric(7,2),comm numeric(7,2),deptno numeric(2,0));

2、查看表定义。

\d emp_rec 

结果返回如下:

        Table "public.emp_rec" 
 Column   |        Type           | Modifiers  
----------+--------------------------------+----------- 
 empno    | numeric(4,0)          | not null 
 ename    | character varying(10) |  
 job      | character varying(9)  |  
 mgr      | numeric(4,0)          |  
 hiredate | timestamp(0) without time zone |  
 sal      | numeric(7,2)          |  
 comm     | numeric(7,2)          |  
 deptno   | numeric(2,0)          | 

3、演示在存储过程中对数组进行操作。

CREATE OR REPLACE FUNCTION regress_record(p_w VARCHAR2)
RETURNS
VARCHAR2  AS $$
DECLARE

   --声明一个record类型.
   type rec_type is record (name  varchar2(100), epno int);
   employer rec_type;

   --使用%type声明record类型
   type rec_type1 is record (name  emp_rec.ename%type, epno int not null :=10);
   employer1 rec_type1;

   --声明带有默认值的record类型
   type rec_type2 is record (
         name varchar2 not null := 'SCOTT', 
         epno int not null :=10);
    employer2 rec_type2;
    CURSOR C1 IS  select ename,empno from emp_rec order by 1 limit 1;
BEGIN

      --对一个record类型的变量的成员赋值。
     employer.name := 'WARD';
     employer.epno = 18;
     raise info 'employer name: % , epno:%', employer.name, employer.epno;

     --将一个record类型的变量赋值给另一个变量。

     employer1 := employer;
     raise info 'employer1 name: % , epno: %',employer1.name, employer1.epno;

      --将一个record类型变量赋值为NULL。
      employer := NULL;
     raise info 'employer name: % , epno: %',employer.name, employer.epno;

      --获取record变量的默认值。
     raise info 'employer2 name: % ,epno: %', employer2.name, employer2.epno;

      --在for循环中使用record变量
      for employer in select ename,empno from emp_rec order by 1  limit 1 
          loop 
               raise info 'employer name: % , epno: %', employer.name, employer.epno;
          end loop;

      --在cursor中使用record变量。
      OPEN C1;
      FETCH C1 INTO employer2;
      raise info 'employer name: % , epno: %', employer2.name, employer2.epno;
      CLOSE C1;        
      RETURN employer.name;
END;
$$
LANGUAGE plpgsql;

4、调用该存储过程。

CALL regress_record('abc'); 

结果显示如下:

INFO:  employer name: WARD , epno:18
INFO:  employer1 name: WARD , epno: 18
INFO:  employer name: <NULL> , epno: <NULL>
INFO:  employer2 name: SCOTT ,epno: 10
INFO:  employer name: SCOTT , epno: 10
 regress_record
----------------

(1 row)

5、删除存储过程。

DROP PROCEDURE regress_record;