首先写了一个包,包头声明了个自定义数组类型: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
。。现在存储过程编译通过,但是在命令行里调用存储过程时出错:
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.   

    Oracle 开发之 REF_CURSOR
      

  3.   


    declare 
     i integer;
     c_n nvarchar(20);
     l_ns traveler_assistance_package.lgn;
     ofls traveler_assistance_package.lgn;
    begin
     traveler_assistance_package.country_languages('巴西',c_n,l_ns,ofls);
    end;
    /