我怀疑版本2plsql_block的《 Oracle®数据库PL / SQL语言参考》中 给出的 a的语法图是错误的。(供参考,这是该文档的当前链接)
plsql_block
以下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)组成。
cursor definition
variable declaration
item declaration
一个item declaration可以 仅 是一个的元素item list 1。
item list 1
阿cursor definition可以 仅 是一个的元素item list 2。
item list 2
一个item list 2永远不能跟一个item list 1。
现在,variable declaration以下cursor definition矛盾 点4 。因此,我得出结论,语法图是错误的。
也许我忽略了某些事情,在这种情况下,我 非常 感谢您向我指出这一点。
请理解,错误的语法图本身对我来说没什么大不了的。但是我正在编写一个PL / SQL解析器,而解析器迷失了示例PL / SQL代码所给出的确切情况。因此,为了改进解析器,我想拥有一个更具权威性的序列图。
我同意。语法图明确指出,a后面plsql_block实际上item_list_2是一个可选的item_list_1。
item_list_2
item_list_1
此外,游标 定义 (带有is位)只能出现在中item_list_2,变量声明(带有或不带有=)是item_declaration集合的一部分,因此只能位于中item_list_1。
is
=
item_declaration
这些事实使您的代码示例不正确,因此,如果成功进行编译,则可以:
最后一点,有趣的是,11.1的语法图略有不同。
声明部分可以是item_list_1或item_list_2或其item_list_1后item_list_2。
有趣的地方是item_list_1可以有任意数量的item_declaration条目,其中包括variable_declaration和cursor_declaration。
variable_declaration
cursor_declaration
在11.1,一个cursor_declaration可以是一个声明 或 一个定义的基础上,语言元素中11.2(换句话说,不存在cursor_definition类型,因为声明允许无论是在声明)。
cursor_definition
因此,在11.1中,您拥有的是完全有效的,因此,我首先要检查的是您实际上 正在运行 11.2,并且正在成功进行编译。
当然,仍然有可能运行的是11.2,并且语法图是错误的,在这种情况下,您应该向Oracle苦苦抱怨,但是我不知道您会从一家旗舰数据库产品可以满足的公司那里得到什么样的答复。不能说出空varchar和NULL (a)之间的区别。
varchar
(a)我永远不会错过提此的机会,并推动我心爱的DB2的事业:-)