2017-01-09 20 views
4

为什么不下面的代码编译无法把WITH FUNCTION子句中BEGIN/END块

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数据库12c的企业版发行12.1.0.2.0 - 64位生产
  • PL/SQL发布12.1.0.2.0 - 生产
+0

包含您从第一个版本获得的错误很有帮助。但是'select into'与'select'不太一样。 ''with function ...'语法可能还没有成为PL/SQL版本;尽管由于语法图甚至没有显示CTE语法,所以很难说清楚。你正在使用12cR1还是12cR2 - 它可能在不同版本之间发生变化? –

+0

@AlexPoole我已添加您请求的信息。 – user2672165

回答

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不表明with子句支持在PL/SQL中甚至可以用于子查询块,但即使在早期版本中也可以工作。所以它也没有引用新的PL/SQL声明语法。根据运行12.2.0.1的Oracle Live SQL平台的实验,它在12cR2中也不受支持。

+1

似乎与https://oracle-base.com/articles/12c/with-clause-enhancements-12cr1#plsql-support – user2672165

+0

中的建议一致嗯,我想知道这个“在未来版本中应用”是基于官方或希望/假设。 (可能是有效的,我希望它在某个时候能够赶上。)我在Oracle的网站或MOS上看不到任何关于此的信息 - 尽管我可能错过了某些东西。 –