sqlplus调用包package中输入参数为plsql索引表和plsql嵌套表示例

----包
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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值