Oracle PL/SQL 在原始选择和分层选择之间切换

Posted

技术标签:

【中文标题】Oracle PL/SQL 在原始选择和分层选择之间切换【英文标题】:Oracle PL/SQL switch between raw and hierarchical select 【发布时间】:2017-04-25 12:12:33 【问题描述】:

我需要在一个 Oracle PL/SQL 选择中根据某些变量在原始选择和分层选择语句之间切换。但是,不能在 select 中使用 If 语句。 比如我有分层语句

select a.*
from myTable a
start with a.id = varValue
connect by prior a.id = a.parentId

如果某个 varCondition 为 0。 如果 varCondition = 1 那么 select 应该给出与语句结果相同的结果 select a.* from myTable a where a.id = varValue 类似select a.* from myTable a start with a.id = varValue connect by prior a.id = decode(varCondition, ...)

有可能吗?

【问题讨论】:

您的问题中没有 PL/SQL。只有普通的 SQL。但我认为这对于普通的 SQL 是不可能的。只要connect by 是语句的一部分,它将是一个递归语句。但使用 PL/SQL 和使用动态 SQL 的函数可能确实有可能 谢谢。问题是我需要使用 sql 作为 Apex Interactive Report 的来源,并认为我可以通过使用修改后的 sql 语句来解决这个问题。 【参考方案1】:

您可以在CONNECT BY 子句中使用NULL 以确保当您的varCondition 变量为1 时它始终为假,并在其他情况下使用层次结构:

SELECT      *
FROM        myTable
START WITH  id = varValue
CONNECT BY  PRIOR id = DECODE( varCondition, 1, NULL, parentId )

【讨论】:

谢谢,就是这样。【参考方案2】:

你可以这样做:

PROCEDURE GET_RECORDS(v_action IN VARCHAR2)
IS
CURSOR get_records
IS
       IF(v_action = 'DO THIS') THEN
           SELECT * from <THIS>;
       ELSE
           SELECT * from <THAT>;
       END IF;
BEGIN
       OPEN get_records;

       FETCH get_records
       INTO v_thing;

       v_loop := 0;
       WHILE get_records%FOUND
       LOOP

           FETCH get_records
           INTO v_thing;

       END LOOP;
       CLOSE get_records;
END;

(来源:[Conditionally define a Cursor in Oracle)

或者你可以使用这个:

declare
   SQL_Text varchar2(32760) := 'select * from dual'; --your query goes here
   SQL_Text2 varchar2(32760) := 'select * from dual'; --your query goes here
   cur sys_refcursor;
begin
   IF some_condition THEN
     open cur for SQL_Text;
   ELSE
     open cur for SQL_Text2;
   END IF;
   -- ...
end;

【讨论】:

以上是关于Oracle PL/SQL 在原始选择和分层选择之间切换的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL Developer - 使用 Job Wizard PL/SQL 的基本选择查询

Oracle之PL/SQL编程_流程控制语句

pl/sql:在oracle中选择作为函数的参数/参数

oracle 10g pl/sql 有条件的循环选择

借助PL/SQL Developer将Oracle某用户数据表导出

构建一些动态查询选择并立即在 Oracle PL/SQL 中显示其输出