我有一个Oracle存储过程,它接受需要使用JDBC从Java调用的clob数组。我在我的java代码中将数据作为Set。 尝试了几种不同的方法,似乎没有任何工作。任何人都有示例代码,请发布。
存储过程的开发人员定义了一个名为" CLOB_ARRAY"的自定义数据类型。这是一个CLOBS表。 当它是一个VARCHAR数组时,它可以正常工作。
答案 0 :(得分:0)
我找到了一个使用Oracle Type和Struct的工作。以下是解决方案的摘要。 步骤1: 创建如下所示的类型 - 这必须使用SQL Developer或SQL Plus在数据库级别完成。不在包
中创建或替换TYPE TYPE_DTAP_RECORD_STORE AS OBJECT(DATA_STORE_ID VARCHAR2(300),INDEX_RECORD CLOB);
第2步: 在包中定义上述类型的数组 TYPE RECORD_ARRAY是TYPE_DTAP_RECORD_STORE索引表BINARY_INTEGER
步骤3:如下创建存储过程 procedure baseline_record_insert_bulk(record_array中的i_record);
第4步:
在Java中,编写如下的DAO方法来调用存储过程
public void bulkAddToRecordStore(Map<String,String> jsonArray) throws SQLException {
List<Object>recordList = new ArrayList<>();
OracleConnection oraConnection = getConnection();
OracleCallableStatement cs =(OracleCallableStatement) getConnection().prepareCall("BEGIN SCHEMA.PACKAGE.baseline_record_insert_bulk(?, ?); END;")
for(String key :jsonArray.keySet()){
Clob clob=oraConnection.createClob();
clob.setString(1, jsonArray.get(key));
Struct rec=oraConnection.createStruct("SCHEMA.TYPE_DTAP_RECORD_STORE", new Object[]{key,clob});
recordList.add(rec);
}
Array sqlArray = oraConnection.createOracleArray("SCHEMA.PACKAGE.RECORD_ARRAY", recordList.toArray());
cs.setObject(1, sqlArray);
cs.execute();
sqlArray.free();
cs.close();
}