Я пытаюсь вызвать хранимую процедуру, используя следующие компоненты:CLOB и ИНТ-JDBC: сохраненный-прок-исходящий шлюз
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>
Имея это в виду, я передаю следующую полезную нагрузку (с соответствующими добытчиками и сеттеров):
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 вставляется со следующим значением:
[email protected]
Второй попыткой я заставлял тип в весенней компоненте, например:
<int-jdbc:sql-parameter-definition
name="IN_CLOB" type="CLOB"/>
Но следующее исключение брошен: java.lang.ClassCastException: org.hibernate.lob.SerializableClob cannot be cast to oracle.sql.CLOB
Я делаю что-то неправильно?
Я попытался это сделать, но ничего ценного (насколько я видел) появился.
Заранее благодарен!
UPDATE
Таким образом, после некоторых попыток и ответ от 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). Или создайте правильный тип oracle.sql.CLOB с тем, что было сказано Артемом, и перейдите в параметр IN_CLOB, созданный oracle.sql.CLOB.
Надеется, что это помогло,
Благодаря
Я пытаюсь это прямо сейчас. @ArtemBilan Тем временем я заметил, что если я передам String в предположительно CLOB-параметре, он правильно перемалывает его и с удовольствием помещает его в базу данных ... Я предполагаю, что могу пропустить часть, где я создаю временный CLOB и передать прямо значение String? – Massimo
м-м-м.Попытайтесь поставить на этот парам действительно большую строку, больше, чем символы '4000' –
Он отлично работает в обоих случаях (я пробовал с помощью String и Clob длины> 4500 Спасибо за помощь! – Massimo