• 记录类型(学习笔记)


    定义记录类型

    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;
     
  • 相关阅读:
    hihoCoder #1077 RMQ问题再临-线段树
    ms sql 获取字符串首字母
    如何设置gen_server在退出时执行相关操作
    C++拾遗
    [置顶] Linux下文件和目录权限说明
    Android百度地图之显示地图
    USACO March. 2012
    JNI之HelloWorld
    复习C语言系列二:动态调用函数指针数组
    HDU2527:Safe Or Unsafe(哈弗曼树)
  • 原文地址:https://www.cnblogs.com/liunanjava/p/4220279.html
Copyright © 2020-2023  润新知