无法将 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 也不支持它。
为什么下面的代码不能编译:
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 也不支持它。