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

Stored procedures 将参数动态传递给存储过程,stored-procedures,dynamic,db2,mule,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

我试图在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;
我在IBMDataStudio3.1中创建了这个存储过程。 在这里,我尝试将参数动态地传递给值SourceQueue1,ExceptionId1或EventSource1。我的要求是,当至少通过上述参数中的一个时,该过程应该工作。如果只传递了两个参数,则应搜索这两个参数并检索数据。谁能给我一个解决这个问题的办法吗。
我正试图通过Mule数据库连接器调用它。

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;

除了提供的重载答案@danny117之外

根据您使用的DB2平台和版本,您可能能够为未传递的参数分配默认值

使用DB2forIBMi7.1TR5或更高版本,您可以执行以下操作

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);

对游标的
WHERE
子句的简单修改应该可以实现以下目的:

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

嗨,丹尼,谢谢你。我有以下疑问。这对DB2也适用吗?如果它能工作,那么我需要从过程中删除REPLACE并重载它吗?在DB2中,重载存储过程由参数的数量而不是它们的类型(或名称)来解析。换句话说,不可能确定调用
E_Enquiry(?)
的三个可能变体中的哪一个。即使如此,其中两个参数的类型还是相同的,因此无论如何都是不明确的。@Mustacio我不知道db2重载过程是按parm计数的。感谢您的更新。多个可选参数通常意味着动态SQL。出于某种原因,这不是一种选择吗?您仍然希望将其准备为参数化以避免SQL注入,但只有三个参数非常容易编写(尤其是像这样)。嗨,Charles,在添加默认NULL时,我可以看到它正在检查数据库中的NULL值。但我想要的是,如果我只传递SourceQueue1和ExceptionId1的值,那么它应该检查这两个值,并忽略EventSource1。但是,如果我将默认值设为NULL,那么它也会检查EventSource1的NULL值。请在这件事上帮助我,不应该这样
其中COL1=MYVAL
即使两个值都为空,也不会为真。此外,你在给测试打电话。也许您需要@mustaccio answer中的
WHERE
子句。正如我所读到的,OP希望能够
调用E_Enquiry('SOMEVAL')
,因此他需要重载名称或使用默认参数(如果可用)。