【问题标题】:Oracle Error ORA-00922 While Compiling Trigger编译触发器时出现 Oracle 错误 ORA-00922
【发布时间】: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); 以产生完全相同的结果,除了开发之外没人会看到的消息.

标签: sql oracle plsql triggers bind-variables


【解决方案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 替换为正确的名称即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-30
    • 2015-08-06
    • 2014-11-29
    • 1970-01-01
    • 2017-03-12
    • 2018-07-28
    • 2017-12-15
    • 1970-01-01
    相关资源
    最近更新 更多