本帖最后由 myh0305 于 2009-07-28 11:35:12 编辑

解决方案 »

  1.   

    create or replace PROCEDURE PROC_TEST
    (res IN ArrayList
    ,rest OUT VARCHAR2)
     AS
    BEGIN
      dbms_output.put_line(res.count);
      rest := res(res.count);
    END PROC_TEST;存储过程上面有点错误, 更正成上面的
      

  2.   

    create or replace PROCEDURE PROC_TEST 
    (res IN ArrayList 
    ,rest OUT VARCHAR2) pl/sql里有ArrayList类型
      

  3.   

    检查一下是不是驱动问题。一般来说,在生产环境不会在java代码中调参数为数组的存储过程或者函数,因为无论是Oracle的官方驱动class12.zip还是第三方驱动,对数组的支持都不好。看你写的代码,像是在做练习。我看知道怎么在java代码中调一般的存储过程,如何为存储过程设置参数,取出过程的返回值就可以了。
      

  4.   

    可以换一种方式:
    在oracle中声明数组类型
           create or replace type tabarray is table of varchar2(38) ;构造存储过程:
    procedure PROC_TEST(res in tabarray,rest OUT VARCHAR2) is
             begin
                 dbms_output.put_line(res.count);
                 rest := res(res.count); 
             end; 
    然后在java中构造如下代码:
        OracleConnection conn = null;
        OracleCallableStatement stmt = null;
        String[] param = { "1001", "1002", "1006" };
        stmt =conn.prepareCall("{call PROC_TEST (?,?)}"); 
        ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("TABARRAY", conn);
        stmt.setARRAY(1, new ARRAY(descriptor,conn,param));
        stmt.registerOutParameter(2, OracleTypes.ARRAY, "TABARRAY");
        stmt.execute(); 不妨试试看
      

  5.   

    oracle: Arrays in other languages become VARRAYs in PL/SQL.所以你的第一句:
    create or replace type ArrayList as table of varchar2(64); 
    改为
    create or replace TYPE ArrayList IS VARRAY(10) OF varchar2(64)这样应该可以了
      

  6.   

    ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("TABARRAY", conn); 改为ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("ArrayList", conn);  试试。
      

  7.   

    rest := res(res.count); 这个好象应该要改成 rest := res(res.count-1); 吧
      

  8.   

    感谢上面各位的回答.
    我自己的感觉好像是数据库的问题, 原先在自己的电脑上通过java代码调用这个存储过程是一切没有问题的
    但一直到另一台电脑上的时候就出问题了, java调用不行, 但在sqlplus里直接exec存储过程是没问题的.
    今天又重新安装了一个oracle数据库, 新部署调用也没有问题所以判断为那个数据库上原因.
      

  9.   


    创建ArrayList这个类型是没有问题的
      

  10.   


    createDescriptor时类型的名称必须是大写的