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;