我怀疑是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的语法图做出的假设。
声明部分(上方)包含cursor definition
后跟variable declaration
(后者又为item declaration
)。
item declaration
只能 才能成为item list 1
的元素。
cursor definition
只能 <{1}}。
item list 2
永远不能跟item list 2
。
现在,item list 1
后面的variable declaration
与点4 相矛盾。因此,我得出结论
语法图是错误的。
也许我忽略了某些东西,在这种情况下,我非常非常感激地向我指出这一点。
请理解错误的语法图本身对我来说没什么大不了的。但我正在编写PL / SQL解析器 并且解析器偶然发现了示例PL / SQL代码给出的确切情况。所以,为了改进解析器,我想 有一个更具说明性的序列图。
答案 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_1
或item_list_2
或item_list_1
,后跟item_list_2
。
有趣的是,item_list_1
可以包含任意数量的item_declaration
条目,其中包括variable_declaration
和cursor_declaration
。
在11.1中,cursor_declaration
可以是声明或定义,基于11.2中的语言元素(换句话说,没有cursor_definition
类型声明允许两者都在声明中。
所以你所拥有的东西在11.1中是完全有效的,所以我要检查的第一件事是你实际上正在运行 11.2正在进行成功的编译。
当然你仍然可以运行11.2并且语法图是错误的,在这种情况下你应该向Oracle抱怨,但我不知道你会从旗舰公司得到什么样的回应数据库产品无法区分空varchar
和NULL (a)之间的区别。
(a)我永远不会错过提及这个并提升我心爱的DB2的原因的机会: - )