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

时间:2017-01-09 14:07:36

标签: plsql oracle12c with-statement

为什么以下代码没有编译

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
06550. 00000 -  "line %s, column %s:\n%s"
Cause:    Usually a PL/SQL compilation error.
Action:*

,而

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企业版12.1.0.2.0版 - 64位生产
  • PL / SQL版本12.1.0.2.0 - 生产

1 个答案:

答案 0 :(得分:1)

这个结构似乎在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声明语法。根据运行12.2.0.1的Oracle Live SQL平台的实验,12cR2也不支持。