PL_SQL模块学习之十六、记录

记录

1.1 基于表的记录

  • 使用某一个表的所有列属性作为一个逻辑单元
  • 使用%rowtype属性简化记录的自定义
    实例:
SQL> l
  1  declare
  2      employee_rec emp%ROWTYPE;#调用表的%ROWTYPE属性
  3  begin
  4     select * into employee_rec
  5              from emp
  6       where empno=7879;
  7        dbms_output.put_line('empno: '||employee_rec.empno);
  8        dbms_output.put_line('ename: '||employee_rec.ename);
  9* end;
SQL> /
empno: 7879
ename: tom

PL/SQL 过程已成功完成。

首先声明一个基于表emp的记录,该记录名称为employee_rec,紧接着用select语句填充记录,再通过dbms_output.put_line输出对应属性值。

1.2 基于游标的记录

  • 先声明游标
  • 再声明基于游标的记录
  • 通过LOOP循环填充记录并处理记录中的数据
    不同于表记录输出,使用游标可循环返回多个值

实例:

SQL> l
  1  declare
  2     cursor emp_cur is
  3             select * from emp
  4                      where rownum<5;
  5     emp_rec emp_cur%rowtype;
  6  begin
  7      open emp_cur;
  8     loop
  9             fetch emp_cur into emp_rec;
 10             exit when emp_cur%notfound;
 11             dbms_output.put_line('name : ' ||emp_rec.ename);
 12     end loop;
 13* end;
SQL> /
name : tom
name : SMITH
name : ALLEN
name : WARD

首先声明游标emp_cur,并将其与select语句关联,再声明一个基于游标的记录emp_rec。然后使用loop循环填充记录,并在每次循环时对记录进行操作。

1.3 用户自定义的记录

使用自定义记录,可以不再局限于具体的表盒具体的右边定义。
实例:

SQL> declare
  2		#定义一个记录类型,括号中是记录的属性
  3     type time_rec_type is record
  4             (curr_date date,
  5             curr_day varchar2(12),
  6             curr_time varchar2(8) not null :='00:00:00');#非空字段必须赋予初值
  		#声明基于自定义记录类型time_rec_type类型的记录名称time_rec
  		#即可操作的记录对象名称
  7     time_rec time_rec_type;
  8     begin
  9             select sysdate
 10                     into time_rec.curr_date
 11             from dual;
 				#提取时间中的天数
 12             time_rec.curr_day := to_char(time_rec.curr_date,'DAY');
 				#提取时间中的时分秒
 13             time_rec.curr_time := to_char(time_rec.curr_date,'hh24:mi:ss');
 14
 15             dbms_output.put_line('Date: ' ||time_rec.curr_date);
 16             dbms_output.put_line('Day: ' ||time_rec.curr_day);
 17             dbms_output.put_line('Time: ' ||time_rec.curr_time);
 18
 19     end;
 20  /
Date: 20-3-20
Day: 星期五
Time: 11:18:58

PL/SQL 过程已成功完成。

1.4 嵌套记录

使用记录的嵌套时,将记录理解为一种数据类型,即可再记录中有记录。

实例1:如何声明

声明一个用户自定义记录rec_type,再声明一个用户自定义记录emp_type,在该记录属性中将name数据类型定义为rec_type,此纪录即为记录嵌套

SQL> l
  1  declare
  2     type rec_type is record
  3              (
  4                      ename varchar2(20)
  5              );
  6     type emp_type is record
  7              (
  8                     name rec_type,
  9                     job varchar2(9),
 10                     hiredate date,
 11                     sal number(7,2),
 12                     deptno number(2,0)
 13             );
 14
 15     emp_rec emp_type;

实例2:如何使用

SQL> l
  1  declare
  2     type rec_type is record
  3              (
  4                      ename varchar2(20)
  5              );
  6     type emp_type is record
  7              (
  8                     name rec_type,
  9                     job varchar2(9),
 10                     hiredate date,
 11                     sal number(7,2),
 12                     deptno number(2,0)
 13             );
 14
 15     emp_rec emp_type;
 16
 17     begin
 18               select ename,job,hiredate,sal,deptno
 19               into emp_rec.name.ename,emp_rec.job,emp_rec.hiredate,emp_rec.sal,emp_rec.deptno
 20             from emp
 21              where empno=7369;
 22                dbms_output.put_line('name is '||emp_rec.name.ename||' and job is '||emp_rec.job||' and sal is '||emp_rec.sal||' and deptno is '||emp_rec.deptno);
 23*    end;
SQL> /
name is SMITH and job is CLERK and sal is 1000 and deptno is 20

PL/SQL 过程已成功完成。

这里采用多层调用为嵌套记录中的记录类型属性赋值,如emp_rec.name.enameemp_rec.job
如果赋值时使用emp_rec.name将会报错:PLS-00494: 不支持强制放入多个记录目标

1.5 记录集合

在记录集合中,每一个下标的位置对应一个记录,通过下标即以及记录的属性访问记录中的数据对象。
实例:

SQL> l
  1  declare
  2     cursor emp_cur is
  3             select ename,deptno,sal from emp
  4                     where rownum <=4;
  5     type emp_type is table of emp_cur%rowtype --定义联合数组类型
  6     index by binary_integer;
  7     emp_tab emp_type; --定义联合数组
  8     var_counter integer :=0;
  9
 10  begin
 11     for i in emp_cur loop --通过loop循环为联合数组填充记录
 12             var_counter := var_counter+1;
 13              emp_tab(var_counter).ename  := i.ename;
 14              emp_tab(var_counter).deptno  := i.deptno;
 15              emp_tab(var_counter).sal  := i.sal;
 16              dbms_output.put_line('tab name is : '||var_counter||emp_tab(var_counter).ename||' deptno is '||deptno||' sal is '||sal);
 17      end loop;
 18* end;
SQL> edit d:1

SQL> @ d:1
tab name is : 1tom deptno is  sal is 10000
tab name is : 2SMITH deptno is 20 sal is 1000
tab name is : 3ALLEN deptno is 30 sal is 1520
tab name is : 4WARD deptno is 30 sal is 1187.5

PL/SQL 过程已成功完成。

首先声明游标,该游标返回四行记录;再声明一个数组类型,其属性是游标的%type的属性;再定义一个数组变量和计数器,用于操作数组中的记录数据

扫描二维码关注公众号,回复: 10102684 查看本文章
发布了94 篇原创文章 · 获赞 24 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_32392597/article/details/104987730
今日推荐