java - Oracle 存储过程 - Spring 集成 - OUT 类型对象

标签 java spring oracle stored-procedures spring-integration

是否可以将 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: wrong number or types of arguments in call to '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;

最佳答案

我已经修复了它,执行以下操作:

  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;
        }
    ...
    }
    

关于java - Oracle 存储过程 - Spring 集成 - OUT 类型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31417078/

相关文章:

java - HTML 到 Textile Java 库

java - UDP 的更多问题

java - 异常 : Error creating bean with name 'richBean'

Oracle - Autotrace 中的一致性获取与 SQL TRACE 中的一致性读取之间的区别

mysql - 如何获取两个日期之间的时差(以小时为单位)

java - Webview 在被用户杀死后没有恢复状态

java - 给定输入得到错误的输出

java - Spring 安全 : How to change default user and password?

java - 微服务之间的通信、共享实体或其他 hell

oracle - ELSE 如果在 PL/SQL 中不起作用