2015-04-08 1 views
1

Я пытаюсь вызвать хранимую процедуру, используя следующие компоненты: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.

Надеется, что это помогло,

Благодаря

ответ

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(); 
} 
+0

Я пытаюсь это прямо сейчас. @ArtemBilan Тем временем я заметил, что если я передам String в предположительно CLOB-параметре, он правильно перемалывает его и с удовольствием помещает его в базу данных ... Я предполагаю, что могу пропустить часть, где я создаю временный CLOB и передать прямо значение String? – Massimo

+0

м-м-м.Попытайтесь поставить на этот парам действительно большую строку, больше, чем символы '4000' –

+0

Он отлично работает в обоих случаях (я пробовал с помощью String и Clob длины> 4500 Спасибо за помощь! – Massimo