记录
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.ename
、emp_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的属性
;再定义一个数组变量和计数器,用于操作数组中的记录数据。