无法将 WITH FUNCTION 子句放入 BEGIN/END 块中

Unable to put a WITH FUNCTION clause in a BEGIN/END block

为什么下面的代码不能编译:

DECLARE
c number;
BEGIN
WITH
FUNCTION calculate(i IN NUMBER) RETURN NUMBER
AS
r number;
BEGIN
  r := i*i;
  RETURN r;
END;
select calculate(1) INTO c from dual;
END;

出现以下错误:

Error report -
*ORA-06550: line 5, column 10:
PL/SQL: ORA-00905: missing keyword
ORA-06550: line 4, column 1:
PL/SQL: SQL Statement ignored

鉴于:

WITH
FUNCTION calculate(i IN NUMBER) RETURN NUMBER
AS
r number;
BEGIN
  r := i*i;
  RETURN r;
END;
select calculate(1) from dual;

编译?

Oracle 版本信息

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production

PL/SQL 似乎还不支持此构造。估计会在以后的版本中加入。

与此同时,它令人不快,但您可以使用动态 SQL,它会继续 运行 您在 SQL 上下文中的工作语句,其中可以理解:

DECLARE
  c number;
BEGIN
  EXECUTE IMMEDIATE '
WITH
FUNCTION calculate(i IN NUMBER) RETURN NUMBER
AS
  r number;
BEGIN
  r := i*i;
  RETURN r;
END;
select calculate(2) from dual'
  INTO c;
  DBMS_OUTPUT.PUT_LINE(c);
END;
/

4

The documentation for select into 并未表明 PL/SQL 中支持 with 子句,即使对于子查询块也是如此,但即使在早期版本中也确实如此。所以它也不引用新的 PL/SQL 声明语法。根据在 Oracle Live SQL 平台上的实验,即 运行ning 12.2.0.1,12cR2 也不支持它。