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

上一篇下一篇

猜你喜欢

热点阅读