将参数动态传递给存储过程

时间:2016-03-29 11:44:23

标签: stored-procedures dynamic db2 mule

我正在尝试将值动态传递给db2中的以下存储过程,

CREATE OR REPLACE PROCEDURE E_Enquiry 
    (IN SourceQueue1 VARCHAR(30), IN ExceptionId1 Integer, IN EventSource1 VARCHAR(30) ) 
LANGUAGE SQL
DYNAMIC RESULT SETS 1
BEGIN 
    DECLARE C1 CURSOR WITH RETURN TO CLIENT FOR 
        select CreationTime 
        from Exception_Message 
        where (SourceQueue=SourceQueue1 or ExceptionId=ExceptionId1 or EventSource=EventSource1); 
    open c1; 
END;

我在IBM Data Studio 3.1中创建了这个存储过程。 在这里,我试图将参数动态传递给值SourceQueue1,ExceptionId1或EventSource1。我的要求是,当至少传递上述参数之一时,该过程应该有效。如果只传递两个参数,则应搜索这两个参数并检索数据。谁能请我解决这个问题。 我试图通过Mule数据库连接器调用它。

3 个答案:

答案 0 :(得分:0)

SQL过程可以重载。创建具有相同名称和不同参数的过程。然后根据您调用过程的方式,调用名称和参数的正确过程。

示例为exceptionid重载了一个parm过程。

CREATE OR REPLACE PROCEDURE E_Enquiry 
    (IN ExceptionId1 Integer ) 
LANGUAGE SQL
DYNAMIC RESULT SETS 1
BEGIN 
    DECLARE C1 CURSOR WITH RETURN TO CLIENT FOR 
        select CreationTime 
        from Exception_Message 
        where (ExceptionId=ExceptionId1); 
    open c1; 
END;

答案 1 :(得分:0)

除了重载的答案@ danny117提供......

根据您使用的DB2的平台和版本,您可以为未传递的参数指定默认值。

使用DB2 for IBM i 7.1 TR5或更高版本,您可以执行以下操作

CREATE OR REPLACE PROCEDURE E_Enquiry 
    (IN SourceQueue1 VARCHAR(30) DEFAULT NULL
     , IN ExceptionId1 Integer DEFAULT NULL
     , IN EventSource1 VARCHAR(30) DEFAULT NULL) 

调用时,您可以使用命名参数,如下所示:

CALL E_ENQUIRY(ExceptionId1=>0201);

答案 2 :(得分:0)

对游标的WHERE子句进行简单修改应该可以解决问题:

where 
 (SourceQueue=SourceQueue1 or SourceQueue1 is null) and 
 (ExceptionId=ExceptionId1 or ExceptionId1 is null) and 
 (EventSource=EventSource1 or EventSource1 is null)