Stored procedures 将参数动态传递给存储过程
我试图在db2中将值动态传递给以下存储过程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
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')
,因此他需要重载名称或使用默认参数(如果可用)。