【问题标题】:Oracle Stored Procedure - Spring Integration - OUT Type ObjectOracle 存储过程 - Spring 集成 - OUT 类型对象
【发布时间】:2015-10-03 16:58:26
【问题描述】:

是否可以将 Oracle 类型的对象作为存储过程的输出,并使用 spring 集成进行调用?

例如,我在数据库中有以下内容:

create or replace TYPE ESP_TRAINING_REQ_OBJ AS OBJECT 
(
    v_param1 varchar2(25),
    v_param2 varchar2(25)
);

create or replace TYPE ESP_TRAINING_RESP_OBJ AS OBJECT 
(
    v_param1 varchar2(25),
    v_param2 varchar2(25)
);

create or replace PROCEDURE TEST_PROC (
    v_req_obj IN ESP_TRAINING_REQ_OBJ,
    v_resp_obj OUT ESP_TRAINING_RESP_OBJ
) AS
BEGIN
    v_resp_obj := ESP_TRAINING_RESP_OBJ(v_req_obj.v_param2, v_req_obj.v_param1);
    dbms_output.put_line('TEST_PROC');
END;

但是,当我尝试调用它时,出现以下异常:

PLS-00306:调用“TEST_PROC”时参数的数量或类型错误

请在下面找到spring集成配置:

<int-jdbc:stored-proc-outbound-gateway
        id="ESP_TRAINING" request-channel="inputChannel"
        stored-procedure-name="TEST_PROC" data-source="dataSource"
        reply-channel="outputChannel"
        skip-undeclared-results="false" ignore-column-meta-data="true">

        <int-jdbc:sql-parameter-definition name="v_req_obj" direction="IN" type="STRUCT" />
        <int-jdbc:sql-parameter-definition name="v_resp_obj" direction="OUT" type="STRUCT" />

        <int-jdbc:parameter name="v_req_obj" expression="payload.v_req_obj"/>

    </int-jdbc:stored-proc-outbound-gateway>

请注意,如果我们更改上面的 SP 声明,仅在请求中使用 STRUCT,例如将 ESP_TRAINING_RESP_OBJ 替换为 VARCHAR 或任何其他 Oracle 原始数据类型,它会正常工作。

例如:

create or replace PROCEDURE TEST_PROC (
    v_req_obj IN ESP_TRAINING_REQ_OBJ,
    v_status OUT VARCHAR2
) AS
BEGIN
    v_status := v_req_obj.v_param1 || ' and ' || v_req_obj.v_param2;
    dbms_output.put_line('TEST_PROC');
END;

【问题讨论】:

    标签: java spring oracle stored-procedures spring-integration


    【解决方案1】:

    我已通过以下方式修复它:

    1. 将 spring 集成版本更新为 3.0.0.RELEASE, 在 sql-parameter-definition 中支持类型名称和返回类型属性。

    2. 更新存储过程声明如下:

      <int-jdbc:stored-proc-outbound-gateway
          id="ESP_TRAINING" request-channel="inputChannel"
          stored-procedure-name="TEST_PROC" data-source="dataSource"
          reply-channel="outputChannel"
          skip-undeclared-results="false" ignore-column-meta-data="true">
      
              <int-jdbc:sql-parameter-definition name="v_req_obj" direction="IN" type="STRUCT" />
              <int-jdbc:sql-parameter-definition name="v_resp_obj" direction="OUT" type="STRUCT" type-name="ESP_TRAINING_RESP_OBJ" return-type="espTrainingRespObj" />
      
              <int-jdbc:parameter name="v_req_obj" expression="payload.v_req_obj"/>
      
      </int-jdbc:stored-proc-outbound-gateway>
      
      <beans:bean id="espTrainingRespObj" class="com.hsbc.esp.EspTrainingRespObj"/>
      
    3. 改变EspTrainingRespObj实现SQLReturnType,如下:

      public class EspTrainingRespObj implements SqlReturnType {
      
          private String param1;
          private String param2;
      
          public Object getTypeValue(CallableStatement cs, int paramIndex,     int sqlType, String typeName) 
              throws SQLException {
              Object[] attributes = ((STRUCT) cs.getObject(paramIndex)).getAttributes();
              this.param1 = (String) attributes[0];
              this.param2 = (String) attributes[1];
              return this;
          }
      ...
      }
      

    【讨论】:

      【解决方案2】:

      &lt;int-jdbc:sql-parameter-definition&gt; 上的return-type OUT 参数和SqlReturnStruct 必须帮助您解决问题。

      框架源代码中的测试用例包含此CLOB 处理示例:

      <int-jdbc:stored-proc-outbound-gateway request-channel="getMessageChannel"
                                             data-source="dataSource"
                                             stored-procedure-name="GET_MESSAGE"
                                             ignore-column-meta-data="true"
                                             expect-single-result="true"
                                             reply-channel="output2Channel">
          <int-jdbc:sql-parameter-definition name="message_id"/>
          <int-jdbc:sql-parameter-definition name="message_json" type="CLOB" direction="OUT" type-name="" return-type="clobSqlReturnType"/>
          <int-jdbc:parameter name="message_id" expression="payload"/>
      </int-jdbc:stored-proc-outbound-gateway>
      
      <bean id="clobSqlReturnType" class="org.mockito.Mockito" factory-method="spy">
          <constructor-arg>
              <bean class="org.springframework.integration.jdbc.storedproc.ClobSqlReturnType"/>
          </constructor-arg>
      </bean>
      

      【讨论】:

      • 谢谢!它帮助我解决了问题。
      猜你喜欢
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 2017-06-08
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      相关资源
      最近更新 更多