【发布时间】:2011-02-08 22:35:14
【问题描述】:
我有一个带有多个参数的 PL/SQL 过程。 webapp调用过程时,如果不使用某个参数,则传递为null,即
procedure test (param1 in varchar2, param2 in varchar2, param3 in varchar2, cursor out sys_refcursor)
...
end procedure test;
我想进行一个 SQL 查询,其中只有当参数不为空时,我才会在 WHERE 子句中包含给定的参数。除了在字符串中构建 SQL 查询然后打开该字符串的游标之外,有没有办法以一种优雅的方式实现这一点,就像这样
vSQL := 'SELECT * from TABLE WHERE something = something_else';
if param1 IS NOT NULL
vSQL := vSQL || 'AND some_param = ' || param1;
【问题讨论】:
-
我想指出,如果参数曾经暴露给用户,这是一个典型的代码示例,具有很高的 SQL*Injection 风险。所以你应该使用 DBMS_ASSERT 来检查你的最终 SQL 是否有良好的行为。