ITPub博客

首页 > Linux操作系统 > Linux操作系统 > sqlplus调用包package中输入参数为plsql索引表和plsql嵌套表示例

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

原创 Linux操作系统 作者:wisdomone1 时间:2011-12-01 16:40:32 0 删除 编辑
----包
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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
提供针对oracle初学者及进阶的数据库培训,欢迎大家咨询: 微信: wisdomone 微信公众号: lovedb qq: 305076427 微博: wisdomone9

注册时间:2008-04-04

  • 博文量
    2164
  • 访问量
    11742393