一、复合数据类型
存放多个字段,创建后可以多次使用
二、分类
记录 表 嵌套表 数组
三、简介
1、记录
存储一组多个字段的相关数据项,是字段的集合,主要用于从表中取出查询到的的行数据
特殊的记录:%rowtype
声明的表量对应数据库表或视图中列的集合,获取的是单条信息
优点:
对应数据库中列的数量和类型,并保持一致
2、表类型
1) 类似于数组类型,由主键和列组成
2) 主键:binary_integer ,列:标量或记录类型
3) 没有长度限制,可以动态增长
4) 表方法:
exists(n):判断PL/SQL表中指定的元素是否存在,不能直接输出
count : 返回一个PL/SQL表当前包含的元素的数量
first/last:返回第一个或最后一个索引数字
delete(n) :删除第 n 个元素
delete(n,m) :删除从n到m中的所有元素
四.示例
1.record
declare
type test_table is table of varchar(20) index by binary_integer;
tt test_table;
begin
tt(1):='a';
tt(2):='b';
tt(-1):='c';
dbms_output.put_line(tt.count); -- 3
dbms_output.put_line(tt.first); -- -1
dbms_output.put_line(tt.last); -- 2
if(tt.exists(0)) then
dbms_output.put_line('存在0下标');
else
dbms_output.put_line('不存在0下标');
end if;
tt.delete(1); --删除下标为1 的值
tt.delete(1,3); --删除下标在1到3所有的值
tt.delete(); --删除全部值
end;
2. %rowtype
--%rowtype
declare
emp_record emp%rowtype;
begin
select * into emp_record
from emp where empno = 7499; --选择编号为7499的员工信息
insert into test(empno,ename)
values(emp_record.empno,emp_record.ename); --只选取empno,ename两字段,插入text表中
end;
3. %rowtype + record
-- %rowtype + record
declare
type emp_dept_rec is record(
emp_row emp%rowtype, --员工表
dept_row dept%rowtype -- 部门表
);
edr emp_dept_rec;
begin
select * into edr.emp_row
from emp
where sal = (select max(sal) from emp ); --选中工资最高的员工信息
select * into edr.dept_row
from dept
where deptno = edr.emp_row.deptno; --通过部门号,找到部门的所在信息
dbms_output.put_line(edr.emp_row.empno); --员工表,empno字段
dbms_output.put_line(edr.emp_row.ename); --员工表,ename字段
dbms_output.put_line(edr.emp_row.deptno); --员工表,deptno字段
dbms_output.put_line(edr.dept_row.deptno); --部门表,deptno字段
dbms_output.put_line(edr.dept_row.dname); --部门表,dname字段
end;
4. table 类型
--table 类型
declare
type test_table is table of varchar(20) index by binary_integer;
tt test_table;
begin
tt(1):='a';
tt(2):='b';
tt(-1):='c';
dbms_output.put_line(tt.count); -- 3
dbms_output.put_line(tt.first); -- -1
dbms_output.put_line(tt.last); -- 2
if(tt.exists(0)) then
dbms_output.put_line('存在0下标');
else
dbms_output.put_line('不存在0下标');
end if;
tt.delete(1); --删除下标为1 的值
tt.delete(1,3); --删除下标在1到3所有的值
tt.delete(); --删除全部值
end;