我正在尝试将值动态传递给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数据库连接器调用它。
答案 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)