【问题标题】:Oracle sql trigger on insert/update to calculate 2 values and update a third valueOracle sql 在插入/更新时触发以计算 2 个值并更新第三个值
【发布时间】:2015-04-23 15:03:09
【问题描述】:

我想创建一个触发器,通过计算 2 个值来更新行并更新第三个值:

CREATE TABLE Customers (
    Cust_ID INTEGER PRIMARY KEY,
    Dates TIMESTAMP WITH LOCAL TIME ZONE,
    Quantity dec(7,2) NOT NULL,
    Price_per_item dec(7,2) NOT NULL,
    Total_price dec(7,2)
);

我已经这样做了:

CREATE OR REPLACE TRIGGER cust_after_insert AFTER INSERT 
ON Customers
FOR EACH ROW
BEGIN
    UPDATE Customers
    SET 
    DATES = CURRENT_TIMESTAMP,
    Total_price = Quantity * Price_per_item;
END;

我尝试同时查看和编辑表格时遇到某种错误。

我也试过这个:

CREATE SEQUENCE cust_Seq START WITH 1 INCREMENT BY 1;
CREATE OR REPLACE TRIGGER cust_trig BEFORE INSERT ON Customers
FOR EACH ROW
BEGIN
  SELECT cust_Seq.nextval INTO :new.Fuel_ID FROM dual;
  SELECT CURRENT_TIMESTAMP INTO :new.DATES FROM dual;
  SELECT Quantity * Price_per_item INTO :new.Total_price FROM dual;
END;
/

我更喜欢第二个选项,如果更新也会发生,我将需要一些东西。

【问题讨论】:

  • 您遇到什么错误? “某种错误”无助于调试问题。谢谢!

标签: triggers oracle-sqldeveloper


【解决方案1】:

第二种方法的方向是正确的,但它需要一些调整来处理Total_price 的计算以及处理updates:

CREATE SEQUENCE cust_Seq START WITH 1 INCREMENT BY 1;
CREATE OR REPLACE TRIGGER cust_trig BEFORE INSERT OR UPDATE ON Customers
FOR EACH ROW
BEGIN
  IF INSERTING THEN
    SELECT cust_Seq.nextval INTO :new.Fuel_ID FROM dual;
    SELECT CURRENT_TIMESTAMP INTO :new.DATES FROM dual;
  END IF;
  :new.Total_price :=  :new.Quantity * :new.Price_per_item;
END;
/

【讨论】:

  • 完美,只是一个小错字“END ID”需要是“END IF”,谢谢!
  • @Attila 感谢您注意到 END ID 错字 - 已修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
相关资源
最近更新 更多