IF ELSE检查变量值而无需定义整个结果集

时间:2015-07-01 19:53:55

标签: oracle plsql

我有两个类似的查询用于工作研究,我正在尝试使用布尔变量来决定运行哪一个。

问题:

为了保存变量,我想我需要使用PL / SQL块,这似乎要求我定义结果集的每一列并批量收集到结果集中。我将此设置为我的同事的模板,其中大多数人只知道非常基本的SQL,所以我不能要求他们定义新的列。

有没有办法允许他们设置布尔变量并在PL / SQL块之外运行相应的SQL查询?有没有更好的方法呢?

我到目前为止(不起作用):

Declare Submit_Denied_Lines Boolean;
Begin Submit_Denied_Lines := True; --or false depending on their needs

If Submit_Denied_Lines = False Then
    GOTO Qry_Status_X;
Else
    GOTO Qry_Resolution;
END IF;
END;

<<Qry_Status_X>>

(The Status_X query)

GOTO The_End;

<<Qry_Resolution>>

(The Resolution query)

<<The_End>>

备注:

如果我要求的是不可能的,我会发布两个SQL文件供他们使用,并留下关于哪一个适用于哪种情况的说明。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

你遗失了很多信息。它是相同的选择,但具有不同的标准? (where子句)或完全不同的

这是一种完全不同的方法。 这是可以运行的

declare
    submit_denied_lines   boolean := true;
begin
    if submit_denied_lines then
        for i in (select 'Status_X' as t from dual) loop
            dbms_output.put_line (i.t);
        end loop;
    else
        for i in (select 'Qry_Resolution' as t from dual) loop
            dbms_output.put_line (i.t);
        end loop;
    end if;
end;

如果select子句相同但where子句不同,那么这是一个这是可运行的

declare
    submit_denied_lines   boolean := true;
    test                  char (1);
begin
    /* can't use boolean in the SQL engine */
    if (submit_denied_lines) then
        test := '1';
    else
        test := '0';
    end if;

    for i
        in (select *
              from user_objects
             where (user_objects.object_type = 'TABLE' and test = '1') or (user_objects.object_type = 'VIEW' and test = '0')) loop
        dbms_output.put_line (i.object_name);
    end loop;
end;