为什么以下代码没有编译
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版本信息
答案 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也不支持。