【问题标题】:WITH Clause inside PL-SQLPL-SQL 中的 WITH 子句
【发布时间】:2016-06-22 19:04:22
【问题描述】:

我正在尝试在 PL-SQL 块中使用“WITH”子句:

使用 WITH 子句的游标如下:

  CURSOR c_API_MSG
  IS
      WITH SAMI AS (SELECT * FROM NAGENDRA WHERE STATUS = 'NEW')
      SELECT * FROM SAMI WHERE ROWNUM <= TO_NUMBER (10);

执行:

FOR v_Rec IN c_API_MSG
  LOOP
     BEGIN
        -- My LOGIC
END;
END LOOP;

它没有正确执行。它不会进入循环内部。似乎游标无法获取行,这就是退出的原因。

没有 with 子句的正常子查询工作正常。 With 子句在编辑器上运行良好。

使用 'WITH' 子句是否有任何限制,或者我在这里遗漏了什么?

观察:

在 toad 编辑器中带有以下查询:

如果我使用 f9(正常执行):找到 5 行(正确结果)

如果我使用 f5 :找不到行(这是我担心的)

      WITH SAMI AS (SELECT * FROM NAGENDRA WHERE STATUS = 'NEW')
      SELECT * FROM SAMI WHERE ROWNUM <= TO_NUMBER (10);

【问题讨论】:

  • 您是否已提交对 NAGENDRA 表所做的所有更改?
  • 顺便说一句:TO_NUMBER (10) ...您正在将数字转换为数字?何必?只需改用10
  • 请显示您正在运行的完整真实代码。有 > 99% 的概率,你的逻辑有缺陷。将其剥离为minimal reproducible example,并提供表格定义和内容(如果您无法发布真实数据,可能会提供虚拟数据)。
  • 另外,根据 TOAD 文档,F9 运行单个语句,而 F5 运行所有语句。我的猜测是您执行了多个语句,最后一个语句不返回任何数据。但同样:除非您提供更多信息,否则无法为您提供帮助。
  • 感谢大家的回复。 @MarcinWroblewski:是的,已提交更改。

标签: plsql oracle11g


【解决方案1】:

嘿,是的,PLSQL 支持“WITH”子句。请看下面的sn-p。

SET sqlbl ON;
SET serveroutput ON;
DECLARE
  CURSOR LV_CUR
  IS
  WITH
    TEMP_AV AS
    (
      SELECT
        LEVEL
      FROM
        DUAL
        CONNECT BY LEVEL < 10
    )
SELECT
  *
FROM
  TEMP_AV;
BEGIN
  FOR I IN LV_CUR
  LOOP
    NULL;
    dbms_output.put_line(i.level);
  END LOOP;
END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-07
    • 2016-08-28
    • 1970-01-01
    • 2016-09-27
    • 2023-03-11
    • 1970-01-01
    • 2018-01-24
    • 2011-08-07
    相关资源
    最近更新 更多