【问题标题】:Common table expression defining a function in a cursor在游标中定义函数的公用表表达式
【发布时间】:2018-07-11 22:52:24
【问题描述】:

有人知道是否可以使用在 PL/SQL 游标内定义本地函数的公用表表达式吗?

例如,此代码对我产生错误:

DECLARE
  CURSOR LV_CUR IS
  WITH  function fct2(x number) return number is 
    begin
     return 2*x;
    end;
   TEMP_AV AS
    (
      SELECT
        fct2(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;

错误是:

ORA-06550:Ligne 3,冒号 18: PL/SQL: ORA-00905: mot-clé 不存在 ORA-06550: Ligne 3,结肠 3: PL/SQL:忽略 SQL 语句 ORA-06550:第 6 行,第 5 行: PLS-00103:在预期以下情况之一时遇到符号“END”: 开始函数杂注过程子类型类型 当前光标删除 之前存在

我能够在 PL/SQL 之外执行查询(使用包含函数定义的公用表表达式)。

【问题讨论】:

  • 我认为问题出在with function。在创建光标之前尝试创建函数。
  • 我尝试在declare bloc里面创建它,但是好像只能作为最后一个声明的对象,所以不能在游标中使用..
  • 我的意思是如果你在 pl/sql 之外声明函数
  • 好吧,但这是我想避免的!
  • 检查HERE WITH子句中的函数

标签: sql oracle plsql cursor common-table-expression


【解决方案1】:

是和不是。 The 12.1 docs for the CURSOR statement 明确表示:

对 select_statement 的限制

此 select_statement 不能有 WITH 子句。

这个文档在这种情况下是错误的,因为你可以有一个 WITH 子句,它显然不能有新的 12c PL/SQL 声明。例如,此块工作正常。

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;
/

【讨论】:

  • 事实上,我已经知道你提供的代码是有效的......我想知道我是否应该接受你的回答,因为对我的问题的回答似乎是否定的(而不是肯定和否定) ...但是您是对的,关于我给出的代码的结论..以及 Juan Carlos Oropez 评论中的链接更完整..
猜你喜欢
  • 2013-10-07
  • 2020-10-02
  • 1970-01-01
  • 2011-01-06
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多