RTTI в триггерах Oracle

У меня есть фиктивные типы:

      create or replace type Service_TY as object(
  code INTEGER,
  visit_analysis char(1)
)FINAL;
/
      create or replace type Employee_TY as object(
   dummy varchar(30)
)NOT FINAL;
/

create or replace type Doctor_TY UNDER Employee_TY(
  ID INTEGER
)FINAL;
/

create or replace type Assistant_TY UNDER Employee_TY(
  ID INTEGER
)FINAL;
/

create or replace type Habilitation_TY as object(
  employee ref Employee_TY,
  service ref Service_TY
)FINAL;
/

И эти фиктивные таблицы:

      CREATE TABLE Service of Service_TY(
  code primary key,
  visit_analysis not null check (visit_analysis in ('v', 'a'))
);
/

CREATE TABLE Doctor of Doctor_TY(
  ID primary key
);
/

CREATE TABLE Assistant of Assistant_TY(
  ID primary key
);
/

CREATE TABLE Habilitation of Habilitation_TY;
/

Я хочу создать триггер, который при вставке нового кортежа в Habilitation должен проверять, что, если сотрудник является помощником (а не врачом), атрибут visit_analysis равен «a», чтобы узнать, является ли он законным. кортеж.

Я не знаю, как проверить тип Сотрудника (врач это или ассистент).

Я бы сделал что-то вроде этого:

      create or replace
TRIGGER CHECK_HABILITATION
BEFORE INSERT ON HABILITATION
FOR EACH ROW
DECLARE
BEGIN
    IF (:NEW.EMPLOYEE is of ASSISTANT_TY)
    THEN
      IF :NEW.SERVICE.visit_analysis = 'v'
         THEN
             raise_application_error(-10000, 'invalid tuple');
    END IF;
END;

Но это не работает. Как мне проверить этот тип? Ошибка, которую я получаю: Error(14,4): PLS-00103: Encountered the symbol ";" when expecting one of the following: if

2 ответа

Попробуйте поместить его в переменную, должно работать следующее.

      create or replace
TRIGGER CHECK_HABILITATION
BEFORE INSERT ON HABILITATION
FOR EACH ROW
DECLARE
  emp employee_TY;
  ser service_TY;
BEGIN
  select deref(:new.employee) into emp from dual;
  if (emp is of (assistant_ty)) then
    select deref(:new.service) into ser from dual;
    if ser.visit_analysis = 'v' then
      raise_application_error('-20001', 'invalid tuple');
    end if;
  end if;
END;
/

Согласно документации на IS OFусловие, вам нужно заключить тип в круглые скобки, например:

      IF (:NEW.EMPLOYEE is of (ASSISTANT_TY) )

согласно https://docs.oracle.com/cd/B28359_01/server.111/b28286/conditions014.htm#SQLRF52157.

Я не совсем знаком с использованием типов объектов, поэтому может быть какая-то другая проблема, которую я не вижу.

Другие вопросы по тегам