【问题标题】:How to avoid mutating table in a trigger when working with nested table, and do an update into another table?使用嵌套表时如何避免触发器中的表发生变异,并对另一个表进行更新?
【发布时间】:2019-07-18 09:12:42
【问题描述】:

我有一个代码在 dml 插入完成后使用触发器对表进行更新,但我需要嵌套表的属性内的信息,并使用该信息进行更新,但我的代码抛出一个变异表错误,我想知道我做错了什么,这是包含表、类型和触发器的代码。

----create the type tipo_detalle---------------
CREATE OR REPLACE TYPE tipo_detalle AS OBJECT(
codigo NUMBER(1),
cantidad NUMBER(2)
);
/
-----declare the nested table with type tipo_detalle---

CREATE OR REPLACE TYPE detalle_anidado AS TABLE OF tipo_detalle;
/

---------create the table pedido------------------------
CREATE TABLE pedido(
cod_bodega REFERENCES bodega,
dia NUMBER(8),
columna_detalle detalle_anidado,
PRIMARY KEY(cod_bodega,dia)
)
NESTED TABLE columna_detalle STORE AS columna_detalle_anidada
((PRIMARY KEY(NESTED_TABLE_ID,codigo)));

---table where i am going to insert after insert in pedido----

CREATE TABLE inventario(
cod_bodega REFERENCES bodega,
cod_producto REFERENCES producto,
existencia NUMBER(8),
PRIMARY KEY(cod_bodega,cod_producto)
);
------ trigger to do an insert into inventario-----------

CREATE OR REPLACE TRIGGER triggers_de_pedido
FOR INSERT OR UPDATE OR DELETE ON pedido
COMPOUND TRIGGER
contador NUMBER(8);
fila pedido.columna_detalle%TYPE;
cod_producto_ NUMBER(1);
cantidad_ NUMBER(2);
indice NUMBER(4);
AFTER EACH ROW IS
  BEGIN
    IF INSERTING THEN
        SELECT columna_detalle INTO fila FROM pedido WHERE 
               cod_bodega=:NEW.cod_bodega AND dia=:NEW.dia; 
        indice:=fila.FIRST;
        WHILE indice IS NOT NULL LOOP
            cod_producto_:=fila(indice).codigo;
            cantidad_:=fila(indice).cantidad;
            UPDATE inventario SET existencia=existencia-cantidad_
            WHERE cod_bodega=:NEW.cod_bodega AND cod_producto=cod_producto_;
            indice:=fila.NEXT(indice);
        END LOOP;
    END IF;
END AFTER EACH ROW;
END triggers_de_pedido;
/

【问题讨论】:

    标签: sql database oracle oracle11g


    【解决方案1】:

    引发错误是因为您从触发器内的触发器所有者(表 pedido)中进行选择。

    更改此选择语句

    SELECT columna_detalle INTO fila FROM pedido WHERE ... 
    

    IF INSERTING THEN
         fila := :NEW.columna_detalle;
    

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 2011-07-12
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多