【问题标题】:How to pass an array of Java strings as CLOBS to an oracle stored procedure that takes an array of CLOBS如何将 Java 字符串数组作为 CLOBS 传递给采用 CLOBS 数组的 oracle 存储过程
【发布时间】:2017-09-22 15:51:39
【问题描述】:
我有一个 Oracle 存储过程,它接受一组需要使用 JDBC 从 Java 调用的 clob。我在我的 java 代码中有一个 Set 数据。
尝试了几种不同的方法,但似乎没有任何效果。任何人都有示例代码来执行此操作,请发布。
存储过程的开发人员定义了一个名为“CLOB_ARRAY”的自定义数据类型,它是一个 CLOBS 表。
当它是一个 VARCHAR 数组时,它可以正常工作。
【问题讨论】:
标签:
java
oracle
stored-procedures
jdbc
clob
【解决方案1】:
我找到了使用 Oracle 类型和结构的解决方法。以下是解决方案的摘要。
第1步:
创建如下类型 - 这必须使用 SQL Developer 或 SQL Plus 在数据库级别完成。不在包装内
创建或替换 TYPE_DTAP_RECORD_STORE AS OBJECT(DATA_STORE_ID VARCHAR2(300), INDEX_RECORD CLOB);
第 2 步:
在包中定义上述类型的数组
TYPE RECORD_ARRAY 是 BINARY_INTEGER 的 TYPE_DTAP_RECORD_STORE 索引表
STEP 3 : 创建存储过程如下
程序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();
}