当前位置: 首页 > 面试题库 >

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

奚无尘
2023-03-14
问题内容

我怀疑版本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代码所给出的确切情况。因此,为了改进解析器,我想拥有一个更具权威性的序列图。


问题答案:

我同意。语法图明确指出,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的事业:-)



 类似资料:
  • 本文向大家介绍Oracle DBMS中的PL / SQL块,包括了Oracle DBMS中的PL / SQL块的使用技巧和注意事项,需要的朋友参考一下 PL / SQL是一种块结构语言,即PL./SQL的代码以块的形式编写。PL / SQL还包含Oracle数据库的健壮性,安全性和可移植性。 PL / SQL的每个块均包含以下子部分- 声明- 本节包含所有需要在程序之前声明的项目,例如变量,子程序

  • 主要内容:PL/SQL标识符,PL/SQL分隔符,PL/SQL注释,PL/SQL程序单元在本章中,我们将学习PL/SQL的基本语法,PL/SQL是块结构语言; PL/SQL程序划分成几个部分,并在每个部分中写入逻辑代码块。每个块由三个子部分组成 - 声明部分 - 此部分是以关键字开头。这是一个可选部分,并定义了程序中要使用的所有变量,游标,子程序和其他元素。 可执行命令部分 - 此部分包含在关键字和之间,这是一个强制性部分。它由程序的可执行PL/SQL语句组成。它应该有至少一个可执行

  • Oracle PL/SQL 调试器能指导你一步一步调试函数、过程、包和查询的代码。若要启动调试器,请点击对象设计器内的 “调试” 按钮。 你可以使用工具栏或菜单运行最常用的调试动作: 按钮 描述 运行 开始在调试模式下运行代码。如有需要,输入参数。调试器会运行你的代码直到代码结束或到达下一个断点。键盘快捷键:F9 逐过程 恢复运行。当前的行将被运行。如果该行是一个过程或函数调用,它会绕过过程或函数

  • Oracle PL/SQL 调试器能指导你一步一步调试函数、过程、包和查询的代码。若要启动调试器,请点击对象设计器内的 按钮。 你可以使用工具栏或菜单运行最常用的调试动作: 按钮 描述 开始在调试模式下运行代码。如有需要,输入参数。调试器会运行你的代码直到代码结束或到达下一个断点。键盘快捷键:F9 停止逐步运行代码。运行将停止,并且无法恢复。 恢复运行。当前的行将被运行。如果该行是一个过程或函数调

  • Oracle PL/SQL 调试器能指导你一步一步调试函数、过程、包和查询的代码。若要启动调试器,请点击对象设计器内的 “调试” 按钮。 你可以使用工具栏或菜单运行最常用的调试动作: 按钮 描述 运行 开始在调试模式下运行代码。如有需要,输入参数。调试器会运行你的代码直到代码结束或到达下一个断点。键盘快捷键:F9 逐过程 恢复运行。当前的行将被运行。如果该行是一个过程或函数调用,它会绕过过程或函数

  • 我实现了一个返回clob数据类型的函数,我希望在DBMS输出中打印结果。不幸的是,我得到了ORA-06502:PL/SQL:numeric或value错误,我认为这是由于dbms_output的大小造成的。 这是密码。 这里有一些东西可以帮助您理解这个问题 1)添加了以下内容来设置缓冲区的大小不受限制,但不起作用… 3)我可以通过执行以下操作来解决这个问题,但我认为这不是一个好的解决方案,因为它执