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;