record

record类型的变量

创建一个record变量的方式:

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

语法

record类型的语法参见图1。

图 1 record类型的语法 record - 图1

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

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

record - 图2 说明:

在openGauss中:

  • record类型变量的赋值支持:
  • 在函数或存储过程的声明阶段,声明一个record类型,并且可以在该类型中定义成员变量。
  • 一个record变量到另一个record变量的赋值。
  • SELECT INTO和FETCH向一个record类型的变量中赋值。
  • 将一个NULL值赋值给一个record变量。
  • 不支持INSERT和UPDATE语句使用record变量进行插入数据和更新数据。
  • 如果成员有复合类型,在声明阶段不支持指定默认值,该行为同声明阶段的变量一样。
  • datatype可以为存储过程中定义record类型、数组类型和集合类型(匿名块不支持)。

示例

1. 下面示例中用到的表定义如下:
2. openGauss=# \d emp_rec
3. Table "public.emp_rec"
4. Column  |              Type              | Modifiers
5. ----------+--------------------------------+-----------
6. empno    | numeric(4,0)                   | not null
7. ename    | character varying(10)          |
8. job      | character varying(9)           |
9. mgr      | numeric(4,0)                   |
10. hiredate | timestamp(0) without time zone |
11. sal      | numeric(7,2)                   |
12. comm     | numeric(7,2)                   |
13. deptno   | numeric(2,0)                   |

15. --演示在函数中对数组进行操作。
16. openGauss=# CREATE OR REPLACE FUNCTION regress_record(p_w VARCHAR2)
17. RETURNS
18. VARCHAR2  AS $$
19. DECLARE

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

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

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

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

42. --将一个record类型的变量赋值给另一个变量。
43. employer1 := employer;
44. raise info 'employer1 name: % , epno: %',employer1.name, employer1.epno;

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

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

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

59. --在select into 中使用record变量。
60. select ename,empno  into employer2 from emp_rec order by 1 limit 1;
61. raise info 'employer name: % , epno: %', employer2.name, employer2.epno;

63. --在cursor中使用record变量。
64. OPEN C1;
65. FETCH C1 INTO employer2;
66. raise info 'employer name: % , epno: %', employer2.name, employer2.epno;
67. CLOSE C1;
68. RETURN employer.name;
69. END;
70. $$
71. LANGUAGE plpgsql;

73. --调用该函数。
74. openGauss=# CALL regress_record('abc');

76. --删除函数。
77. openGauss=# DROP FUNCTION regress_record;