Сравнение db2 среди типов данных refs - PullRequest
0 голосов
/ 14 апреля 2019

Я определил этот триггер для управления ссылками среди объектов после удаления, чтобы в схеме не оставалось «висячих ссылок»:

CREATE TRIGGER gestionRefTransferencia
BEFORE DELETE ON Corriente
REFERENCING OLD AS O
FOR EACH ROW MODE DB2SQL
BEGIN
    UPDATE Transferencia SET Cuenta_receptora = NULL WHERE Cuenta_receptora = O.oid;
END@

Но db2 возвращает следующую ошибку:

«Типы данных операндов для операции» = «несовместимы или сопоставимы»

Есть идеи, почему? Нельзя сравнивать типы данных ref?

Вот моя схема:

CREATE TYPE Cuenta_udt AS (
    IBAN               VARCHAR(28),
    Saldo              REAL,
    Numero_de_cuenta   BIGINT,
    Fecha_creacion     DATE
) mode DB2SQL;

CREATE TYPE Operacion_udt AS (
    Cod_Num       INTEGER,
    Descripcion   VARCHAR(100),
    Hora          INTEGER,
    Fecha         DATE,
    Cantidad      REAL,
    Cuenta_IBAN   VARCHAR(28)
) mode DB2SQL;

CREATE TYPE De_ahorro_udt UNDER Cuenta_udt AS (
    Interes         REAL,
    Ultimo_devengo  INTEGER
) mode DB2SQL;

CREATE TYPE Corriente_udt UNDER Cuenta_udt AS (
    Oficina_bancaria_Codigo     INTEGER,
    Oficina_bancaria_Direccion  VARCHAR(100)
) mode DB2SQL;

CREATE TYPE Transferencia_udt UNDER Operacion_udt AS (
    Cuenta_IBAN_receptora   VARCHAR(28),
    Cuenta_receptora        REF(Cuenta_udt)
) mode DB2SQL;

CREATE TABLE Cuenta OF Cuenta_udt (
    REF IS oid USER GENERATED,
    IBAN                        WITH OPTIONS NOT NULL,
    Saldo                       WITH OPTIONS NOT NULL,
    Numero_de_cuenta            WITH OPTIONS NOT NULL,
    Fecha_creacion              WITH OPTIONS NOT NULL,
    CONSTRAINT pk_cuenta PRIMARY KEY(IBAN)
);

CREATE TABLE Operacion OF Operacion_udt (
    REF IS oid USER GENERATED,
    Cod_Num         WITH OPTIONS NOT NULL,
    Hora                    WITH OPTIONS NOT NULL,
    Fecha                   WITH OPTIONS NOT NULL,
    Cantidad                WITH OPTIONS NOT NULL,
    Cuenta_IBAN             WITH OPTIONS NOT NULL,
    CONSTRAINT pk_operacion PRIMARY KEY(Cod_Num),
    FOREIGN KEY (Cuenta_IBAN) REFERENCES Cuenta(IBAN) ON DELETE CASCADE
);

CREATE TABLE Corriente OF Corriente_udt UNDER Cuenta INHERIT SELECT PRIVILEGES (
    FOREIGN KEY (Oficina_bancaria_Codigo, Oficina_bancaria_Direccion) REFERENCES Oficina_bancaria(Codigo, Direccion) ON DELETE SET NULL
);

CREATE TABLE Transferencia OF Transferencia_udt UNDER Operacion INHERIT SELECT PRIVILEGES (
    Cuenta_receptora        WITH OPTIONS SCOPE Cuenta,
    FOREIGN KEY (Cuenta_IBAN_receptora) REFERENCES Cuenta(IBAN) ON DELETE CASCADE
);

1 Ответ

0 голосов
/ 15 апреля 2019

Для сравнения двух разных типов эталонных данных приведите их соответствующим образом.

Например, если ваша иерархия CUENTA_UDT имеет "REF USING BIGINT", а также если ваш OPERACION_UDT использует "REF USING BIGINT", тогда ваш триггер можетвыглядит следующим образом:

CREATE or replace TRIGGER gestionRefTransferencia
BEFORE DELETE ON Corriente
REFERENCING OLD AS O
FOR EACH ROW MODE DB2SQL
BEGIN
         UPDATE Transferencia SET Cuenta_receptora = NULL WHERE cast(Cuenta_receptora as bigint) = cast(O.OID as bigint);
END@

Если ссылочные типы для двух иерархий используют разные базовые типы, то приведите / преобразуйте в общий базовый тип для сравнения.

...