使用存储过程出站通道适配器处理OUT参数

时间:2017-03-27 13:02:47

标签: spring-integration

我在项目中使用Spring Integration。我有一个奇怪的场景需要处理。当我连接到DB2数据库时,我的存储过程不会返回任何结果。所以,我使用int-jdbc:stored-proc-outbound-channel-adapterint:publish-subscribe-channel来执行存储过程并继续执行流程。

现在,Oracle数据库中的相同存储过程会返回一些结果。因此,使用int-jdbc:stored-proc-outbound-channel-adapter执行Oracle存储过程会导致问题,因为它需要定义一个额外的参数,即OUT

ORA-06550: line 1, column 7: PLS-00306: wrong number or types of arguments in call to ZSPPQINSERTUSERIDBA

有没有办法为OUT定义int-jdbc:stored-proc-outbound-channel-adapter参数,以便Oracle存储过程可以毫无问题地执行。

P.S。如果int-jdbc:stored-proc-outbound-channel-adapter没有返回任何内容,我最不感到困扰,但是存储过程应该成功执行OUT参数。

有没有办法管理这种情况?

  

更新

以下是我的Oracle存储过程:

create or replace
PROCEDURE ZSPPQINSERTUSERIDBA (

         P_USERID           char,
         P_BUSINESSAREA     char,
         P_SELECTEDIND      char,
         P_DEFAULTIND       char,
         P_LEGACYSYSTEM     char,
         P_LEGACYLOGIN      char,
         P_LEGACYPASSWORD   char,
         P_OTHERLOGIN       char,
         P_OTHERPASSWORD    char,
         P_ADDSECURLOGIN    char,
         P_ADDSECURPASSWORD char,
         P_LASTUPDATEUSERID char,
         P_LASTUPDATE       char, cur OUT SYS_REFCURSOR)

AS
BEGIN

OPEN cur FOR SELECT * from USERBUSINESSAREA
where (USERID       =  P_USERID
AND      BUSINESSAREA   =  P_BUSINESSAREA);

INSERT 
INTO    USERBUSINESSAREA    
        (
            USERID,
            BUSINESSAREA,
            SELECTEDIND,
            DEFAULTIND,
            LEGACYSYSTEM,
            LEGACYLOGIN,
            LEGACYPASSWORD,
            OTHERLOGIN,
            OTHERPASSWORD,
            ADDSECURLOGIN,
            ADDSECURPASSWORD,
            LASTUPDATEUSERID,
            LASTUPDATE
        )

VALUES  ( P_USERID,
          P_BUSINESSAREA,
          P_SELECTEDIND,
          P_DEFAULTIND,
          P_LEGACYSYSTEM,
          P_LEGACYLOGIN,
          P_LEGACYPASSWORD,
          P_OTHERLOGIN,
          P_OTHERPASSWORD,
          P_ADDSECURLOGIN,
          P_ADDSECURPASSWORD,
          P_LASTUPDATEUSERID,
          P_LASTUPDATE);

END;

1 个答案:

答案 0 :(得分:1)

就像Reference Manual中描述的那样:

<int-jdbc:sql-parameter-definition name="YOUR_OUT_PARAM" direction="OUT"/>

<强>更新

对于Oracle,您必须声明ignore-column-meta-data="true"并使用<int-jdbc:sql-parameter-definition>手动定义所有参数。

如果您的OUT参数为SYS_REFCURSOR,则sql-parameter-definition必须如下:

<int-jdbc:sql-parameter-definition name="CUR" direction="OUT" type="#{T(oracle.jdbc.OracleTypes).CURSOR}" />