如何将一组Java字符串作为CLOBS传递给一个带有CLOBS

时间:2017-09-22 15:51:39

标签: java oracle stored-procedures jdbc clob

我有一个Oracle存储过程,它接受需要使用JDBC从Java调用的clob数组。我在我的java代码中将数据作为Set。 尝试了几种不同的方法,似乎没有任何工作。任何人都有示例代码,请发布。

存储过程的开发人员定义了一个名为" CLOB_ARRAY"的自定义数据类型。这是一个CLOBS表。 当它是一个VARCHAR数组时,它可以正常工作。

1 个答案:

答案 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();


}