记录类型(学习笔记)
定义记录类型
TYPE 类型名称 IS RECORD ( 成员名称 数据类型 [[NOT NULL] [:= 默认值] 表达式] , ... 成员名称 数据类型 [[NOT NULL] [:= 默认值] 表达式] ) ;
示例一、记录类型接收查询返回结果
--使用记录类型接收查询返回结果 DECLARE V_ENO 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_ENO := &ENO; SELECT ENAME, JOB, HIREDATE, SAL, COMM INTO V_EMP FROM EMP WHERE EMPNO = V_ENO; DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT || ' 员工编号:' || V_ENO || ' 姓名:' || 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(-20009,'此员工信息不存在'); END;
示例二、
DECLARE TYPE dept_type IS RECORD( deptno dept.deptno%TYPE:=99,--定义默认值 dname dept.dname%TYPE, loc dept.loc%TYPE ); v_dept dept_type; BEGIN v_dept.dname:='TT'; --为记录类型成员赋值 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 := 99, --定义默认值 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.EMPNO, 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.EMPNO = D.DEPTNO(+) AND EMPNO = &EMPNO; DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT || ' 员工编号:' || 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.deptno:=&deptno; V_DEPT.DNAME:='&dname'; --为记录类型成员赋值 V_DEPT.LOC:='&loc'; INSERT INTO dept VALUES v_dept; --直接插入记录类型 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.deptno:=&deptno; V_DEPT.DNAME:='&dname'; --为记录类型成员赋值 V_DEPT.LOC:='&loc'; UPDATE dept SET ROW=v_dept WHERE deptno=v_dept.deptno; EXCEPTION WHEN OTHERS THEN dbms_output.put_line('没有这个部门'); END;