gpt4 book ai didi

plsql - 无法在 BEGIN/END block 中放置 WITH FUNCTION 子句

转载 作者:行者123 更新时间:2023-12-04 21:34:41 25 4
gpt4 key购买 nike

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

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 似乎尚不支持此构造。据推测,它将在 future 版本中添加。

与此同时,它令人不快,但您可以使用动态 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 也不支持它。

关于plsql - 无法在 BEGIN/END block 中放置 WITH FUNCTION 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41549798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com