加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 13:15:02 所属栏目:百科 来源:网络整理
导读:为什么下面的代码没有编译 DECLAREc number;BEGINWITHFUNCTION calculate(i IN NUMBER) RETURN NUMBERASr 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/S
为什么下面的代码没有编译

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 – 生产

解决方法

这个结构似乎在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也不支持.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读