sqlplus呼叫包package中輸入引數為plsql索引表和plsql巢狀表示例

wisdomone1發表於2011-12-01
----包
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章