VastbaseG100

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

Menu

兼容PL/pgSQL-TYPE … IS RECORD

功能描述

支持在PL/pgSQL-TYPE…IS RECOED中嵌套定义和使用RECORD类型,使用INSERT时支持RECORD直接赋值给表行。

语法格式

1、RECORD类型支持嵌套定义和使用

TYPE 类型名称 IS RECORD(
        成员类型  数据类型[[NOT NULL][:=默认值] 表达式],
        …
        成员类型  数据类型[[NOT NULL][:=默认值] 表达式]
);

2、RECORD类型支持直接赋值给表行

INSERT INTO table_name [(column_name[,…])] VALUES record_var_name;

说明

  • 使用点号”.“访问record类型的成员及其嵌套成员,且只能在PL/pgSQL中使用。

  • 数据类型可以为:

(1)RECORD类型

(2)任意SQL兼容的数据类型

(3)行类型table_name%ROWTYPE

(4)复制类型(Copying Types)variable%TYPE

  • record_var_name

定义的record类型。

示例

1、RECORD类型支持嵌套定义和使用

(1)预先建表

CREATE TABLE EMP
(
EMPNO NUMBER(4) NOT NULL,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2)
);
INSERT INTO EMP VALUES (7369, 'SMITH', 'CLERK',7902,TO_DATE('17-DEC-1980', 'DD-MON-YYYY'), 800,NULL,20);
INSERT INTO EMP VALUES (7499, 'ALLEN', 'SALESMAN', 7698,TO_DATE('20-FEB-1981', 'DD-MON-YYYY'),1600,300,30);
INSERT INTO EMP VALUES (7521, 'WARD', 'SALESMAN', 7698,TO_DATE('22-FEB-1981', 'DD-MON-YYYY'),1250,500,30);

CREATE TABLE DEPT
(
DEPTNO NUMBER(2),
DNAME VARCHAR2(14),
LOC VARCHAR2(13));
INSERT INTO DEPT VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO DEPT VALUES (20, 'RESEARCH', 'DALLAS');
INSERT INTO DEPT VALUES (30, 'SALES', 'CHICAGO');
INSERT INTO DEPT VALUES (40, 'OPERATIONS', 'BOSTON');

(2)定义和使用嵌套的记录类型

do language plpgsql $$
DECLARE
TYPE dept_type IS RECORD(
deptno dept.deptno%TYPE := 80,   --定义默认值
dname dept.dname%TYPE,
loc dept.loc%TYPE
);
TYPE emp_type IS RECORD(
empno emp.empno%TYPE,
ename emp.ename%TYPE,
job emp.job%TYPE,
hiredate emp.hiredate%TYPE,
sal emp.sal%TYPE,
comm emp.comm%TYPE,
dept dept_type
);
v_emp emp_type;
BEGIN
SELECT e.empno,e.ename,e.job,e.hiredate,e.sal,e.comm,d.deptno,d.dname,d.loc INTO v_emp.empno,v_emp.ename,v_emp.job,v_emp.hiredate,v_emp.sal,v_emp.comm,v_emp.dept.deptno,v_emp.dept.dname,v_emp.dept.loc FROM emp e,dept d WHERE e.deptno=d.deptno AND e.empno=7369;
RAISE notice '雇员编号:%,姓名:%,职位:%,雇佣日期:%,基本工资:%,佣金:%',v_emp.empno,v_emp.ename,v_emp.job,
TO_CHAR(v_emp.hiredate,'yyyy-mm-dd'),v_emp.sal,NVL(v_emp.comm,0);
RAISE notice '部门编号:%,名称:%,位置:%',v_emp.dept.deptno,v_emp.dept.dname,v_emp.dept.loc;
END;
$$;

do language plpgsql $$
DECLARE
TYPE dept_type IS RECORD(
deptno dept.deptno%TYPE := 80,
dname dept.dname%TYPE,
loc dept.loc%TYPE
);
TYPE emp_type IS RECORD(
empno emp.empno%TYPE,
ename emp.ename%TYPE,
job emp.job%TYPE,
hiredate emp.hiredate%TYPE,
sal emp.sal%TYPE,
comm emp.comm%TYPE,
dept dept_type
); 
v_emp emp_type;
v_dept dept_type;
BEGIN
v_emp.dept.deptno := 90;
v_emp.dept.dname := 'ACCOUNTING2';
v_emp.dept.loc := 'NEW YORK';
v_dept := v_emp.dept;
RAISE notice '部门编号:%,名称:%,位置:%',v_dept.deptno,v_dept.dname,v_dept.loc;
END;
$$;

2、使用RECORD类型直接赋值给表行

增加一条新的记录,利用记录类型保存数据。在DECALE中声明记录类型变量,在BEGIN中使用INSERT语句,其中VALUES后接一个record类型变量。

do language plpgsql $$
DECLARE
TYPE dept_type IS RECORD(
deptno dept.deptno%TYPE := 80,
dname dept.dname%TYPE,
loc dept.loc%TYPE
);
v_dept dept_type;
BEGIN
v_dept.dname := 'gaga';
v_dept.loc := 'chongqing';
v_dept.deptno := 80;
INSERT INTO dept VALUES v_dept;
END;
$$;