编译触发器时出现 Oracle 错误 ORA-00922

Posted

技术标签:

【中文标题】编译触发器时出现 Oracle 错误 ORA-00922【英文标题】:Oracle Error ORA-00922 While Compiling Trigger 【发布时间】:2020-08-17 13:49:25 【问题描述】:

我在表中有一个 varchar2 数据类型列。用户只能在该列中插入数字,我不想更改为数字。有时在手动插入此列的数据时,用户可以在列中留出空格。我创建了一个触发器来避免它。我写的触发器如下。

CREATE OR REPLACE trigger_name
BEFORE INSERT ON table
FOR EACH ROW 
BEGIN 
  IF :new.column != TRIM(:new.column) THEN
     :new.column := TRIM(:new.column);
  ELSE
   dbms_output.put_line(:new.column || ' is suitable for jobid');
END IF;
END;

编译上述代码时出现如下错误。

“ORA-00922:缺少或无效选项”

提前致谢。

【问题讨论】:

不幸的是,它不断出错。我也删除了 8 号末尾的分号,但我无法修复它。 首先,我只删除了第 6 次,但出现错误。然后我也删除了第8个,但是我又出错了。 对不起,我看错了,在 CREATE OR REPLACE 之后缺少 TRIGGER 关键字的语法存在问题,我认为表名应该是一个代表。由于无法创建名称为 table 的表。您需要该列的浮点数,还是只需要数字(整数)? 不客气。如果您坚持不更改数据类型,我认为添加检查约束可能比使用触发器更好。您需要该列的浮点数,还是只需要数字(整数)? 您的触发器不会从输入的数据中删除所有空格;使用时,TRIM 会删除前导和尾随空格。但是,第一个数字和最后一个数字之间不会有任何空格。所以字符串'123'变成'123',字符串'12 3'没有,空格仍然存在。另外,您如何使用户无法输入其他非数字字符。如果你能做到这一点,为什么不也不允许进入空间。顺便说一句,您的触发器可以简化为单行 :new.column := trim(:new.column); 以产生完全相同的结果,除了开发之外没人会看到的消息. 【参考方案1】:

错误ORA-00922是由缺少关键字TRIGGER引起的,正如Barbaros Özhan所指出的那样。只需添加它,假设您的表名和列名正确,那么就可以了。


但进一步查询,您似乎想替换用户为该列输入的所有空格。如果是这样,这个触发器可以做到:

CREATE OR REPLACE TRIGGER trigger_name
BEFORE INSERT ON table_name
  FOR EACH ROW
BEGIN
  IF :new.column_name != REPLACE(:new.column_name,' ','') THEN
    :new.column_name := REPLACE(:new.column_name,' ','');
  ELSE
    dbms_output.put_line(:new.column_name|| ' is suitable for jobid');
  END IF;
END;

我添加了缺少的关键字trigger。 只需将 table_namecolumn_name 替换为正确的名称即可。

【讨论】:

以上是关于编译触发器时出现 Oracle 错误 ORA-00922的主要内容,如果未能解决你的问题,请参考以下文章

Oracle - 在没有触发器的情况下更新表时出现“表正在变异,触发器/函数可能看不到它”错误

编译过程时出现oracle错误

让 oracle 函数知道数据是不是为素数。收到警告:创建时出现编译错误的函数

运行 Oracle 调度程序时出现错误:ORA-20001:必须从应用程序会话中调用此过程

在更新触发之前执行时出现约束冲突错误

使用 `getclobval()` 执行 oracle 程序时出现“无效字符错误”