首先写了一个包,包头声明了个自定义数组类型:TYPE lgn IS TABLE OF NVARCHAR2(20);
在包体里写了存储过程如下:
procedure country_languages
    ( 
      country_n in NVARCHAR2,
      c_n out NVARCHAR2,
      l_ns out lgn,
      ofls out lgn
           
    ) as
    c_id NVARCHAR2(20);
    l_id NVARCHAR2(20);
    l_n NVARCHAR2(20);
    o_n NVARCHAR2(20);
    if_o char;
    n number:=0; 
    
   cursor mycursor1 is
       select b.language_id, b.country_id from wf_countries a, wf_spoken_languages b where                    a.country_name=country_n and b.country_id=a.country_id;
       cursorrecord mycursor1%rowtype;       
    
     begin
         l_id:='';
         open mycursor1;       
        
         LOOP
              fetch mycursor1 into cursorrecord;             
              exit when mycursor1%notfound;            
              l_id:=cursorrecord.language_id;
              c_id:=cursorrecord.country_id;
              select language_name into l_n from wf_languages where language_id=l_id;
              select if_official into if_o from wf_spoken_languages where country_id=c_id and language_id=l_id;
             
                
              n:=n+1; 
              l_ns(n):=l_n; 
             
              if if_o='1'then
              ofls(n):=l_n;              end if;    
         end loop;
         close mycursor1;        
 
    c_n:=country_n;
    
      
end country_languages;现在存储过程编译通过,但是在命令行里调用存储过程时出错:
SQL> declare
  2    -- Local variables here
  3    i integer;
  4  TYPE lgn IS VARRAY(20) OF NVARCHAR2(20);    --可变数组
  5    c_n  NVARCHAR2(20);
  6        l_ns  varray;
  7        ofls  varray;
  8  begin
  9    -- Test statements here
 10    traveler_assistance_package.country_languages('巴西', c_n,l_ns, ofls);
 11  end;
 12  /
      l_ns  varray;
            *
第 6 行出现错误:
ORA-06550: 第 6 行, 第 13 列:
PLS-00201: 必须声明标识符 'VARRAY'
ORA-06550: 第 6 行, 第 13 列:
PL/SQL: Item ignored
ORA-06550: 第 7 行, 第 13 列:
PLS-00201: 必须声明标识符 'VARRAY'
ORA-06550: 第 7 行, 第 13 列:
PL/SQL: Item ignored
ORA-06550: 第 10 行, 第 61 列:
PLS-00320: 此表达式的类型声明不完整或格式不正确
ORA-06550: 第 10 行, 第 3 列:
PL/SQL: Statement ignored并且在JSP里面调用的话,也会提示出错:
java.sql.SQLException: 无效的名称模式: FOF.lgn明明lgn在包头里面已经声明了,怎么会出错呢?
是不是数组lgn没有初始化呢?我也不知道在哪里初始化大侠救救我们吧
   

解决方案 »

  1.   

    包头你的type的作用域只限在你的包体里,你在plsql块你调用的时候声明的plsql块和包头声明的type是两个不同的数据类型,肯定报错你把包头你的type使用全部定义的形式,还有就是你l_ns varray也不对,应该是l_ns lgn,因为变量后面必须跟数据类型,这里就你的自定义类型。
    首先声明全部type
    create or replace TYPE lgn IS TABLE OF NVARCHAR2(20);然后包头的type去掉,包体使用第一步使用的type最后调用declare
      -- Local variables here
      i integer;
      --TYPE lgn IS VARRAY(20) OF NVARCHAR2(20); --可变数组
      c_n NVARCHAR2(20);
      l_ns lgn;
      ofls lgn;
      begin
      -- Test statements here
     traveler_assistance_package.country_languages('巴西', c_n,l_ns, ofls);
     end;
      

  2.   

    不一定要声明全局的type
    可以直接引用包中声明的类型lgn,引用方式:<包名>.<类型名>
    假设你的包名为:your_pack,则在dclare块中的变量声明为:
    l_ns your_pack.lgn;
    ofls your_pack.lgn;
      

  3.   

    SQL> declare
      2 -- Local variables here
      3 i integer;
      4 TYPE lgn IS VARRAY(20) OF NVARCHAR2(20); --可变数组
      5 c_n NVARCHAR2(20);
      6 l_ns lgn:=lgn() ;--这里         ---或者用你的包名加可变数组的名称 包名.lgn(上面的声明就不需要了)
      7 ofls lgn:=lgn() ; --这里
      8 begin
      9 -- Test statements here
     10 traveler_assistance_package.country_languages('巴西', c_n,l_ns, ofls);
     11 end;