【问题标题】:Why do I keep getting this error when creating a trigger?为什么我在创建触发器时不断收到此错误?
【发布时间】:2021-05-24 02:58:25
【问题描述】:

我正在创建一个触发器,用于检查 Majorcode 列在插入或更新之前是否为空,如果是则输入默认值“100”

我的代码:

CREATE TRIGGER MUmajorcode_changes
BEFORE INSERT OR UPDATE ON M_Students
FOR EACH ROW
BEGIN
 IF NEW.Majorcode = null THEN
    SET NEW.Majorcode = '100';
 END IF;

运行后我收到以下消息 警告:创建的触发器存在编译错误。

然后当我实际插入一个带有空白主代码的新值时。

我收到以下消息/错误:

第 1 行出现错误:

ORA-04098: trigger 'SCOTT.MUMAJORCODE_CHANGES' is invalid and failed re-validation.

这是我最初设置表格的方式:

CREATE TABLE M_Students 
(
 ID           CHAR(3) PRIMARY KEY,
 FName        VARCHAR2(25), 
 LName        VARCHAR2(25), 
 Status       VARCHAR2(25), 
 Majorcode    CHAR(3) REFERENCES Departments(DeptCode), 
 GPA          NUMBER (4,2), 
 AdmittedDate DATE
);

不知道我哪里出错了?

【问题讨论】:

  • 几个错误两件事:你更好的测试'是空的'而不是'=空'。并且你需要一个END来结束触发器,NEW前面应该有':',并去掉SET。要查找在 sqlplus 中创建触发器时引发的错误,请在创建触发器后执行“显示错误”。
  • 不知道我哪里出错了? 您没有使用正确的 PL/SQL 语法。 Oracle 文档是您的朋友。搜索您正在使用的 Oracle 数据库版本的“PL/SQL 语言参考”。
  • 您是否尝试使用 Oracle DEFAULT ON NULL 您可能不需要触发器,ALTER TABLE M_Students MODIFY Majorcode DEFAULT ON NULL '100';
  • @Baloo - 如果任何答案解决了您的问题,那么请接受该答案。这有助于未来的提问者对以前的工作有类似的问题。如果没有什么可以帮助母鸡用仍未解决的问题更新问题。只是不要让一个成功回答的问题悬而未决。

标签: oracle plsql triggers ddl


【解决方案1】:

你有一些语法错误:

CREATE OR REPLACE TRIGGER MUmajorcode_changes /* better use REPLACE to avoid dropping the trigger */
   BEFORE INSERT OR UPDATE
   ON M_Students
   FOR EACH ROW
BEGIN
   IF :new.Majorcode IS NULL         /* :new, with the colon (:) */
   THEN
      :new.Majorcode := '100';       /* :new, and no SET */
   END IF;
END;                                 /* a missing END */

此外,切勿使用= 检查空值,而始终使用is [not] null

【讨论】:

  • 只是为了向 OP 解释关于“为空”的信息。空值,按定义 是“未定义”值。使用标准关系运算符测试空值将始终返回“非真”。因此,“WHERE MYVAR > NULL”或 WHERE MYVAR all 评估为“不正确”。
【解决方案2】:

存在一些明显的语法错误,例如错误赋值、缺少或多余的关键字,但您不需要创建数据库触发器来处理此操作。只需通过

修改相关的列属性
ALTER TABLE M_Students 
MODIFY Majorcode DEFAULT '100' NOT NULL 

通过此属性,Majorcode 列已在插入期间自动填充值 '100',并且由于 NOT NULL 约束,无法将该列更新为 NULL

Demo

【讨论】:

    【解决方案3】:

    当您收到“创建时出现编译错误”消息时,这意味着您的脚本无效,它存在编译时错误。如果您的 IDE 没有向您显示它们,那么如果您使用的是 sqlplus,则运行“显示错误”,如果您使用的是 IDE,则运行查询“select * from user_errors”(并获取新的 IDE)。要么会显示脚本中的错误,要么必须更正;您的脚本在它们运行之前不会运行
    在表定义中设置 DEFAULT 值的建议有其优点,但会在几个条件下失败。插入时,当列列表中未提及列名时,将采用默认值。 (注意省略列列表隐式提及所有列,因此不会设置默认值。)它也不会处理更新条件。
    使用coalesce 函数,您的触发器本身可以简化为一条语句:

    create or replace trigger mumajorcode_changes  
        before insert or update of mumajorcode 
        on m_students
       for each row
    begin
        :new.majorcode := coalesce(:new.majorcode, '100');       
    end;                                    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      • 2012-11-19
      相关资源
      最近更新 更多