可选参数作为游标中的条件(PL / SQL)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可选参数作为游标中的条件(PL / SQL)相关的知识,希望对你有一定的参考价值。

我有一个带可选参数的函数/过程。如果提供,我需要使用参数作为游标的条件。如果没有提供,那么我不想要那个条件。

这是我提出的一个非常简化的版本:

create or replace procedure check_data
  (p_parm1 in varchar2 default null,
   p_parm2 in number default null)
is
begin
  if (p_parm1 is null && p_parm2 is null) then
    for rec in (select col_1, col_2
        from table_a)
    loop
      /*Statements, use rec.col_1 and rec.col_2 */
    end loop;
  elsif (p_parm1 is null) then
    for rec in (select col_1, col_2
                from table_a
                where /*condition using p_parm2 */)
    loop
      /*Statements, use rec.col_1 and rec.col_2 */
    end loop;
  elsif (p_parm2 is null) then
    for rec in (select col_1, col_2
                from table_a
                where /*condition using p_parm1 */)
    loop
      /*Statements, use rec.col_1 and rec.col_2 */
    end loop;
  else
    for rec in (select col_1, col_2
                from table_a
                where /*condition using p_parm1 */
                  and /*condition using p_parm2 */)
  loop
      /*Statements, use rec.col_1 and rec.col_2 */
    end loop;
  end if;
end;

有没有办法让Cursor一次,如果没有提供参数,指出要忽略哪些条件?

答案

你可以让查询一次性处理所有场景,例如:

select col_1, col_2
from table_a
where (p_parm1 IS NULL OR (p_parm1 = ...))
AND   (p_parm2 IS NULL OR (p_parm2 = ...));
另一答案

也可以使用nvl,它有点短:

select col1, col2
from table_a
where col1 = nvl(p_parm1,col1)
and col2 = nvl(p_parm2,col2);

那么你做什么:当p_parm1为null时,你将它等于条件的列(在你将col1与p_parm1进行比较的情况下)。

另一答案
create or replace procedure check_data
  (p_parm1 in varchar2 default null,
   p_parm2 in number default null)
is
begin
    select col1, col2
    from table_a
    where (CASE
      WHEN (p_parm1 IS NOT NULL AND col1 = p_parm1) THEN (1)
      WHEN (p_parm1 IS NULL) THEN (1)
      ELSE 0
    END) = 1

如果需要,p_parm2也是如此。

以上是关于可选参数作为游标中的条件(PL / SQL)的主要内容,如果未能解决你的问题,请参考以下文章

where 条件中的可选参数 - 如何提高性能 - PL/SQL

PL/SQL 游标使用参数作为列名

PL SQL 中的游标

Oralce-PL/SQL编程-游标

Oracle 修改 sys refcursor 并在 PL/SQL 中返回修改后的游标

oracle PL/SQL编程语言之游标的使用