oracle - 尝试在更新期间读取触发器上的表,给出突变错误
问题描述
在更新表之前,我必须在另一个表中插入,但要实现这一点,我需要来自我正在更新的表(和其他表)的信息,尝试在触发器中读取我的更新表会给出错误
第 1 行出现错误:ORA-04091:表 BASEDATOS2.SOL_SOLICITUD_PREMIOS 正在变异,触发器/函数可能看不到它 ORA-06512:在“BASEDATOS2.INS_AFTER_UPD_PRICES”,第 10 行 ORA-04088:执行触发器“BASEDATOS2.INS_AFTER_UPD_PRICES”时出错
这是我的触发器
CREATE OR REPLACE TRIGGER INS_AFTER_UPD_PRICES BEFORE UPDATE OF CONCEDIDO ON SOL_SOLICITUD_PREMIOS
FOR EACH ROW WHEN (new.CONCEDIDO = 'S')
DECLARE
DESDE DATE;
HASTA DATE;
MONTO NUMBER;
MAX_ID NUMBER;
v_mov_premio NUMBER;
CUENTA NUMBER;
BEGIN
SELECT MAX(ID_MOVIMIENTO)+1 INTO MAX_ID FROM AHO_MOVIMIENTOS_CUENTA;
SELECT SSP.FECHA_DESDE,SSP.FECHA_HASTA,SE.MONTO_COBERTURA INTO DESDE,HASTA,MONTO
FROM SOL_SOLICITUD_PREMIOS SSP JOIN SOL_EVENTOS SE
ON SE.COD_EVENTO = SSP.COD_EVENTO
WHERE SE.COD_EVENTO=:OLD.COD_EVENTO
AND SSP.ID=:OLD.ID;
select id_tipo into v_mov_premio
from aho_tipo_movimiento
where UPPER(nombre_tipo) like '%PAGO DE PREMIO/SUBSIDIO%';
SELECT AM.ID_CUENTA INTO CUENTA
FROM AHO_MOVIMIENTOS_CUENTA AM
JOIN AHO_TIPO_MOVIMIENTO ATM ON ATM.ID_TIPO=AM.ID_TIPO
WHERE ATM.ID_TIPO='A' AND ROWNUM=1;
INSERT INTO AHO_MOVIMIENTOS_CUENTA
VALUES(MAX_ID, SYSDATE, MONTO*(HASTA-DESDE),v_mov_premio,CUENTA );
END;
任何人都知道我怎样才能使它工作?
解决方案
这里的问题是您的触发器是在 上定义的SOL_SOLICITUD_PREMIOS
,并且在触发器的主体中,您正在从SOL_SOLICITUD_PREMIOS 中选择数据。在 ROW 触发器中,不允许读取、插入、更新或删除定义触发器的表中的其他行,因为它可能导致触发器循环,其中数据库在评估同一触发器的递归调用时会卡住。SOL_SOLICITUD_PREMIOS
但是,在这种情况下,不需要从中读取数据,因为您已经在:OLD
伪行中获得了所需的数据。如果我正确阅读内容,您可以按如下方式重写您的触发器,它应该可以满足您的要求:
CREATE OR REPLACE TRIGGER INS_AFTER_UPD_PRICES
BEFORE UPDATE OF CONCEDIDO ON SOL_SOLICITUD_PREMIOS
FOR EACH ROW
WHEN (new.CONCEDIDO = 'S')
DECLARE
MONTO NUMBER;
MAX_ID NUMBER;
v_mov_premio NUMBER;
CUENTA NUMBER;
BEGIN
SELECT MAX(ID_MOVIMIENTO)+1 INTO MAX_ID FROM AHO_MOVIMIENTOS_CUENTA;
SELECT SE.MONTO_COBERTURA
INTO MONTO
FROM SOL_EVENTOS SE
WHERE SE.COD_EVENTO = :OLD.COD_EVENTO;
select id_tipo
into v_mov_premio
from aho_tipo_movimiento
where UPPER(nombre_tipo) like '%PAGO DE PREMIO/SUBSIDIO%';
SELECT AM.ID_CUENTA
INTO CUENTA
FROM AHO_MOVIMIENTOS_CUENTA AM
JOIN AHO_TIPO_MOVIMIENTO ATM
ON ATM.ID_TIPO = AM.ID_TIPO
WHERE ATM.ID_TIPO = 'A' AND
ROWNUM = 1;
INSERT INTO AHO_MOVIMIENTOS_CUENTA
VALUES(MAX_ID,
SYSDATE,
MONTO * (:OLD.FECHA_HASTA - :OLD.FECHA_DESDE),
v_mov_premio,
CUENTA );
END INS_AFTER_UPD_PRICES;
祝你好运。
推荐阅读
- android - CSS BUG text-indent of first line with multiline and text overflow ellipsis
- android - 是否可以在 Android Studio 中为 TextView 的 text 属性在 xml 文件中编写分割的多行?
- html - Nginx 不提供关于 500 错误的错误 html 页面
- postgresql - 如何优化三个表的简单连接的执行计划
- database - 无限免费的 WordPress config.php 文件
- javascript - Outsystems 和 fullCalendar React resource.setExtendedProp 不工作
- swiftui - 将绑定传递给类型属性包装器的变量 - 失去基础类型
- java - Java类图E含义
- asp.net-core - 使用 .NET Core App 通过 IIS 连接到外部服务时出现问题
- angular - 从 Observable 的对象内部获取变量值