java - 将对象数组从 Java 传递到 PL/SQL 函数

标签 java oracle stored-procedures

我正在尝试使用对象数组创建 Java 数组 (java.sql.Array) 对象。我需要将此 Java 数组传递给 PLSQL 存储过程。

conn = ConnectionManager.getConnection();
JournalBean[] journal = listJournal.toArray(new JournalBean[listJournal.size()]); 
final Array sqlArray =   conn.createArrayOf("CHMCR.PACK_CHM_CR.FICHIER_CR_TYPE", journal);
cstmt = conn.prepareCall("{call CHMCR.PACK_CHM_CR.CHARGEMENT_CR(?,?,?,?,?)}");
cstmt.setArray(1,sqlArray);
cstmt.setString(2, fileName);
cstmt.registerOutParameter(3, oracle.jdbc.OracleTypes.NUMBER);
cstmt.registerOutParameter(4, oracle.jdbc.OracleTypes.NUMBER);
cstmt.registerOutParameter(5, oracle.jdbc.OracleTypes.VARCHAR);

cstmt.executeUpdate();
conn.commit();

但是,当我尝试使用方法 (connection.createArrayOf) 创建此数组时,出现以下异常:

java.sql.SQLException: Fonction non prise en charge
    at oracle.jdbc.driver.PhysicalConnection.createArrayOf(PhysicalConnection.java:9283)

这是我的 JournalBean 是:

public class JournalBean implements  Serializable, SQLData {

    private static final long serialVersionUID = 2199201954799483472L;

    private int idCr;
    private int idChargement;
    private String numAutorisation;
    private String version;

    @Override
    public String getSQLTypeName() throws SQLException {
        return "FICHIER_CR_TYPE";
    }

    @Override
    public void readSQL(SQLInput stream, String typeName) throws SQLException {
        idCr = stream.readInt();
        ...

    }

    @Override
    public void writeSQL(SQLOutput stream) throws SQLException {

        stream.writeInt(idCr);
        ...
    }
}

这是我的新 DDL(使用 CREATE TYPE 在数据库中创建类型):

create or replace TYPE            CR_TYPE AS OBJECT
( ID_CR NUMBER  ,               
ID_CHARGEMENT   NUMBER ,
NUM_AUTORISATION    VARCHAR2(24 BYTE),
VERSION NUMBER 
) ;

然后创建表类型:

CREATE OR REPLACE TYPE FICHIER_CR_TYPE 
AS VARRAY(1000) OF CR_TYPE;

程序变成:

create or replace PACKAGE             PACK_CHM_CR
IS
   PROCEDURE CHARGEMENT_CR(
                                                              P_FICHIER_CR                       IN OUT FICHIER_CR_TYPE,
                                                              p_nom_fichier                        IN        VARCHAR2,                                         
                                                              p_id_chargement                       OUT NUMBER,
                                                              NMES                                        OUT NUMBER,
                                                              LMES                                        OUT VARCHAR2);
END PACK_CHM_CR;

我使用的是 Oracle 11g、java 6,并且尝试过 ojdbc14 和 ojdbc6。

最佳答案

根据documentation of createArrayOf()

Array createArrayOf(String typeName, Object[] elements) throws SQLException

If the resulting JDBC type is not the appropriate type for the given typeName then it is implementation defined whether an SQLException is thrown or the driver supports the resulting conversion.

您的 typeName CHMCR.PACK_CHM_CR.FICHIER_CR_TYPE 是自定义的。尝试使用定义的类型并检查异常是否会消失。

请查找更多详细信息 here .

关于java - 将对象数组从 Java 传递到 PL/SQL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58026111/

相关文章:

java - 我们可以通过哪些不同方式创建一个不能子类化(扩展)的类?

java - 使用 STREAM API 在两个 HashMap 之间执行操作

java - 在java中读取起始索引和结束索引之间的行

sql - 无法创建表空间

mysql - 锁定表以从 MySQL InnoDB 存储过程进行插入

java - NXP NFC NDEF 标签内存大小问题

oracle - SQL查询-当表中的其他列具有特定值时,行分隔列

java - 在 Oracle SQL 上运行的通用语句 : DB Using Java

oracle - 无法从 Sqoop 调用 Oracle 存储过程

sql-server - 如何查看无法在 SQL Server 2008 R2 中修改的存储过程的定义?