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变量进行插入数据和更新数据。
- 如果成员有复合类型,在声明阶段不支持指定默认值,该行为同声明阶段的变量一样。

示例

  1. 下面示例中用到的表定义如下:
  2. postgres=# \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) |
  14. --演示在函数中对数组进行操作。
  15. postgres=# CREATE OR REPLACE FUNCTION regress_record(p_w VARCHAR2)
  16. RETURNS
  17. VARCHAR2 AS $$
  18. DECLARE
  19. --声明一个record类型.
  20. type rec_type is record (name varchar2(100), epno int);
  21. employer rec_type;
  22. --使用%type声明record类型
  23. type rec_type1 is record (name emp_rec.ename%type, epno int not null :=10);
  24. employer1 rec_type1;
  25. --声明带有默认值的record类型
  26. type rec_type2 is record (
  27. name varchar2 not null := 'SCOTT',
  28. epno int not null :=10);
  29. employer2 rec_type2;
  30. CURSOR C1 IS select ename,empno from emp_rec order by 1 limit 1;
  31. BEGIN
  32. --对一个record类型的变量的成员赋值。
  33. employer.name := 'WARD';
  34. employer.epno = 18;
  35. raise info 'employer name: % , epno:%', employer.name, employer.epno;
  36. --将一个record类型的变量赋值给另一个变量。
  37. employer1 := employer;
  38. raise info 'employer1 name: % , epno: %',employer1.name, employer1.epno;
  39. --将一个record类型变量赋值为NULL
  40. employer1 := NULL;
  41. raise info 'employer1 name: % , epno: %',employer1.name, employer1.epno;
  42. --获取record变量的默认值。
  43. raise info 'employer2 name: % ,epno: %', employer2.name, employer2.epno;
  44. --在for循环中使用record变量
  45. for employer in select ename,empno from emp_rec order by 1 limit 1
  46. loop
  47. raise info 'employer name: % , epno: %', employer.name, employer.epno;
  48. end loop;
  49. --在select into 中使用record变量。
  50. select ename,empno into employer2 from emp_rec order by 1 limit 1;
  51. raise info 'employer name: % , epno: %', employer2.name, employer2.epno;
  52. --在cursor中使用record变量。
  53. OPEN C1;
  54. FETCH C1 INTO employer2;
  55. raise info 'employer name: % , epno: %', employer2.name, employer2.epno;
  56. CLOSE C1;
  57. RETURN employer.name;
  58. END;
  59. $$
  60. LANGUAGE plpgsql;
  61. --调用该函数。
  62. postgres=# CALL regress_record('abc');
  63. --删除函数。
  64. postgres=# DROP FUNCTION regress_record;