繁体   English   中英

Java:将数组发送到PL-SQL函数

[英]Java: Send array to a PL-SQL function

我需要将一个对象数组传递给PL-SQL函数

我的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

它稍微复杂一些。 首先,您需要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();

我不太确定使用oracle.jdbc包中的Oracle特定类有多重要。 但是使用纯JDBC肯定是不可能的。

如果您提供有关阵列类型的更多信息(包括Java和Oracle端)以及PL / SQL过程的签名,我可以为您提供更具体的建议。

更新:

显然,你不是试图传递一个数组而是一个表。 我从来没有这样做,我不知道是否可能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM