• 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;
  • 相关阅读:
    Read-Copy Update Implementation For Non-Cache-Coherent Systems
    10 华电内部文档搜索系统 search04
    10 华电内部文档搜索系统 search05
    lucene4
    10 华电内部文档搜索系统 search01
    01 lucene基础 北风网项目培训 Lucene实践课程 索引
    01 lucene基础 北风网项目培训 Lucene实践课程 系统架构
    01 lucene基础 北风网项目培训 Lucene实践课程 Lucene概述
    第五章 大数据平台与技术 第13讲 NoSQL数据库
    第五章 大数据平台与技术 第12讲 大数据处理平台Spark
  • 原文地址:https://www.cnblogs.com/etllearn/p/15067148.html
Copyright © 2020-2023  润新知