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

时间:2019-04-07 16:14:43

标签: sql database oracle plsql triggers

我有这个继承类型结构:

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 个答案:

答案 0 :(得分:1)

以评论开头,但由于格式问题而移至答案。

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

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

Additional materials