----包
create or replace package pack_special is
-- Author : ADMINISTRATOR
-- Created : 2011-12-1 14:57:57
-- Purpose :
-- Public type declarations
type t_deptno is table of dept.deptno%type index by binary_integer;
type t_dname is table of dept.dname%type index by binary_integer;
--in_deptno t_deptno;
--out_dname t_dname;
procedure proc_special(in_deptno in t_deptno);
end pack_special;
--包体
create or replace package body pack_special
is
procedure proc_special(in_deptno in t_deptno)
is
lvnctl integer;
v_dname dept.dname%type;
begin
lvnctl:=1;
while lvnctl<=4 loop
select dname
into v_dname
from dept
where dept.deptno =in_deptno(lvnctl);
dbms_output.put_line(v_dname);
lvnctl:=lvnctl+1;
end loop;
end proc_special;
end pack_special;
--通过sqlplus调用输入参数为索引表(下标可为负数,且元素个数不限制,且其不能直接在table中作为表列类型使用)
SQL> declare
2 in_deptno pack_special.t_deptno;--直接引用package包中包plsql索引表类型
3 begin
4 in_deptno(1):=10;
5 in_deptno(2):=20;
6 in_deptno(3):=30;
7 in_deptno(4):=40;
8 pack_special.proc_special(in_deptno);
9 end;
10 /
PL/SQL procedure successfully completed
小结:plsql索引表在包中定义的plsql索引表与在sqlplus声明的plsql索引表类型即便名称相同,也不是同一个类型
plsql索引表好像不能直接为其plsql索引表变量赋值,
如:in_deptno pack_special.t_deptno:=pack_special.t_deptno(10,20,30,40);
而只能in_deptno(1):=10;
5 in_deptno(2):=20;
6 in_deptno(3):=30;
7 in_deptno(4):=40;
否则报错如下:
declare
in_deptno pack_special.t_deptno;
in_deptno pack_special.t_deptno:=pack_special.t_deptno(10,20,30,40);
begin
--in_deptno(1):=10;
--in_deptno(2):=20;
--in_deptno(3):=30;
--in_deptno(4):=40;
pack_special.proc_special(in_deptno);
end;
ORA-06550: 第 3 行, 第 34 列:
PLS-00222: 在此范围中不存在名为 'T_DEPTNO' 的函数
ORA-06550: 第 3 行, 第 11 列:
PL/SQL: Item ignored
ORA-06550: 第 9 行, 第 27 列:
PLS-00371: 'IN_DEPTNO' 最多允许有一个声明
ORA-06550: 第 9 行, 第 1 列:
PL/SQL: Statement ignored
而如果使用plsql嵌套表,就可以测试通过
如下:
SQL> declare
2 in_deptno pack_special.t_deptno:=pack_special.t_deptno(10,20,30,40);
3 begin
4 pack_special.proc_special(in_deptno);
5 end;
6 /
PL/SQL procedure successfully completed
其对应存储过程调整如下:
--包
create or replace package pack_special is
-- Author : ADMINISTRATOR
-- Created : 2011-12-1 14:57:57
-- Purpose :
-- Public type declarations
type t_deptno is table of dept.deptno%type; --注意:plsql嵌套表定义仅比plsql
type t_dname is table of dept.dname%type;
--in_deptno t_deptno;
--out_dname t_dname;
procedure proc_special(in_deptno in t_deptno);
end pack_special;
--包体
create or replace package body pack_special
is
procedure proc_special(in_deptno in t_deptno)
is
lvnctl integer;
v_dname dept.dname%type;
begin
lvnctl:=1;
while lvnctl<=4 loop
select dname
into v_dname
from dept
where dept.deptno =in_deptno(lvnctl);
dbms_output.put_line(v_dname);
lvnctl:=lvnctl+1;
end loop;
end proc_special;
end pack_special;
小结:plsql嵌套表类型可以直接批量赋值 in_deptno pack_special.t_deptno:=pack_special.t_deptno(10,20,30,40);
plsql嵌套表类型可以直接作为表列类型使用
plsql嵌套表类型从语法上区别于 plsql索引表类型,少了一个 index by binary_integer
plsql嵌套表类型下标从1开始,元素个数为无限
create or replace package pack_special is
-- Author : ADMINISTRATOR
-- Created : 2011-12-1 14:57:57
-- Purpose :
-- Public type declarations
type t_deptno is table of dept.deptno%type index by binary_integer;
type t_dname is table of dept.dname%type index by binary_integer;
--in_deptno t_deptno;
--out_dname t_dname;
procedure proc_special(in_deptno in t_deptno);
end pack_special;
--包体
create or replace package body pack_special
is
procedure proc_special(in_deptno in t_deptno)
is
lvnctl integer;
v_dname dept.dname%type;
begin
lvnctl:=1;
while lvnctl<=4 loop
select dname
into v_dname
from dept
where dept.deptno =in_deptno(lvnctl);
dbms_output.put_line(v_dname);
lvnctl:=lvnctl+1;
end loop;
end proc_special;
end pack_special;
--通过sqlplus调用输入参数为索引表(下标可为负数,且元素个数不限制,且其不能直接在table中作为表列类型使用)
SQL> declare
2 in_deptno pack_special.t_deptno;--直接引用package包中包plsql索引表类型
3 begin
4 in_deptno(1):=10;
5 in_deptno(2):=20;
6 in_deptno(3):=30;
7 in_deptno(4):=40;
8 pack_special.proc_special(in_deptno);
9 end;
10 /
PL/SQL procedure successfully completed
小结:plsql索引表在包中定义的plsql索引表与在sqlplus声明的plsql索引表类型即便名称相同,也不是同一个类型
plsql索引表好像不能直接为其plsql索引表变量赋值,
如:in_deptno pack_special.t_deptno:=pack_special.t_deptno(10,20,30,40);
而只能in_deptno(1):=10;
5 in_deptno(2):=20;
6 in_deptno(3):=30;
7 in_deptno(4):=40;
否则报错如下:
declare
in_deptno pack_special.t_deptno;
in_deptno pack_special.t_deptno:=pack_special.t_deptno(10,20,30,40);
begin
--in_deptno(1):=10;
--in_deptno(2):=20;
--in_deptno(3):=30;
--in_deptno(4):=40;
pack_special.proc_special(in_deptno);
end;
ORA-06550: 第 3 行, 第 34 列:
PLS-00222: 在此范围中不存在名为 'T_DEPTNO' 的函数
ORA-06550: 第 3 行, 第 11 列:
PL/SQL: Item ignored
ORA-06550: 第 9 行, 第 27 列:
PLS-00371: 'IN_DEPTNO' 最多允许有一个声明
ORA-06550: 第 9 行, 第 1 列:
PL/SQL: Statement ignored
而如果使用plsql嵌套表,就可以测试通过
如下:
SQL> declare
2 in_deptno pack_special.t_deptno:=pack_special.t_deptno(10,20,30,40);
3 begin
4 pack_special.proc_special(in_deptno);
5 end;
6 /
PL/SQL procedure successfully completed
其对应存储过程调整如下:
--包
create or replace package pack_special is
-- Author : ADMINISTRATOR
-- Created : 2011-12-1 14:57:57
-- Purpose :
-- Public type declarations
type t_deptno is table of dept.deptno%type; --注意:plsql嵌套表定义仅比plsql
type t_dname is table of dept.dname%type;
--in_deptno t_deptno;
--out_dname t_dname;
procedure proc_special(in_deptno in t_deptno);
end pack_special;
--包体
create or replace package body pack_special
is
procedure proc_special(in_deptno in t_deptno)
is
lvnctl integer;
v_dname dept.dname%type;
begin
lvnctl:=1;
while lvnctl<=4 loop
select dname
into v_dname
from dept
where dept.deptno =in_deptno(lvnctl);
dbms_output.put_line(v_dname);
lvnctl:=lvnctl+1;
end loop;
end proc_special;
end pack_special;
小结:plsql嵌套表类型可以直接批量赋值 in_deptno pack_special.t_deptno:=pack_special.t_deptno(10,20,30,40);
plsql嵌套表类型可以直接作为表列类型使用
plsql嵌套表类型从语法上区别于 plsql索引表类型,少了一个 index by binary_integer
plsql嵌套表类型下标从1开始,元素个数为无限
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9240380/viewspace-712557/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9240380/viewspace-712557/