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

问题描述 投票:0回答:1

我有这种继承类型结构:

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'

sql database oracle plsql triggers
1个回答
1
投票

作为评论开始,但由于格式问题转移到答案。

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

你可以尝试施放(:new as De_ahorro_udt).Interes,看看发生了什么或使用IS OF

Additional materials

© www.soinside.com 2019 - 2024. All rights reserved.