Oracle PL/SQL (5) - 可变数组IS VARRA
2020-04-02 本文已影响0人
乘风破浪的姐姐
可变数组,是一种集合。一个可变数组是一个对象的集合,其中每个对象都具有相同的数据类型。可变数组的大小在创建时决定。在表中创建可变数组后,可变数组在主表中即为一个列。
可变数组特性
1)可变数组主要的特性即是元素的最大个数是有限制
2)可变数组下标固定为1,上限可以扩展
3)在可变数组声明时自动设置为NULL值.所谓的空值指的是集合本身是空,不是针对它所拥有的元素,故在元素引用前需要对其进行初始化
可变数组创建语法:
CREATE [OR REPLACE] TYPE 类型名称 IS VARRAY(长度) OF 数据类型;
例如:定义一个可变数组类型 my_varray ,它的最大容量是5,元素类型是 VARCHAR2.
create or replace type my_varray as varray(5) of varchar2(50);
1、简单类型的可变数组
declare
type weeks is varray(12) of varchar2(50);
my_week weeks:=weeks('星期一','星期二','星期三','星期四','星期五'); -- 定义一个类型为 weeks 的可变数组变量 my_week , 此时 my_week 是一个有5个元素的数组
begin
dbms_output.put_line('第三个元素为:'||my_week(3));
dbms_output.put_line('第一个元素为:'||my_week.first);
dbms_output.put_line('第二个元素:'||my_week.next(my_week.first));
dbms_output.put_line('倒数第二个元素:'||my_week.prior(my_week.last));
dbms_output.put_line('最大返回的元素个数:'||my_week.limit);--最大返回的元素个数
my_week.extend(1);--集合扩充1个长度
my_week(6):='星期六';
my_week.extend(4,2); --集合扩充2个长度,使用原始集合的第2个数据填充
my_week.trim(); --删除末尾的 1 个元素
my_week.trim(2); -- 删除末尾的 2 个元素
dbms_output.put_line('最后一个元素为:'||my_week.last);
dbms_output.put_line('总共有:'||my_week.count);
if my_week.exists(4) then
dbms_output.put_line('第四个元素存在');
end if;
if not my_week.exists(10)then
dbms_output.put_line('第十个元素不存在');
end if;
for i in my_week.first..my_week.last loop
dbms_output.put_line('元素:'||i||'值 为:'||my_week(i));
end loop;
my_week.delete(); -- 删除所有元素
end;
2、定义TYPE类型的可变数组
declare
type company_type is varray(20) of emb.company.company_code%TYPE;
v_companycode company_type:=company_type('1111111');
begin
select company_code into v_companycode(1) from emb.company
where company_name = '广东分公司';
dbms_output.put_line('公司code:'||v_companycode(1));
end;
输出结果:公司code:204
3、定义二维可变数组
declare
--一维数组
type first_varray_type is varray(10) of int;
--二维数组
type second_varray_type is varray(10) of first_varray_type;
--初始化
variable_varray second_varray_type:=second_varray_type(
first_varray_type(34,23,53,34),
first_varray_type(23,67,95),
first_varray_type(9,4)
);
begin
dbms_output.put_line('显示二维数组所有元素:');
for i in 1..variable_varray.count loop
for j in 1..variable_varray(i).count loop
dbms_output.put_line('variable_varray('||i||','||j||')='||variable_varray(i)(j));
end loop;
end loop;
end;
输出结果:
显示二维数组所有元素:
variable_varray(1,1)=34
variable_varray(1,2)=23
variable_varray(1,3)=53
variable_varray(1,4)=34
variable_varray(2,1)=23
variable_varray(2,2)=67
variable_varray(2,3)=95
variable_varray(3,1)=9
variable_varray(3,2)=4
4、定义复合类型的可变数组
CREATE OR REPLACE TYPE cla_type AS OBJECT(
v_claim_accidentno varchar2(50),
v_claim_version number,
v_claim_validflag number
);
/
declare
type claim_varray is varray(3) of cla_type;
v_claim_varray claim_varray:= claim_varray(cla_type('AAA',1,1),cla_type('BBB',2,1),cla_type('CCC',3,0));
begin
for i in v_claim_varray.first..v_claim_varray.last loop
DBMS_OUTPUT.put_line('事故号:'||v_claim_varray(i).v_claim_accidentno||' 版本号:'||v_claim_varray(i).v_claim_version||' 有效标识:'||v_claim_varray(i).v_claim_validflag);
end loop;
end;
/
输出结果:
事故号:AAA 版本号:1 有效标识:1
事故号:BBB 版本号:2 有效标识:1
事故号:CCC 版本号:3 有效标识:0