【问题标题】:java.sql.SQLException: Fail to convert to internal representation: while passing ArrayList to Oracle.sql.ARRAYjava.sql.SQLException:无法转换为内部表示:将 ArrayList 传递给 Oracle.sql.ARRAY
【发布时间】:2014-11-21 06:24:31
【问题描述】:

您好,这是我的代码

List<String> listA = new ArrayList<String>(0);
String[] arrA = new String[100];
listA.add("aaa");
listA.add("bbb");
arrA[0]="aaa";
arrA[1]="bbb";
conn = DriverManager.getConnection(URL, USER, PASS);
oracle.jdbc.OracleConnection oraConn = (oracle.jdbc.OracleConnection) conn;
ArrayDescriptor des = ArrayDescriptor.createDescriptor("ARRAY_TABLE", oraConn);
//*****************
ARRAY array_to_pass1 = new ARRAY(des, conn, arrA );//* exception
CallableStatement cstm = (OracleCallableStatement) conn.prepareCall("{call xyz.procedure1(?,?)}");
cstm.setArray(1, array_to_pass1);
cstm.setInt(2, 1);


这工作正常,但是当我将 listA 而不是 arrA 传递给 ARRAY 构造函数时,它会抛出 sql 异常。我想传递 Arraylist 而不是 string[] 数组

【问题讨论】:

    标签: java sql arrays oracle arraylist


    【解决方案1】:

    将列表转换为行前的数组

    ARRAY array_to_pass1 = new ARRAY(des, conn, arrA );
    

    您可以在此之前从列表中添加/删除项目。

    String[] arrA= new String[listA.size()];
    arrA= listA.toArray(arrA);
    

    【讨论】:

      【解决方案2】:

      试试这个方法

      List list = new ArrayList();
      callableStatement = 
                (OracleCallableStatement)connection.prepareCall("{call yourprocedure(?)}");
                  StructDescriptor structDescriptor = 
                      StructDescriptor.createDescriptor("TYPE_ARRAY", 
                                                        connection);
                  STRUCT[] structs = new STRUCT[list.size()];
                  for (int i = 0; i < list.size(); ++i) {
      
                      Yourclass str = 
                          (Yourclass)list.get(i);
                      Object[] objects =
      
                          new Object[] { str.getProdId(), 
                                         str.getName()
                                       };
                      STRUCT struct = 
                          new STRUCT(structDescriptor, connection, objects);
                      structs[i] = struct;
                  }
                  ArrayDescriptor arrayDescriptor = 
                      ArrayDescriptor.createDescriptor("ARRAY_MY", 
                                                       connection);
      
                  ARRAY array = new ARRAY(arrayDescriptor, connection, structs);
                  callableStatement.setArray(1, array);
                  callableStatement.executeUpdate();
      

      【讨论】:

        【解决方案3】:

        Oracle 关于 ARRAY 的文档不完整,我发现到处都是 pass string[] 数组。

        所以我建议你像这样将 ArrayList 更改为 String[] 数组:

        String[] arrA = listA.toArray(new String[listA.size()]);  
        

        【讨论】:

          猜你喜欢
          • 2011-08-23
          • 1970-01-01
          • 1970-01-01
          • 2011-05-15
          • 2012-02-04
          • 2013-11-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多