在游标中定义函数的常用 table 表达式

Common table expression defining a function in a cursor

有人知道是否可以使用在 PL/SQL 游标内定义局部函数的通用 table 表达式吗?

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

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, colonne 18 : PL/SQL: ORA-00905: mot-clé absent ORA-06550: Ligne 3, colonne 3 : PL/SQL: SQL Statement ignored ORA-06550: Ligne 6, colonne 5 : PLS-00103: Encountered the symbol "END" when expecting one of the following: begin function pragma procedure subtype type current cursor delete exists prior

我能够在 PL/SQL.

之外执行查询(使用包含函数定义的通用 table 表达式)

是也不是。 The 12.1 docs for the CURSOR statement 明确地说:

Restriction on select_statement

This select_statement cannot have a WITH clause.

这个文档在这种情况下是错误的,因为你 can 有一个 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;
/