zoukankan      html  css  js  c++  java
  • 6.记录类型

         跟rowtype相比 记录类型胜在灵活,可以自定义自己所需要的变量类型和个数。

       如果不使用记录类型可以看下

    declare
       -- 定义保存字段值的变量
       v_emp number;
       v_ename varchar2(20);
       v_job varchar2(9);
       v_mgr number(4);
       v_hiredate date;
       v_sal number(7,2);
       c_comm number(7,2);
       v_deptno number(2);
    begin
       -- 从emp 表中取出字段值
       select empno,ename,job,mgr,hiredate,sal,comm,deptno into v_empno,v_ename,v_job,v_mgr,v_hiredate,v_sal,v_comm,v_deptno from emp where
       empno=:empno;
       -- 向emp_copy 表中插入变量的值
       insert into emp_copy
                 (empno,ename,job,mgr,hiredate,sal,comm,deptno)
             values(v_empno,v_ename,v_job,v_mgr,v_hiredate,v_sal,v_comm,v_deptno);
             
    exception -- 异常处理块
       when others
       then
          null;   
    end;

    对比使用记录类型

    declare
       -- 定义记录类型
       type t_emp is record(
       v_emp     number,
       v_ename   varchar2(20),
       v_job     varchar2(9),
       v_mgr     number(4),
       v_hiredate date,
       v_sal     number(7,2),
       v_comm    number(7,2),
       v_deptno  number(2)
       );
       -- 声明记录类型的变量
       emp_info t_emp;
    begin
        -- 从 emp 表中取出字段值赋给记录类型
        select *
          into emp_info 
          from emp
          where empno =:empno;
          -- 向emp_copy 表中插入记录类型的值
          insert into emp_copy
             values emp_info;   --异常处理块
    exception
       when others
       then
          null;
    end;

    根据如上对比,可以明显看出,明显下边这个更加 ‘赏心悦目’

    1. 声明记录类型
    declare
       -- 声明记录类型
       type emp_rec is record(
       dept_row dept%rowtype,  -- 声明来自dept 表行的嵌套记录
       empno number,           -- 员工编号
       ename varchar(20),      -- 员工编号
       job   varchar(10),      -- 职位
       sal   number(7,2)       -- 薪资
       );
       -- 声明记录类型的变量
       emp_info emp_rec;
    begin
       null;
    end;
    2.声明记录类型赋初始值
    declare
       type emp_rec is record(
       empname     varchar(12)   :='李斯特', -- 员工名称,初始值为李斯特
       empno       number    not null default 7369,  -- 员工编号,默认值7369
       hiredate  date   default sysdate,-- 雇佣日期,默认值为当前日期
       sal        number(7,2) 
       );
       -- 声明emp_rec 类型的变量
       empinfo emp_rec;
    begin
       null;
    end;
    3.记录类型的简单使用
    declare
       type emp_rec is record(
       empname varchar(12)   :='李斯特',   --员工名称,初始值为李斯特
       empno    number not null default 7369, --  员工编号,默认值 7369
       hiredate  date  default  sysdate, -- 雇佣日期,默认值为当前日期
       sal      number(7,2)
       
       );
       -- 声明 emp_rec 类型的变量
       empinfo  emp_rec;
    begin
       -- 下面的语句为 empingo 记录赋值
       empinfo.empname:='史密斯';
       empinfo.empno:=7010;
       empinfo.hiredate:=to_date('1982-01-01','yyyy-mm-dd');
       empinfo.sal :=5000;
       --  下面的语句输出empinfo 记录的值
       dbms_output.put_line('员工名称:'||empinfo.empname);
       dbms_output.put_line('员工编号:'||empinfo.empno);
       dbms_output.put_line('雇佣日期:'||to_char(empinfo.hiredate,'yyyy-mm-dd'));
       dbms_output.put_line('员工薪资:'||  empinfo.sal);
    end;
    4.为记录类型赋记录类型的值
    declare
       -- 定义记录类型
       type emp_rec is record(
       empno number,
       ename varchar2(20)
       );
       -- 定义与emp_rec 具有相同成员的记录类型
       type emp_rec_dept is record(
       empno number,
       ename varchar2(20)
       );
       -- 声明记录类型的变量
       emp_info1 emp_rec;
       emp_info2 emp_rec;
       emp_info3 emp_rec_dept;
       -- 定义一个内嵌过程用来输出的记录信息
       procedure printrec (empinfo emp_rec)
       as
       begin
           dbms_output.put_line('员工编号:'||empinfo.empno);
           dbms_output.put_line('员工名称:'||empinfo.ename);
       end;
     begin
       emp_info1.empno :=7890;     -- 为emp_info1 记录赋值
       emp_info1.ename :='张大千';
       dbms_output.put_line('emp_info1 的信息如下');
       printrec(emp_info1);-- 打印赋值后的emp_info1 记录
       emp_info2 :=emp_info1; --将emp_info1 记录变量直接赋给emp_info2
       dbms_output.put_line('emp_info2 的信息如下:');
       printrec(emp_info2);   -- 打印赋值后的emp_info2 的记录
    end;
    5.   %rowtype 与记录类型
    declare
       -- 定义一个与dept 表具有相同列的记录
       type dept_rec is record(
       deptno   number(10),
       dname varchar2(30),
       loc    varchar2(30)
       );
       -- 定义基于dept 表的记录类型
       dept_rec_db   dept%rowtype;
       dept_info     dept_rec;
    begin
       -- 定义基于dept 表的记录类型
       select *
         into dept_rec_db
         from dept
        where deptno='20';
        -- 将%rowtype 定义的记录赋给标准记录变量
        dept_info :=dept_rec_db;
    end;
       
    6. 定义一个与表的列相同的记录类型
    declare
       -- 定义一个与dept 表具有相同列的记录
       type dept_rec is record(
       deptno   number(10),
       dname varchar2(30),
       loc    varchar2(30)
       );
       -- 定义基于dept 表的记录类型
       dept_rec_db   dept%rowtype;
       dept_info     dept_rec;
    begin
       -- 定义基于dept 表的记录类型
       select *
         into dept_rec_db
         from dept
        where deptno='20';
        -- 将%rowtype 定义的记录赋给标准记录变量
        dept_info :=dept_rec_db;
    end;
       
    7.使用select 语句给用户赋值
    declare
       type emp_rec is record(
       empno number(10),
       ename varchar2(30),
       job   varchar2(30)
       
       );
       -- 声明记录类型的变量
       emp_info emp_rec;
    begin
       --- 为记录类型赋值
       select empno,
              ename,
             job
         into emp_info 
         from emp
        where empno=7369;
        -- 输出记录类型的值
        dbms_output.put_line( ' 员工编号:'
                         || emp_info.emp
                         ||chr(13)
                         ||'员工姓名:'
                         ||emp_info.ename
                         ||chr(13)
                         ||'员工职别:'
                         ||emp_info.job
                        );
    end;
                         
        
        
        
        )     
    8. insert 语句使用
    declare
       type dept_rec is record(
       deptno number(2),
       dname varchar2(14),
       loc   varchar2(13)
       );
       -- 定义两个记录类型的变量
       dept_row  dept%rowtype;
       dept_norow  dept_rec;
    begin
        -- 为记录类型赋值
        dept_row.deptno :=70;
        dept_row.dname :='工程部';
        dept_row.loc :='上海';
        dept_norow.deptno :=80;
        dept_norow.dname :='电脑部';
        dept_no row.loc :='北京'-- 插入%rowtype 定义的记录变量到表中
        insert into dept
            values dept_row;
        --插入普通记录变量的值到表中
        insert into dept
             values dept_norow;
        -- 向数据库提交对表的更改
        commit;
    end;
    9. update 语句 使用记录类型的
    declare
       type dept_rec is record(   -- 定义记录类型吧
       deptno   number(2),
       dname  varchar2(14),
       loc      varchar2(13)
       );
       dept_info  dept_rec;   -- 定义记录类型的变量
    begin
        select * 
        into dept_info 
        from ddpt
       where dept =80;        -- 使用select 语句初始化记录类型
       dept_info.dname :='信息管理部'; -- 更新记录类型的值
       update dept
          set row = dept_info
          where  deptno=dept_info.deptno;-- 在update 中使用记录变量更新表
    end;
         
    10.在dml 语句中使用returning 返回受影响的行
    declare
       type dept_rec is record(     -- 定义记录类型
       deptno   number(2),
       dname  varchar2(14),
       loc    varchar2(13)
       );
       dept_info   dept_rec;         -- 定义记录类型的变量
       dept_returning dept%rowtype;  -- 定义用户返回结果的记录类型
    begin
        select * 
          into dept_info
          from dept
         where deptno=80;              --使用select 语句初始化记录类型
         dept_info.dname :='信息管理部';
         update   dept                 -- 更新记录类型的值
            set  row  = dept_info 
          where  deptno = dept_info.deptno  -- 在update 中使用记录变量更新表,返回受影响的行到记录
          returning deptno,
                dname,
                loc
               into dept_returning;
              dept_info.deptno;=12;
              dept_info.dname :='维修部';
              insert into dept   -- 插入新的部门编号记录,返回受影响的行的记录
                values dept_info
          returning deptno,
                  dname,
                  loc
                into dept_returning;
         declare from dept    -- 删除现有的部门,返回受影响的行的记录
             where deptno= dept_info.depno
           returning deptno,
           dname,
           loc
           into dept_returning;
    end;
    11.使用 嵌套记录
    declare
       type dept_rec is record(    -- 定义部门记录类型
       deptno  number(2),
       dname  varchar2(14),
       loc   varchar2(13)
       );
       type emp_rec is record(
       v_empno number,
       v_ename varchar2(20),
       v_job   varchar2(9),
       v_mgr    number(4),
       v_hiredate date,
       v_sal  number(7,2),
       v_comm number(7,2),
       v_dept_rec dept_rec   -- 定义嵌套的员工记录
        );
       emp_info  emp_rec;   --员工记录
       dept_info  dept_rec;  ---临时部门记录
    begin
         select * 
         into dept_info
         from  dept
      where deptno =(select deptno
                      from emp
                      where empno=7369);
       emp_info.v_dept:=dept_info;  -- 将部门信息记录赋给镶嵌的部门信息
       select empno,ename,job,mgr,hiredate,sal,comm into emp_info.v_empno,emp_info.ename,emp_info.v_job,emp_info.v_mgr,emp_info.v_hiredate,emp_info.v_sal,emp_info.v_comm from
       emp where empno=7369;
       -- 输出镶嵌记录的员工所在部门信息
       dbms_output.put_line('员工所属部门为:'emp_info.v_dept_rec.dname);
    end;
  • 相关阅读:
    第二阶段冲刺第1天
    每周总结(5.30)
    每周总结(5.23)
    个人作业——顶会热词进程2.3
    个人作业——顶会热词进程2.2
    c#日期相关代码
    Linux服务器安装mysql
    Linux运行yum时出现/var/run/yum.pid已被锁定,PID为xxxx的另一个程序正在运行的问题解决
    【转】火狐浏览器js转换日期问题
    docker流程
  • 原文地址:https://www.cnblogs.com/etllearn/p/15067148.html
Copyright © 2011-2022 走看看