代码之家  ›  专栏  ›  技术社区  ›  Adnan

Java:向PL-SQL函数发送数组

  •  1
  • Adnan  · 技术社区  · 15 年前

    我的ORACLE代码:

    CREATE OR REPLACE
    TYPE
            uu.ITEMTAB AS TABLE OF ITEMREC; 
    /
    
    CREATE OR REPLACE
    TYPE
            uu.ITEMREC AS OBJECT (ID NUMBER,
                                   NAME VARCHAR2(30)) 
    /
    

    Java类

    public class ITEMREC {
    
        private int ID;
        private String NAME;
    
        public ITEMREC(int iD, String nAME) {
            super();
            ID = iD;
            NAME = nAME;
        }
        public int getID() {
            return ID;
        }
        public void setID(int iD) {
            ID = iD;
        }
        public String getNAME() {
            return NAME;
        }
        public void setNAME(String nAME) {
            NAME = nAME;
        }
    }
    

    Java代码:

    import java.sql.CallableStatement;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Types;
    
    import oracle.sql.ARRAY;
    import oracle.sql.ArrayDescriptor;
    
    public class Testna {
    
        public static void main(String args[]) throws java.io.IOException, SQLException, ClassNotFoundException
        {
    
            ITEMREC[] myA = new ITEMREC[1];
            myA[0] = new ITEMREC(1, "BOB");
    
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL","uu","uu");
    
            ArrayDescriptor desc= ArrayDescriptor.createDescriptor("ITEMTAB", con);  
            ARRAY array = new ARRAY(desc, con, myA);
    
            System.out.println("Connection created..............");
            String call = "{ ? = call mainpackage.fgetText(?) }";
            CallableStatement cstmt = con.prepareCall(call);
            cstmt.setQueryTimeout(1800);
            cstmt.registerOutParameter(1, Types.VARCHAR);
            cstmt.setArray(2, array);
            cstmt.executeUpdate();
            String val = cstmt.getString(1);
            cstmt.close();
            con.close();
            System.out.println(val);
        }   
    }
    

    注意:这里我只有一个对象,因为这只是为了测试。

    我得到的新错误是:

    ARRAY array = new ARRAY(desc, con, myA);
    
    Exception in thread "main" java.sql.SQLException: Fail to convert to internal representation:
    

    更新时间: 我已经更新了密码,

    Thanx@Codo公司

    1 回复  |  直到 15 年前
        1
  •  4
  •   Codo    15 年前

    比这稍微复杂一点。首先,在Oracle中需要一个数组类型。它必须是全局的,即不使用PL/SQL包定义。

    create or replace type NUM_ARRAY as table of number;
    

    然后您需要在Java中创建一个特定于Oracle的数组:

    int intArray[] = { 1,2,3,4,5,6 };
    
    ArrayDescriptor desc= ArrayDescriptor.createDescriptor("NUM_ARRAY", con);  
    ARRAY array = new ARRAY(desc, con, intArray);
    

    OraclePreparedStatement stmt =
      (OraclePreparedStatement)conn.prepareStatement("begin pkg.proc(:x); end;");
    ps.setARRAY( 1, array_to_pass );  
    ps.execute();
    

    我不太确定从 甲骨文.jdbc 包裹。但是使用纯JDBC肯定是不可能的。

    更新时间:

    显然,您不是要传递数组,而是要传递表。我从来没有做过,我不知道这是否可能。

    推荐文章