插入或更新的值过高或过低时的SQL触发器

插入或更新的值过高或过低时的SQL触发器,sql,oracle,plsql,oracle-sqldeveloper,Sql,Oracle,Plsql,Oracle Sqldeveloper,我试图创建一个触发器,当插入或更新的汽车价格过高或过低时,该触发器将运行。 当试图编译它时,它只是说标识符必须声明在我使用或看到的其他类似方法使用相同方法的地方 CREATE OR REPLACE TRIGGER carlistprice_insert_update BEFORE INSERT OR UPDATE ON car FOR EACH ROW WHEN (NEW.carlistprice < 0 OR NEW.carlistprice > 250000) BEGI

我试图创建一个触发器,当插入或更新的汽车价格过高或过低时,该触发器将运行。 当试图编译它时,它只是说标识符必须声明在我使用或看到的其他类似方法使用相同方法的地方

CREATE OR REPLACE TRIGGER carlistprice_insert_update 
BEFORE INSERT OR UPDATE ON car
FOR EACH ROW
    WHEN (NEW.carlistprice < 0 OR NEW.carlistprice > 250000)
BEGIN
        IF NEW.carlistprice < 0 THEN
        :NEW.carlistprice := 0;
        END IF;
        IF NEW.carlistprice > 250000 THEN
        :NEW.carlistprice := 250000;
        END IF;
END;
/
carlistprice是我的一个表中的有效列

  • WHEN
    子句中,
    NEW
    (以及
    OLD
    )没有冒号
  • 在其他地方,它必须以冒号开头
因此:

创建或替换触发器carlistprice\u insert\u更新
在汽车上插入或更新之前
每行
当(NEW.carlistprice<0或NEW.carlistprice>250000)-此处没有冒号
开始
如果:NEW.carlistprice<0,则--此处为冒号
:NEW.carlistprice:=0;--这里呢
如果结束;
如果:NEW.carlistprice>250000,那么——在这里
:NEW.carlistprice:=250000;——这里呢
如果结束;
结束;
/

我很接近,谢谢你指出这一点。我感谢你的回应!不客气。请注意,这通常会让最终用户感到困惑,因为他们在屏幕上键入26000,然后返回25000。如果前端也有验证,那么更好的数据库方法可能不是触发器,而是确保没有遗漏的约束,即,
alter table car add constraint car\u chk check(carlistprice介于0和25000之间)
CREATE OR REPLACE TRIGGER cust_before_insert
BEFORE INSERT ON customer
FOR EACH ROW
    WHEN(NEW.custname != UPPER(NEW.custname))
BEGIN
    :NEW.custname := UPPER(:NEW.custname);
END;
/
CREATE OR REPLACE TRIGGER carlistprice_insert_update 
  BEFORE INSERT OR UPDATE ON car
  FOR EACH ROW
WHEN (NEW.carlistprice < 0 OR NEW.carlistprice > 250000)  -- no colon here
BEGIN
  IF :NEW.carlistprice  < 0 THEN                   -- colon here
     :NEW.carlistprice := 0;                       -- and here
  END IF;

  IF :NEW.carlistprice  > 250000 THEN              -- and here
     :NEW.carlistprice := 250000;                  -- and here
  END IF;
END;
/