【发布时间】:2018-09-25 21:39:30
【问题描述】:
我正在尝试在 plsql 中编写如下代码: 在删除一行之前,此触发器将检查该行是否有孩子,如果是这样,孩子成为他们祖父的孩子,然后该行继续被删除。
所以,这就是我现在所拥有的:
CREATE TABLE sucursal
(
codsuc NUMBER (8) PRIMARY KEY,
ganancia NUMBER (8) NOT NULL CHECK (ganancia > 0),
sucpadre NUMBER (8) REFERENCES sucursal
);
CREATE OR REPLACE TRIGGER borrar_sucursal
BEFORE DELETE
ON sucursal
FOR EACH ROW
WHEN (old.sucpadre IS NOT NULL)
BEGIN
DBMS_OUTPUT.PUT_LINE ('Bueno pues lo intente');
hijo_de_abuelo (:old.codsuc);
END;
/
CREATE OR REPLACE PROCEDURE hijo_de_abuelo (codigo IN sucursal.codsuc%TYPE)
IS
gato sucursal.sucpadre%TYPE;
BEGIN
SELECT sucpadre
INTO gato
FROM sucursal
WHERE codsuc = codigo;
FOR gallo IN (SELECT *
FROM sucursal
WHERE sucpadre = codigo)
LOOP
UPDATE sucursal
SET sucpadre = gato
WHERE codsuc = gallo.codsuc;
END LOOP;
END;
/
所以,当我尝试在 SQL 控制台中删除一行时会发生这种情况:
SQL> delete from sucursal where codsuc = 2;
Bueno pues lo intente
delete from sucursal where codsuc = 2
*
ERROR at line 1:
ORA-04091: table PANCRACI0.SUCURSAL is mutating, trigger/function may not see
it
ORA-06512: at "PANCRACI0.HIJO_DE_ABUELO", line 7
ORA-06512: at "PANCRACI0.BORRAR_SUCURSAL", line 3
ORA-04088: error during execution of trigger 'PANCRACI0.BORRAR_SUCURSAL'
任何帮助都会很棒。
【问题讨论】:
-
您正在选择然后更新同一个表,这是“变异”,例如见dba-oracle.com/t_avoiding_mutating_table_error.htm
标签: oracle plsql database-trigger