公共表表达式,用于定义游标中的函数

时间:2018-02-01 14:58:36

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

有人知道是否可以使用在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,colonne 18:   PL / SQL:ORA-00905:mot-clé缺席   ORA-06550:Ligne 3,Colonne 3:   PL / SQL:忽略SQL语句   ORA-06550:Ligne 6,Colonne 5:   PLS-00103:遇到以下其中一项时遇到符号“END”:      开始函数编译指示程序子类型       当前游标删除      先前存在

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

1 个答案:

答案 0 :(得分: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;
/