【问题标题】:PL/SQL: Use 'IF' statement outside 'WITH ... AS' clausePL/SQL:在“WITH ... AS”子句之外使用“IF”语句
【发布时间】:2017-06-07 21:49:37
【问题描述】:

我正在尝试编写一个使用子查询因子分解“WITH .. AS”的过程,但是当我在它之前使用“IF .. THEN”时,出现语法错误,我不知道该怎么写,有什么帮助吗?

  BEGIN
  OPEN my_SYS_REFCURSOR FOR
   IF .. IS NULL
   THEN
     WITH SomeName
          AS (SELECT.....);

【问题讨论】:

  • 您可能会收到此错误,因为OPEN...FOR 需要一条 SQL 语句,而 IF ... THEN 是一个 PL/SQL 构造。你想达到什么目标?你的ELSE 部分是什么样的?
  • 我真正需要我的程序来查看 lije 是 BEGIN OPEN my_SYS_REFCURSOR FOR WITH SomeName AS ( IF .. IS NULL THEN SELECT.....); 但我也遇到了语法错误。
  • 正如我之前提到的:这是不可能的。您不能在 SQL 语句中使用 IF。请edit 您的问题并添加更多信息:您的ELSE 部分是什么样的?还是只在满足条件的情况下才打开引用游标,如果不满足,就让它保持未初始化状态?
  • Safaa,你的问题纯粹是语法问题。仔细查看 SQL 和 PL/SQL 游标构造规则,您应该会找到问题的答案。 IF THEN 是一个 PL/SQL 结构。您需要将其翻译成 SQL。
  • 如果满足条件,则必须打开从某些表中读取的游标;如果条件不满足,怎么办?不要打开光标?打开它,但从不同的表中读取数据?打开一个没有行的游标?

标签: oracle if-statement plsql syntax subquery-factoring


【解决方案1】:

您只需将IF 语句与OPEN 分开即可:

declare
    my_sys_refcursor sys_refcursor;
begin
    if (1=1) then /* condition satisfied, cursor from some table */
        open my_sys_refcursor for
        with somename as ( select '1' as one from dual)
        select one
        from somename;
    else  /* condition not satisfied, select from different tables */
        open my_sys_refcursor for
        with someOthername as ( select 'one' as one from dual)
        select one
        from someOthername;
    end if;
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 2013-03-12
    相关资源
    最近更新 更多