procedure QASSET_BY_INV_PROD_STS(ResultTab out VARRAYSTR,invId number, prodId number, psts number, fsts number)上面是我在包pkg_rm里建的一个存储过程,其中varraystr是我自定义的可变数组array类型。然后在java程序里总是报错,我想在oracle里测试下是不是存储过程的问题,但不知道怎么执行我是这样写的
var tt varraystr;
exec pkg_rm.QASSET_BY_INV_PROD_STS(:tt,1,1,1,1);但是总是报错,还要对tt进行初始化是吧?
然后应该在哪儿执行呢,我用的是plsql developer。是该在command window还是sql window里执行呢。然后执行完怎么查看varraystr里的数据?过路的大牛,给指点一下吧愁煞少牛头

解决方案 »

  1.   

    sqlplus的var不支持自定义的类型需要使用pl/sql块来调用(sqlplus和pl/sql dev的command window、test window都可以)declare
    tt varraystr;
    begin
    pkg_rm.QASSET_BY_INV_PROD_STS(tt,1,1,1,1);
    end;
    /
      

  2.   


    java调用oracle存储过程的自定义类型(可变数组)。
      

  3.   

    执行后说是subscript outside of limit.......然后到包体里看错误的那块,就显示是定义的变成数组的extend方法那块
      

  4.   

    我定义的varraystr是varray(10000)of varchar2(2000)的,感觉挺大的了
      

  5.   

    ORA-06532:Subscript outside of limit
    Cause:  A subscript was greater than the limit of a varray 
             or non-positive for a varray or nested table.
    Action:  Check the program logic and increase the varray limit if necessary.
      

  6.   


    你用的是神马东东?还有cause功能,这么好
      

  7.   

    varray可变数组,一旦定义limit,则不能超时这个元素个数。还有,看过你的包里的存储过程,处理数据尽量不要使用游标循环,
    数组也要少用,oracle有现成的关系表数据结构,和处理
    这种关系的SQL语句,为啥还习惯象其它高级语言一样使用对象(记录)数组呢?
    比如,可以直接使用SQL,如果需要中间表,可以使用临时表。
      

  8.   


    这是oracle的官方文档
      

  9.   

    我也很痛苦,pl/sql对我来说好陌生,之前用oracle也就是建用户建表数据增删改查神马的,这几天接触了pl/sql后发现自己oracle还没入门呢这个变长数组也是看别人写照着模仿写的你说的是用pl/sql表吗?刚才我执行了这块
    declare
    tt varraystr;
    begin
    pkg_esoprm.QASSET_BY_INV_PROD_STS(tt,4,-1,-1,-1);
    for i in 1..10 loop
      dbms_output.put_line(tt(i));
      end loop;
    end;
    /
    木有报错,但是木有看到数据输出,变长数组varraystr里的元素含有多个字段,是不是这个原因呢?
      

  10.   

    在java程序里exception.getMessge()显示的是Index:1;size:0.
    这是不是就意味着木有查询到数据