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

时间:2011-08-24 11:50:35

标签: parsing plsql sql

我怀疑是plsql_block的语法图 Relese 2的Oracle®DatabasePL / SQL语言参考是错误的。 (供参考,here's the current link到该文件)

下面的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只能 <{1}}。

  4. item list 2永远不能跟item list 2

  5. 现在,item list 1后面的variable declaration点4 相矛盾。因此,我得出结论 语法图是错误的。

    也许我忽略了某些东西,在这种情况下,我非常非常感激地向我指出这一点。

    请理解错误的语法图本身对我来说没什么大不了的。但我正在编写PL / SQL解析器 并且解析器偶然发现了示例PL / SQL代码给出的确切情况。所以,为了改进解析器,我想 有一个更具说明性的序列图。

1 个答案:

答案 0 :(得分:4)

我同意。语法图明确说明plsql_block有效item_list_2前面有可选的item_list_1

此外,游标定义(带有is位)只能出现在item_list_2中,变量声明(带或不带=)属于item_declaration设置,因此只能在item_list_1

这些事实使您的代码示例不正确,因此,如果它设法编译,则:

  • 语法图错了;或
  • 编译器不遵循它们的字母;或
  • 您正在查看不同语法图所涵盖的代码。

在最后一个要点上,有趣的是,syntax diagrams for 11.1略有不同。

声明部分可以是item_list_1item_list_2item_list_1,后跟item_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的原因的机会: - )