使用嵌套表时如何避免在触发器中更改表,以及如何更新到另一个表?

时间:2019-02-25 01:01:46

标签: sql database oracle oracle11g

我有一个代码,在完成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;
/

1 个答案:

答案 0 :(得分:0)

由于从触发器内部的触发器所有者(表pedido)中进行选择,因此引发了错误。

更改此选择语句

SELECT columna_detalle INTO fila FROM pedido WHERE ... 

IF INSERTING THEN
     fila := :NEW.columna_detalle;