首页 > 解决方案 > PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:; - 不确定代码有什么问题

问题描述

我正在尝试创建如下触发器,但得到下面指定的错误。谁能帮我弄清楚代码有什么问题。先感谢您

代码:

CREATE OR REPLACE EDITIONABLE TRIGGER TEST_DATA.IVR_SEQ
BEFORE INSERT ON TEST_DATA.TRANSACTION 
FOR EACH ROW
BEGIN
  SELECT TEST_DATA.IVR_SEQ.NEXTVAL 
  INTO :new.IVRID 
  FROM dual;
END;
/

错误:

PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:;

工具: Oracle SQL Developer

标签: oracleplsqltriggers

解决方案


有几种方法可以获得此错误:

  1. 您的 SQL 格式错误,您缺少 ; 某处
    • 不存在于提供的片段中。
  2. 您的 SQL 格式不正确,解析器被绊倒并认为事情是他们不是的事情,当它到达文件末尾时最终失败。
    • 提供的代码段中没有明显存在。但是我无法测试该EDITIONABLE子句,因为它在我的数据库版本中不存在,因此它可能会引入一些额外的必需语法。
  3. 您的界面在将 SQL 发送到要编译的数据库之前对其进行了修改。
    • 不太可能,因为 SQL 开发人员在不这样做方面比 SQL*Plus 做得更好,但是如果您有任何自定义配置,可能会发生各种事情,请通过查看数据库中的触发器来检查实际访问数据库的内容看看它是否符合您的预期。
  4. 代码中的无效字符
    • 这不是一个常见问题,但可以通过手动重新键入触发器、不使用复制粘贴或从已知的干净来源粘贴来消除。(从网络上复制/粘贴可能包括许多奇怪的字符替换,用于在浏览器中正确布局(不间断空格等),并且像 word 之类的应用程序可能会破坏引号之类的东西(例如,Word 将 ' ' 替换为 ' ' )
  5. 在有错误的触发器定义之前的同一文件中的代码。
    • 我假设您已经将它与任何其他代码分开运行,但如果没有将此触发器创建语句放在它自己的文件中并在那里运行它。
  6. 场景 2 是由不明显的代码错误解析触发的。
    • 这可能是由此中的其他对象或具有相同名称、关键字使用等的不同模式引起的,并且可能取决于哪个模式正在运行 DDL 语句。

    • 尝试引用TEST_DATA.TRANSACTIONas TEST_DATA."TRANSACTION",TRANSACTION是 oracle 中的关键字,虽然某些关键字可以在某些上下文中使用,但可能您的 oracle 版本将其视为关键字并弄乱了其余的解析。这在没有引号的情况下在我的数据库上编译得很好,所以我会更倾向于下一种可能性,但是我的数据库上有一个名为“SEARCH”的模式存在这个问题,在某些情况下,您需要引用该名称以防止编译错误。

    • 检查模式、表、视图等上的名称重用。在您的示例中,您的触发器和您的序列具有相同的名称TEST_DATA.IVR_SEQ。就其本身而言,这不是问题,但可能会导致看似随机的编译错误,具体取决于重复的位置。我无法重现您的特定编译错误,但我能够通过创建不同的名称冲突来创建一些不同的编译错误(例如在名为 的TEST_DATA模式中创建表TEST_DATA、创建名为的函数TEST_DATA、创建包、名为的序列TEST_DATA、名为IVR_SEQ在名为TEST_DATA等的包中)。在您的 Oracle 版本上,这或类似的冲突可能会导致 EOF 错误。


推荐阅读