Приведение пользовательских типов в триггер - ORACLE - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть эта структура типа наследования:

CREATE OR REPLACE TYPE Cuenta_udt AS OBJECT (
    IBAN               VARCHAR(28),
    Saldo              FLOAT,
    Numero_de_cuenta   NUMBER,
    Fecha_creacion     DATE,
    Clientes           clientes_array) NOT INSTANTIABLE NOT FINAL;
/

CREATE OR REPLACE TYPE De_ahorro_udt UNDER Cuenta_udt (
    Interes         FLOAT,
    Ultimo_devengo  NUMBER ) FINAL;
/

CREATE OR REPLACE TYPE Corriente_udt UNDER Cuenta_udt (
    Oficina_bancaria_Codigo     NUMBER,
    Oficina_bancaria_Direccion  VARCHAR(100),
    Oficina_bancaria            REF Oficina_bancaria_udt ) FINAL;
/

, которая становится этой таблицей:

CREATE TABLE Cuenta OF Cuenta_udt (
    IBAN                        PRIMARY KEY,
    Saldo                       NOT NULL,
    Numero_de_cuenta            NOT NULL,
    Fecha_creacion              NOT NULL
) OBJECT IDENTIFIER IS SYSTEM GENERATED;

Теперь я хотел бы определить триггер, который выполняет некоторые действия илинекоторые другие в зависимости от конкретного типа данных (De_ahorro или Corriente) это так.Я пробовал это, но не работает:

CREATE OR REPLACE TRIGGER actualizarSaldo
BEFORE INSERT ON Cuenta
FOR EACH ROW
BEGIN
    IF :NEW.Interes IS NOT NULL THEN
        RAISE_APPLICATION_ERROR(-20000, 'Soy de ahorro');
    ELSE
        RAISE_APPLICATION_ERROR(-20001, 'Soy corriente');
    END IF;
END;
/

Ошибка:

PLS-00049: неверная переменная связывания 'NEW.INTERES'

Как я могудостигнуть этого?

Я уже пробовал это:

CREATE OR REPLACE TRIGGER actualizarSaldo
BEFORE INSERT ON Cuenta
FOR EACH ROW
BEGIN
    IF :NEW IS OF (De_ahorro_udt) THEN
        RAISE_APPLICATION_ERROR(-20000, 'Soy de ahorro');
    ELSE
        RAISE_APPLICATION_ERROR(-20001, 'Soy corriente');
    END IF;
END;
/

Но я получаю эту ошибку: "PLS-00049: bad bind variable 'NEW'"

1 Ответ

1 голос
/ 07 апреля 2019

Начат как комментарий, но из-за проблем с форматированием перенесен в ответ.

Interes доступно только в De_ahorro_udt, но не в Cuenta_udt.Поэтому, когда у вас есть ссылка на Cuenta_udt объект, у вас нет доступа к этому атрибуту - и это является основной причиной ошибки.

Вы можете попытаться разыграть (:new as De_ahorro_udt).Interes и посмотреть, что произойдет, или использовать IS OF.

Дополнительные материалы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...