小编典典

Oracle的PL / SQL块语法图是否错误?

sql

我怀疑版本2plsql_block的《 Oracle®数据库PL / SQL语言参考》中 给出的
a的语法图是错误的。(供参考,这是该文档的当前链接

以下PL / SQL可以很好地进行编译:

declare

  cursor 
    cursor_definition 
  is select * from dual;

  variable_declaration number;

begin
  null;
end;

以下陈述是我根据上面的PL / SQL和Oracle的语法图做出的假设。

  1. 声明部分(在上面)由一个cursor definition后跟一个variable declaration(反过来是item declaration)组成。

  2. 一个item declaration可以 是一个的元素item list 1

  3. cursor definition可以 是一个的元素item list 2

  4. 一个item list 2永远不能跟一个item list 1

现在,variable declaration以下cursor definition矛盾 点4 。因此,我得出结论,语法图是错误的。

也许我忽略了某些事情,在这种情况下,我 非常 感谢您向我指出这一点。

请理解,错误的语法图本身对我来说没什么大不了的。但是我正在编写一个PL / SQL解析器,而解析器迷失了示例PL /
SQL代码所给出的确切情况。因此,为了改进解析器,我想拥有一个更具权威性的序列图。


阅读 126

收藏
2021-04-28

共1个答案

小编典典

我同意。语法图明确指出,a后面plsql_block实际上item_list_2是一个可选的item_list_1

此外,游标 定义
(带有is位)只能出现在中item_list_2,变量声明(带有或不带有=)是item_declaration集合的一部分,因此只能位于中item_list_1

这些事实使您的代码示例不正确,因此,如果成功进行编译,则可以:

  • 语法图是错误的;或者
  • 编译器没有按照他们的要求去做;或者
  • 您所查看的代码包含在 不同的 语法图中。

最后一点,有趣的是,11.1语法图略有不同。

声明部分可以是item_list_1item_list_2或其item_list_1item_list_2

有趣的地方是item_list_1可以有任意数量的item_declaration条目,其中包括variable_declarationcursor_declaration

在11.1,一个cursor_declaration可以是一个声明
一个定义的基础上,语言元素中11.2(换句话说,不存在cursor_definition类型,因为声明允许无论是在声明)。

因此,在11.1中,您拥有的是完全有效的,因此,我首先要检查的是您实际上 正在运行 11.2,并且正在成功进行编译。

当然,仍然有可能运行的是11.2,并且语法图是错误的,在这种情况下,您应该向Oracle苦苦抱怨,但是我不知道您会从一家旗舰数据库产品可以满足的公司那里得到什么样的答复。不能说出空varchar和NULL
(a)之间的区别。


(a)我永远不会错过提此的机会,并推动我心爱的DB2的事业:-)

2021-04-28