我使用的是DB2 V9
我有可能潜在地作为空字符串传递PARAMATERS的存储过程。 这里森玛什么,我试图做的伪代码:
WHERE myColumn.name =
IF param1 = '' THEN
**disregard this param, all column values are eligible**
ELSE
myColumn.name = param1;
基本上忽略帕拉姆如果它是一个空字符串。 如果没有,申请它作为在WHERE子句中的过滤器。 这是可能的DB2做什么?
SELECT ...
FROM ...
WHERE param1 = ''
OR myColumn.name = param1
;
该答案提供wildplasser是正确的,但也有一些额外的考虑,可能有助于包括。
首先,有可能是存储过程的输入参数包含一个NULL,而不是'。 使用COALESCE或NULLIF函数包括一个NULL和的空的空间的任何量:
SELECT ... FROM ... WHERE COALESCE( param1, '' ) = '' OR myColumn.name = param1 ;
当这种类型的搜索查询被编译成一个存储过程,它通常有助于在程序中的语句始终启用REOPT。 如果你不这样做,你的存储过程中的SQL语句将始终使用相同的访问计划,不管是哪个输入参数传递到运行时的存储过程。 允许在运行时的程序优化,以重新评估每一个语句将提供利用的右手食指的一个更好的机会,当特定的栏用户搜索。
CALL SYSPROC.REBIND_ROUTINE_PACKAGE
('P','YOURPROCSCHEMA.YOURPROCNAME','REOPT ALWAYS') ;
这里的另一个关键词是“ 动态SQL ”。 建立你的查询作为一个字符串,要么EXECUTE IMMEDIATE
它们(UPDATE,INSERT或DDL的),或使用PREPARE
/ OPEN
/ FETCH
(用于SELECT的)。