华为云云数据库GaussDBrecord_云淘科技

record类型的变量

创建一个record变量的方式:

定义一个record类型 ,然后使用该类型来声明一个变量。

语法

record类型的语法参见图1。

图1 record类型的语法

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

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

在GaussDB中:

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

在函数或存储过程的声明阶段,声明一个record类型,并且可以在该类型中定义成员变量。
一个record变量到另一个record变量的赋值。
SELECT INTO和FETCH向一个record类型的变量中赋值。
将一个NULL值赋值给一个record变量。

不支持INSERT和UPDATE语句使用record变量进行插入数据和更新数据。
不支持record类型的构造器作为函数或存储过程参数的默认值。
通过package_name.record_type声明record变量时,record类型的默认值功能会失效,建议不要在record类型有默认值时使用package_name.record_type声明record变量。
如果成员有复合类型,在声明阶段不支持指定默认值,该行为同声明阶段的变量一样。
如果成员有record类型,则内层record类型的默认值不会传递至外层record类型中。
设置enable_recordtype_check_strict = on后,成员是record类型,且record类型有列具有not null属性或defalut属性,在存储过程或PACKAGE编译时会报错。
设置enable_recordtype_check_strict = on后,当PACKAGE里有record类型,且record类型有列具有not null属性或defalut属性会在创建或编译时报错。
设置enable_recordtype_check_strict = on;后,存储过程里的record类型not null功能生效。
打开guc参数 set behavior_compat_options = ‘proc_outparam_override’ 后:

带有out出参且返回record的函数,支持在外部SQL使用SELECT、CALL调用,在存储过程内支持使用PERFORM、表达式调用。
在函数直接返回未定义的record类型时,至少需要带有一个out参数;如果返回的是已经定义的record类型,则可以不带out参数。详见示例。
带out出参返回复合类型或record的函数,需要保持函数的预期返回类型与实际返回类型一致。

示例

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
下面存储过程中用到的表定义如下:
gaussdb=# \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)                   | 

--演示在存储过程中对数组进行操作。
gaussdb=# 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。
     employer1 := NULL;
     raise info 'employer1 name: % , epno: %',employer1.name, employer1.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;
         
      --在select into 中使用record变量。
      select ename,empno  into employer2 from emp_rec order by 1 limit 1;
      raise info 'employer name: % , epno: %', employer2.name, employer2.epno;
            
      --在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;

--调用该存储过程。
gaussdb=# CALL regress_record('abc');

--删除存储过程。
gaussdb=# DROP PROCEDURE regress_record;

-- 打开兼容性参数proc_outparam_override时,返回已定义的record类型,函数可以不需out参数
create type rec_type is (c1 int, c2 int);
create or replace function func(a in int) return rec_type
as declare
r rec_type;
begin
r.c1:=1;
r.c2:=2;
return r;
end;
/
call func(0);

-- 打开兼容性参数proc_outparam_override时,函数直接返回未定义的record类型时,至少需要带有一个out参数
create or replace function func(a out int) return record
as declare
type rc is record(c1 int);
r rc;
begin
r.c1:=1;
a:=1;
return r;
end;
/
call func(1);

父主题: 数组、集合和record

同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家