oracle数组

drop table tbl_varchar_array;

create table tbl_varchar_array

(

  id number(10),

  name varchar2(100)

 );

 alter table tbl_varchar_array add constraint pk_varchar_array primary key(id);

 alter table tbl_varchar_array drop constraint pk_varchar_array;

 insert into tbl_varchar_array values(1, 'luke');

 insert into tbl_varchar_array values(2, 'tom');

 select id as  编号, name as 用户名 from tbl_varchar_array;

/*创建自定义的固定数组类型,同时固定数组作为存储过程的参数*/

drop type myarray;

create or replace type myarray as varray(10) of varchar2(10);

drop procedure show_array;

create or replace procedure show_array( p_varlist in myarray)

 is

 begin

 for x in 1..p_varlist.count loop

  dbms_output.put_line('p_varlist('||x||')='||p_varlist(x));

 end loop;

 end;

 call show_array(myarray('hello', 'world'));--SQL窗口中用call,命令窗口中用execute或者exec调用存储过程

 /*创建自定义的固定数组类型,同时长度可变的数组作为存储过程的参数*/

 drop type t_varchar_array;

 create or replace type t_varchar_array as table of varchar2(100);--不能有index by binary_integer,否则报错

 drop procedure sp_array_to_table;

 create or replace procedure sp_array_to_table(varchar_array in t_varchar_array)

 is

 begin

 for i in 1..varchar_array.COUNT 

     loop

       insert into tbl_varchar_array values(i, varchar_array(i));

       dbms_output.put_line(varchar_array(i));

     end loop; 

     exception when others then

       raise;

 end; 

call sp_array_to_table(t_varchar_array('one', 'two', 'three'));

select id as  编号, name as 用户名 from tbl_varchar_array;

drop type t_number_array;

create or replace type t_number_array as table of number(10);

drop function fn_number_to_table;

 create or replace function fn_number_to_table(number_array in t_number_array)

 return number

 is

 begin

   for i in 1..number_array.COUNT 

     loop

       insert into tbl_varchar_array values(number_array(i), to_char(i));

     end loop;

     return 0;

     exception when others then

       raise;

 end;

 drop procedure sp_test;

 create or replace procedure sp_test

 as

 --declare--存储过程中不用declare

  ret_value number(10);

 begin

   ret_value := fn_number_to_table(t_number_array(10, 11, 12));

 end;

 call sp_test();--要有括号

 select id as  编号, name as 用户名 from tbl_varchar_array;

declare    

type t_varchar_array is table of varchar2(100) index by binary_integer;   

varchar_array t_varchar_array;   

ret_value number(10);

begin    

varchar_array(1):='first';   

varchar_array(2):='second';                     --下标必须是连续的

 for i in 1..varchar_array.count loop   

 dbms_output.put_line(varchar_array(i));   

end loop;   

  show_array(myarray('hello', 'world'));--直接调用存储过程,不能有call或者exec

end;   

declare

ret_value number(10);

begin

sp_array_to_table(ret_value);

end;

/*局部固定长度的数组*/    

declare   

  type type_array is varray(10) of varchar2(20);     --一维数组,字符串类型

 var_array type_array:=type_array('ggs','jjh','wsb','csl','dd','bb');   

begin   

  for i in 1..var_array.count loop                           --数组的长度用count

      dbms_output.put_line(var_array(i));   

  end loop;   

end;  

/*局部长度可变的数组*/

declare    

type type_array is table of varchar2(20) index by binary_integer;   

var_array type_array;   

begin    

var_array(1):='aa';   

var_array(2):='bb';                     --下标必须是连续的

 for i in 1..var_array.count loop   

 dbms_output.put_line( var_array(i));   

end loop;   

end;   

declare

type type_array is table of tbl_varchar_array%rowtype index by binary_integer;   --类似二维数组

var_array type_array;

begin

     select * bulk collect into var_array from tbl_varchar_array;

     for i in 1..var_array.count loop

         dbms_output.put_line(var_array(i).id);          --二维数组的访问

         dbms_output.put_line(var_array(i).name);

     end loop;

end;

猜你喜欢

转载自talentluke.iteye.com/blog/1455376