【问题标题】:SQL Error: ORA-04098: triggerSQL 错误:ORA-04098:触发器
【发布时间】:2015-06-11 20:01:36
【问题描述】:

我写了以下触发器:

CREATE OR REPLACE TRIGGER check_exprdate_tgr
  BEFORE INSERT OR UPDATE ON coupon
  FOR EACH ROW
BEGIN
  IF(:new.Expiry_date<= SYSDATE)
  THEN
    RAISE_APPLICATION_ERROR(404, 'Coupon Expiry date is not valid. Expiry date must be set to a later date.');
  END IF;
END;

表格如下:

CREATE TABLE customer (
  Id INTEGER 
    CONSTRAINT customer_id_nn NOT NULL,
  Name VARCHAR2(50) 
    CONSTRAINT cutomer_name_nn NOT NULL,
  Surname VARCHAR2(50) 
    CONSTRAINT customer_surname_nn NOT NULL,
  Dob DATE 
    CONSTRAINT customer_date_nn NOT NULL,
  Email VARCHAR2(50),
  Gender VARCHAR2(10)
    CONSTRAINT customer_gender_nn NOT NULL,
  Residence_number Integer 
    CONSTRAINT customer_residenceno_nn NOT NULL,
  Street VARCHAR2(50) 
    CONSTRAINT customer_street_nn NOT NULL,
  Town_id INTEGER,

  CONSTRAINT customer_id_pk PRIMARY KEY(Id),
  CONSTRAINT customer_townId_fk FOREIGN KEY(Town_id) 
      REFERENCES TOWN(Id)
);


CREATE TABLE coupon (
  Id INTEGER,
  Expiry_date DATE
    CONSTRAINT coupon_date_nn NOT NULL,
  Discount_percentage NUMBER(4,2)
    CONSTRAINT coupon_discperc_nn NOT NULL,
  Details VARCHAR2(50),
  Customer_id INTEGER
    CONSTRAINT coupon_customerid_nn NOT NULL,

  CONSTRAINT coupon_id_pk PRIMARY KEY(Id),
  CONSTRAINT coupon_customerid_fk FOREIGN KEY(Customer_id)
    REFERENCES customer(Id)  
);

触发器的目的是检查到期日期输入是否设置在 SYSDATE 之后的某个日期。我编译了触发器,它编译正确,所以我真的不知道代码有什么问题。

谢谢:)

【问题讨论】:

  • 你试过SHOW ERRORS TRIGGER check_exprdate_tgr;吗?
  • 该错误表明触发器没有成功编译(或者至少现在不能成功编译)。 raise_application_error 的第一个参数需要是 -20000 到 -20999 范围内的负整数。
  • 非常感谢您解决了这个问题!谢谢你的时间:)

标签: sql oracle oracle11g triggers


【解决方案1】:

RAISE_APPLICATION_ERROR() 中的数字必须在为用户定义的错误预留的范围内,即 -20999 到 -20000。 It's in the documentation.

RAISE_APPLICATION_ERROR(-20404
           , 'Coupon Expiry date is not valid. Expiry date must be set to a later date.');

值得注意的是,每当您更新 COUPON 表上的任何列时,都会评估此行,无论您是否已触及 EXPIRY_DATE 本身:

  IF(:new.Expiry_date<= SYSDATE)

这意味着您无法在优惠券过期后更新表格。这可能是你想要的。否则你应该考虑一个更细微的测试,比如说

   IF ( INSERTING or :new.Expiry_date != :old.Expiry_date )
   AND :new.Expiry_date<= SYSDATE

the PL/SQL Reference 中涵盖了触发器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 2017-03-12
    相关资源
    最近更新 更多