当另一个表插入或更新时,Oracle触发更新表

时间:2015-09-14 02:27:31

标签: oracle triggers

我有两个表(master-detail)用于记录订单,我需要创建一个触发器,允许我更新" TOTAL_GENERAL"主表中的字段,其中包含" SUBTOTAL"中的小计和字段与外键相关的详细信息表" ID_ORDEN"但我的触发器出错了。

表:

CREATE TABLE  "ENCABEZADO_ORDEN" 
   ("ID_ENCABEZADO" NUMBER(10,0), 
    "NUMERO_ORDEN" NUMBER(10,0), 
    "FECHA" DATE, 
    "NOMBRE_CLIENTE" VARCHAR2(50), 
    "DIRECCION" VARCHAR2(50), 
    "TOTAL_GENERAL" NUMBER(10,0), 
    "LUGAR_VENTA" VARCHAR2(50), 
     CONSTRAINT "ENCABEZADO_ORDEN_PK" PRIMARY KEY ("ID_ENCABEZADO")
  USING INDEX  ENABLE
   )

CREATE TABLE  "DETALLE_ORDEN" 
   ("ID_DETALLE" NUMBER(10,0), 
    "PRODUCTO" VARCHAR2(50), 
    "PRECIO_UNITARIO" NUMBER(10,2), 
    "CANTIDAD" NUMBER(10,0), 
    "SUBTOTAL" NUMBER(10,2), 
    "ID_ENCABEZADO" NUMBER(10,0), 
     CONSTRAINT "DETALLE_ORDEN_PK" PRIMARY KEY ("ID_DETALLE")
  USING INDEX  ENABLE
   )
/
ALTER TABLE  "DETALLE_ORDEN" ADD CONSTRAINT "DETALLE_ORDEN_FK" FOREIGN KEY ("ID_ENCABEZADO")
      REFERENCES  "ENCABEZADO_ORDEN" ("ID_ENCABEZADO") ENABLE
/

触发:

create or replace TRIGGER "CALCULAR_TOTAL_GENERAL"
  BEFORE INSERT OR UPDATE ON "DETALLE_ORDEN"
  FOR EACH ROW
DECLARE
     V_ID_ENCABEZADO NUMBER(10,0);
BEGIN
     SELECT "ID_ENCABEZADO"
     INTO V_ID_ENCABEZADO 
     FROM "ENCABEZADO_ORDEN"
     WHERE "ID_ENCABEZADO" = :NEW."ID_ENCABEZADO";

     UPDATE "ENCABEZADO_ORDEN"
     SET "TOTAL_GENERAL" = (SELECT SUM("SUBTOTAL") FROM "DETALLE_ORDEN"
     WHERE "ID_ENCABEZADO" = V_ID_ENCABEZADO)
     WHERE "ID_ENCABEZADO" = V_ID_ENCABEZADO;
END;

这是我在插入或更新表格时收到的错误消息" DETALLE_ORDEN":

1 error has occurred
ORA-04091: table CARLOSM.DETALLE_ORDEN is mutating, trigger/function may not see it 
ORA-06512: at "CARLOSM.CALCULAR_TOTAL_GENERAL", line 9 
ORA-04088: error during execution of trigger 'CARLOSM.CALCULAR_TOTAL_GENERAL'

0 个答案:

没有答案