刚回过的,供参考:
http://community.csdn.net/Expert/topic/4326/4326482.xml?temp=.3133814

解决方案 »

  1.   

    多谢,我这个例子不同,我是给存储过程传参数,在setObject时出错,将cs.setObject(1,needSave);改为cs.setObject(1,needSave,OracleTypes.ARRAY);。错误该为"无法转换为内部表示",其中needSave为String[] needSave= {"2", "1"};
      

  2.   

    你也要用:
        ArrayDescriptor desc = ArrayDescriptor.createDescriptor("PARA", conn); 
       ARRAY mya = new ARRAY (desc, conn, needSave); 
    ...
     cs.setArray(1,mya);
    方式两点注意:
    1.PARA一定要大写
    2.nls_charsetxx.zip(我是用nls_charset12.zip)要加入classpath
      

  3.   

    非常感谢!
    提示错误:ORA-00902: invalid datatype。是不是版本的问题啊?JDK1.4+Oracle9i+Jdbc(ojdbc14.jar)
    另外,如果我要把para更改为不定长数组,在包中声明如下:
    TYPE para IS TABLE  OF VARCHAR2(50) INDEX by BINARY_INTEGER;
    该如何使用?
      

  4.   

    ORA-00902: invalid datatype ,是无效的类型,当然不是版本问题(我以前也用JDK1.4)
    这是因为你用cs.setObject(1,needSave);引起的不定长数组?没用过,觉得没必要,真的参数中的数据n多,且为不定长的,不如用流.
      

  5.   

    我是用你给的方法cs.setArray(1,mya);时引起的错误,不是用cs.setObject(1,needSave);引起的
    我接触Java时间不长,与Oracle之间传递参数的数据类型不断的实验,昨天郁闷了一天,最成功的是String和int,用BOOLEAN、Date都没有成功。比较笨,希望不要嫌烦,十分感谢!!
      

  6.   

    我不知你怎么写的,我的全部程序,你试一下:
    package dbtest;import java.sql.*;
    import oracle.sql.*;
    import oracle.jdbc.*;public class oraart { public static void main(String[] args) {

    try {

     DriverManager.registerDriver ( new oracle.jdbc.driver.OracleDriver());
     Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@192.168.0.222:1521:csi", "system", "manager");
     ArrayDescriptor desc = ArrayDescriptor.createDescriptor("PARA", conn); 

     String[] needSave= {"2", "1"};
            ARRAY mya = new ARRAY (desc, conn, needSave);
            
           CallableStatement cs = conn.prepareCall("{ call saveAurhorize(?,?,?,?) }");
             cs.registerOutParameter(4,OracleTypes.VARCHAR);
             cs.setArray(1,mya);
           cs.setInt(2,needSave.length);
         cs.setInt(3,333);
         cs.execute();
         String p=cs.getString(4);
    System.out.println(p);
         
    }
    catch(Exception e)
    {
    System.out.println(e);
    }
    }}
    ----------------------------------------------------------
    create or replace type para as varray(1000) of varchar2(4000)
    ---------------------------------------------------------------
    create or replace procedure saveAurhorize(
         inputValue in para,
         inputLength in number,
         busiNo in number,
         retValue out varchar2) is
    begin
    retValue:='111';
    end;
    -----------------------------------------------------------------------
    结果为:
    111