我尝试使用以下组件调用存储过程:
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
我做的第二次尝试是强制弹簧组件中的类型,如下所示:
<int-jdbc:sql-parameter-definition
name="IN_CLOB" type="CLOB"/>
但抛出以下异常:java.lang.ClassCastException: org.hibernate.lob.SerializableClob cannot be cast to oracle.sql.CLOB
我做错了吗?
我试图谷歌它,但没有任何有价值的东西(据我所见)。
提前致谢!
更新
所以,经过一些尝试和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类中,您可以传递包含Clob(stringClob)的字符串。 或者使用Artem所说的内容创建一个正确的oracle.sql.CLOB类型,并将oracle.sql.CLOB创建的IN_CLOB参数传递给它。
希望这有帮助,
由于
答案 0 :(得分:1)
您必须自己创建oracle.sql.CLOB
并且在与<int-jdbc:stored-proc-outbound-gateway>
相同的交易中创建的问题。
创建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();
}