有人知道是否可以使用在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之外执行查询(使用包含函数定义的公用表表达式)。
答案 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;
/