gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:23:32 25 4
gpt4 key购买 nike

我正在尝试使用对象数组创建 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com