Fork me on GitHub

记录类型(学习笔记)

定义记录类型

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;

 

 
posted @ 2015-01-13 01:01  森林森  阅读(991)  评论(0编辑  收藏  举报