在游标中定义函数的常用 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;
/
有人知道是否可以使用在 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;
/