在触发器中强制转换用户定义的类型 - ORACLE



我有这个继承类型结构:

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:错误的绑定变量"新。因特莱斯'

我怎样才能实现呢?

我已经尝试过这个:

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'">

开始作为注释,但由于格式问题移至答案。

Interes仅在De_ahorro_udt中可用,在Cuenta_udt上不可用。因此,当您引用Cuenta_udt对象时,您无法访问该属性 - 这是错误的根本原因。

您可以尝试投(:new as De_ahorro_udt).Interes,看看会发生什么或使用IS OF

其他材料

最新更新