无法在BEGIN/END块中使用WITH FUNCTION子句。

6
为什么下面的代码无法编译:
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数据库12c企业版发布12.1.0.2.0 - 64位生产
PL/SQL发布12.1.0.2.0 - 生产


包含第一个版本中出现的错误信息是有帮助的。但是select intoselect并不完全相同。可能with function ...语法还没有被PL/SQL版本支持,虽然由于语法图表甚至没有显示CTE语法,很难确定。您使用的是12cR1还是12cR2 - 它可能在发布之间发生了变化? - Alex Poole
@AlexPoole 我已经添加了你要求的信息。 - user2672165
1个回答

3

目前 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
select into 的文档并没有显示即使在子查询块中,也支持 PL/SQL 的 with 子句,但实际上早期版本中也是可以工作的。因此它也不涉及新的 PL/SQL 声明语法。根据在 Oracle's Live SQL 平台上进行的实验(该平台运行着 12.2.0.1),它在 12cR2 中也不被支持。

2
似乎与 https://oracle-base.com/articles/12c/with-clause-enhancements-12cr1#plsql-support 中的建议一致。 - user2672165
1
嗯,我想知道那个“将在未来版本中推出”的消息是基于官方的依据还是希望/假设。(可能是有效的;我期望它在某个时候会追上。)我在Oracle的网站或MOS上没有看到任何相关信息 - 不过我可能错过了什么。 - Alex Poole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接