PL/SQL集合(一):记录类型(TYPE 类型名称 IS RECORD)
记录类型
- 利用记录类型可以实现复合数据类型的定义;
- 记录类型允许嵌套;
- 可以直接利用记录类型更新数据。
- 传统操作的问题
- 对于Oracle数据类型,主要使用的是VARCHAR2、NUMBER、DATE等类型,但是这些基本数据类型,如果在进行一些实际操作的时候就会比较麻烦。
获取一个雇员的完整信息:
如下数据类型被单独定义.
DECLARE v_emp_empno emp.empno%TYPE ; v_emp_ename emp.ename%TYPE ; v_emp_job emp.job%TYPE ; v_emp_hiredate emp.hiredate%TYPE ; v_emp_sal emp.sal%TYPE ; v_emp_comm emp.comm%TYPE ; BEGIN v_emp_empno := &inputempno ; SELECT ename,job,hiredate,sal,comm INTO v_emp_ename,v_emp_job,v_emp_hiredate,v_emp_sal,v_emp_comm FROM emp WHERE empno=v_emp_empno ; DBMS_OUTPUT.put_line('雇员编号:' || 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)) ; EXCEPTION WHEN others THEN RAISE_APPLICATION_ERROR(-20007,'此雇员信息不存在!') ; END ; / |
- 定义新类型
- 定义记录类型
TYPE 类型名称 IS RECORD ( 成员名称 数据类型 [[NOT NULL] [:= 默认值] 表达式] , ... 成员名称 数据类型 [[NOT NULL] [:= 默认值] 表达式] ) ; |
ROWTYPE只能够根据已有表来决定复合类型
记录类型可以由用户自定义组成.
使用记录类型接收查询返回结果 注意使用逗号. |
DECLARE v_emp_empno emp.empno%TYPE ; TYPE emp_type IS RECORD ( ename emp.ename%TYPE , job emp.job%TYPE , hiredate emp.hiredate%TYPE , sal emp.sal%TYPE , comm emp.comm%TYPE ) ; v_emp emp_type ; -- 定义一个指定的复合类型变量 BEGIN v_emp_empno := &inputempno ; SELECT ename,job,hiredate,sal,comm INTO v_emp FROM emp WHERE empno=v_emp_empno ; DBMS_OUTPUT.put_line('雇员编号:' || 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)) ; EXCEPTION WHEN others THEN RAISE_APPLICATION_ERROR(-20007,'此雇员信息不存在!') ; END ; / |
用户自己操作记录类型数据 这个时候没有通过查询,直接声明变量,然后为属性赋值. |
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 := 'scent' ; -- 为记录类型成员赋值 v_dept.loc := '重庆' ; -- 为记录类型成员赋值 DBMS_OUTPUT.put_line('部门编号:' || v_dept.deptno || ',名称:' || v_dept.dname || ',位置:' || v_dept.loc) ; END ; / |
定义嵌套的记录类型 这是一种面向对象的方式 |
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 ; DBMS_OUTPUT.put_line('雇员编号:' || 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)) ; DBMS_OUTPUT.put_line('部门编号:' || v_emp.dept.deptno || ',名称:' || v_emp.dept.dname || ',位置:' || v_emp.dept.loc) ; END ; / |
增加一条新的记录,利用记录类型保存数据 |
DECLARE TYPE dept_type IS RECORD ( deptno dept.deptno%TYPE , 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 ; / |
如果不需要插入全表数据,也可以插入指定栏位的数据 |
DECLARE TYPE dept_type IS RECORD ( deptno dept.deptno%TYPE , dname dept.dname%TYPE ) ; v_dept dept_type ; BEGIN v_dept.dname := 'wendy' ; v_dept.deptno := 90 ; INSERT INTO dept(deptno,dname) VALUES (v_dept.deptno,v_dept.dname) ; -- 直接插入记录类型的数据 END ; / |
修改数据,利用记录类型保存数据 |
DECLARE TYPE dept_type IS RECORD ( deptno dept.deptno%TYPE , dname dept.dname%TYPE , loc dept.loc%TYPE ) ; v_dept dept_type ; BEGIN v_dept.dname := 'yaya' ; v_dept.loc := '中国' ; v_dept.deptno := 90 ; UPDATE dept SET ROW=v_dept WHERE deptno=v_dept.deptno ; END ; / |