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();
}
我正在尝试使用以下组件调用存储过程:
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();
}