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;

 

posted @ 2021-07-27 17:40  马蹄烧饼  阅读(85)  评论(0编辑  收藏  举报