SQL触发器调用多个表

时间:2014-05-05 17:04:12

标签: sql oracle triggers sqltools

我正在使用SQL Tools为Oracle创建行级触发器。我将附上我正在处理的ERD图片。我还将包括我的说明,粘贴我尝试过的代码以及我得到的错误。

请求描述: 创建一个名为" TRG_USED_COST"的行级触发器。在USED表上。触发器应该在表中插入新行之前执行。 insert命令将为" CHEM_NUM"," JOB_NUM"和" USED_QTY"提供值。正在添加到表中。使用插入中使用的CHEM_NUM,检索" CHEM_UNIT_COST"来自化学品表。将化学单位成本乘以该行中使用的化学品数量,并将该值包括为" USED_CHARGE"插入的行。

我的代码:

CREATE OR REPLACE TRIGGER TRG_USED_COST
BEFORE INSERT OR UPDATE OF CHEM_NUM,JOB_NUM,USED_QTY ON USED
FOR EACH ROW
BEGIN
  UPDATE USED
  SET USED_CHARGE = CHEM_UNIT_COST * USED_QTY
  WHERE CHEM_NUM IS NOT NULL;
END;
/

输入代码后,收到错误: PL / SQL:ORA-00904:" CHEM_UNIT_COST":无效标识符

我知道我收到错误是因为我没有参考化学品表格" CHEM_UNIT_COST"位于...但我不知道如何引用它。

1 个答案:

答案 0 :(得分:0)

这里有几个问题。首先,你没有"更新"在这种情况下的目标表。在触发器上使用:new属性。然后从另一个表中选择成本。

CREATE OR REPLACE TRIGGER TRG_USED_COST
BEFORE INSERT OR UPDATE OF CHEM_NUM,JOB_NUM,USED_QTY ON USED
FOR EACH ROW
DECLARE
  v_cost CHEMICAL.CHEM_UNIT_COST%TYPE;
BEGIN
  SELECT CHEM_UNIT_COST
  INTO   v_cost
  FROM   CHEMICAL 
  WHERE  CHEM_NUM = :new.CHEM_NUM;

  :new.USED_CHARGE := v_cost * :new.USED_QTY;

END;
/