匿名 pl/sql 块中的声明顺序

Posted

技术标签:

【中文标题】匿名 pl/sql 块中的声明顺序【英文标题】:Order of declaration in an anonymous pl/sql block 【发布时间】:2010-06-09 14:54:27 【问题描述】:

我有一个匿名 pl/sql 块,其中声明了一个过程以及一个游标。如果我在游标之前声明该过程,它将失败。是否要求在过程之前声明游标?

pl/sql 块中的声明顺序还有哪些其他规则?

这行得通:

DECLARE
 cursor cur is select 1 from dual;
 procedure foo as begin null; end foo;
BEGIN
 null;
END;

这会失败并出现错误PLS-00103: Encountered the symbol "CURSOR" when expecting one of the following: begin function package pragma procedure form

DECLARE
 procedure foo as begin null; end foo;
 cursor cur is select 1 from dual;
BEGIN
 null;
END;

【问题讨论】:

【参考方案1】:

游标、变量、常量和类型需要在包/函数之前声明。

这个也会失败:

DECLARE
 procedure foo as begin null; end foo;
 x VARCHAR2(10);
BEGIN
 null;
END;

【讨论】:

文档参考在这里download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/…不是很清楚,但是“项目声明”(例如变量)在列表1中,并且必须在“过程/函数定义”之前清单 2. 修改代码时很容易错过!我在游标之前声明了一个函数,我得到了这个:ORA-06550:第 XXX 行,第 X 列:PLS-00103:在期望以下之一时遇到符号“CURSOR”:开始函数杂注过程【参考方案2】:

如果你想声明一个对子过程也可用的游标,只需添加另一个匿名块:

DECLARE
 cursor cur is select 1 from dual;
BEGIN
 DECLARE
  procedure foo as begin null; end foo;
 BEGIN
  null;
 END;
END;

【讨论】:

以上是关于匿名 pl/sql 块中的声明顺序的主要内容,如果未能解决你的问题,请参考以下文章

为啥在匿名 PL/SQL 块中没有立即引发异常?

如何在匿名 PL/SQL 块中自动显示所有 SQL 语句的输出

Oracle 匿名 PL/SQL 块中缺少关键字错误

我可以在调用同一过程后将 PL/SQL 过程放在匿名块中吗?

PL/SQL 过程顺序

是否可以在 PL/SQL 开发人员测试窗口的“声明”块中声明子过程?