Как избежать изменения таблицы в триггере при работе с вложенной таблицей и выполнить обновление в другую таблицу? - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть код, который использует триггер для обновления таблицы после вставки 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 голосов
/ 25 февраля 2019

Ошибка возникает из-за того, что вы выбираете владельца Trigger (таблицу pedido) внутри Trigger.

Измените этот оператор выбора

SELECT columna_detalle INTO fila FROM pedido WHERE ... 

на

IF INSERTING THEN
     fila := :NEW.columna_detalle;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...