oracle SQL错误[4098] [42000]:ORA-04098尝试在触发器后插入数据时

cgyqldqp  于 2023-03-22  发布在  Oracle
关注(0)|答案(1)|浏览(232)

我正在创建一个oracle数据库,我的表中的所有插入都工作正常。但是在我运行触发器并尝试执行另一个插入后,oracle显示错误。这是“Cuenta”和“Retirada”的表,并插入:

CREATE TABLE Cuenta (
    fecha_creacion  DATE NOT NULL,
    saldo_actual    NUMBER(20,2) NOT NULL CHECK (saldo_actual >= 0),
    numero_cuenta   NUMBER(10) NOT NULL,
    iban        VARCHAR(24) PRIMARY KEY,
    su_banco    VARCHAR(50) NOT NULL REFERENCES Banco(nombre_banco),
    interes     NUMBER(4,2) CHECK (interes >= 0),
    su_codigo_oficina   NUMBER(4) REFERENCES Oficina(codigo_oficina)
);

CREATE TABLE Retirada (
    codigo_operacion    NUMBER(38) PRIMARY KEY, 
    fecha           DATE NOT NULL,
    hora            TIMESTAMP NOT NULL,
    cantidad        NUMBER(20,2) NOT NULL CHECK (cantidad > 0),
    descripcion         VARCHAR(200),
    cuenta_emisora      VARCHAR(24) NOT NULL REFERENCES Cuenta_corriente(iban),
    su_codigo_oficina   NUMBER(4) NOT NULL REFERENCES Oficina(codigo_oficina));

    -- Valores a insertar en Cuenta
    INSERT INTO Cuenta(fecha_creacion, saldo_actual, numero_cuenta, iban, su_banco, su_codigo_oficina)
    VALUES (SYSDATE, 2002.00, 2345678906, 'ES1901821302192345678906', 'BBVA', '1302'); -- Cuenta_corriente

这是触发器的代码:

CREATE OR REPLACE TRIGGER actualizar_saldo
  AFTER INSERT ON Retirada
  FOR EACH ROW
BEGIN
  -- Actualizar el saldo de la cuenta correspondiente
  UPDATE Cuenta SET saldo_actual = saldo_actual - (SELECT cantidad FROM retirada WHERE codigo_operacion = :NEW.retirada) WHERE iban = (SELECT cuenta_emisora FROM retirada WHERE codigo_operacion = :NEW.retirada);
END;

它应该是从“Cuenta”中提取资金的。在启动触发器后,如果我尝试:

INSERT INTO Retirada (codigo_operacion, fecha, hora, cantidad, descripcion, cuenta_emisora, su_codigo_oficina)
VALUES (9, SYSDATE, CURRENT_TIMESTAMP, 250, 'Retirada 5', 'ES1901821302192345678906', '1302');

Oracle给了我这个错误,但它应该做的是从一个特定的“Cuenta”中提取250。我似乎找不到原因。谢谢你的帮助。

qgzx9mmu

qgzx9mmu1#

您似乎希望使用:NEW记录,而不是尝试从表中SELECT

CREATE OR REPLACE TRIGGER actualizar_saldo
  AFTER INSERT ON Retirada
  FOR EACH ROW
BEGIN
  -- Actualizar el saldo de la cuenta correspondiente
  UPDATE Cuenta
  SET   saldo_actual = saldo_actual - :NEW.cantidad
  WHERE iban = :NEW.cuenta_emisora;
END;
/

fiddle

相关问题