CLOB 和 int-jdbc:stored-proc-outbound-gateway

CLOB and int-jdbc:stored-proc-outbound-gateway

我正在尝试使用以下组件调用存储过程:

int-jdbc:stored-proc-outbound-gateway

它工作正常,它调用了过程,但我似乎无法以正确的 CLOB 格式记录 CLOB。 我尝试了以下 xml:

<int-jdbc:stored-proc-outbound-gateway
        id="auditGatewayProcedure" request-channel="auditGatewayInbound"
        data-source="dataSource" stored-procedure-name="PKG_TEMP.PR_AUDIT"
        return-value-required="false" ignore-column-meta-data="true">
        <int-jdbc:sql-parameter-definition
            name="IN_MSG_ID" />
        <int-jdbc:sql-parameter-definition
            name="IN_GUID" />
        <int-jdbc:sql-parameter-definition
            name="IN_CLOB" />
        <int-jdbc:parameter name="IN_MSG_ID" expression="payload.msgId" />
        <int-jdbc:parameter name="IN_CLOB" expression="payload.xmlPayload" />
        <int-jdbc:parameter name="IN_GUID" expression="payload.guid" />
</int-jdbc:stored-proc-outbound-gateway>

考虑到这一点,我将传递以下有效负载(使用适当的 getter 和 setter):

private long id;
private String msgId;
private Clob xmlPayload;
private String guid;

CLOB 的类型为:java.sql.Clob

我调用的过程很简单:

procedure PR_BRIDGE_AUDIT(in_msg_id IN varchar2,
                                 in_guid IN varchar2,
                                 in_clob IN Clob) is begin
    insert into tb_temp_all_messages(id,msg_id,xml_payload,guid) values (TB_TEMP_ALL_MESSAGES_SEQ.NEXTVAL,in_msg_id, in_clob, in_guid);

end;

发生的情况是插入的 clob 列具有以下值:

org.hibernate.lob.SerializableClob@186fdd6

我做的第二次尝试是在 spring 组件中强制输入类型,如下所示:

<int-jdbc:sql-parameter-definition
            name="IN_CLOB" type="CLOB"/>

但是抛出如下异常:java.lang.ClassCastException: org.hibernate.lob.SerializableClob cannot be cast to oracle.sql.CLOB

我是不是做错了什么?

我尝试 google 但没有任何有价值的东西(据我所知)出现。

提前致谢!

更新

因此,经过一些尝试和 Artem 的回答,解决方案似乎有两种:

鉴于此 XML:

<int-jdbc:stored-proc-outbound-gateway
        id="auditGatewayProcedure" request-channel="auditGatewayInbound"
        data-source="dataSource" stored-procedure-name="PKG_TGT_BRIDGE.PR_BRIDGE_AUDIT"
        return-value-required="false" ignore-column-meta-data="true">
        <int-jdbc:sql-parameter-definition
            name="IN_MSG_ID" />
        <int-jdbc:sql-parameter-definition
            name="IN_GUID" />
        <int-jdbc:sql-parameter-definition
            name="IN_CLOB" type="CLOB"/>
        <int-jdbc:parameter name="IN_MSG_ID" expression="payload.msgId" />
        <int-jdbc:parameter name="IN_CLOB" expression="payload.stringClob" />
        <int-jdbc:parameter name="IN_GUID" expression="payload.guid" />
</int-jdbc:stored-proc-outbound-gateway>

在 EEM class 中,您可以传递包含 Clob (stringClob) 的字符串。 或者使用 Artem 所说的内容创建一个正确的 oracle.sql.CLOB 类型,并将 oracle.sql.CLOB 创建的 IN_CLOB 参数传递给 oracle.sql.CLOB。

希望这对您有所帮助,

谢谢

您确实必须在与 <int-jdbc:stored-proc-outbound-gateway> 相同的交易中自己创建 oracle.sql.CLOB 的问题。

创建 CLOB 的代码可能如下所示:

public CLOB convertToClob(String value) {
    CLOB c = CLOB.createTemporary(getNativeConnection(), false, CLOB.DURATION_SESSION);
    c.setString(1L, value);
    return c;
}

private Connection getNativeConnection() {
    return DataSourceUtils.getConnection(this.dataSource).getMetaData().getConnection();
}