Oracle 触发器中的 RTTI

问题描述

我有这个虚拟类型:

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' 以了解它是否是一个合法的元组

我不知道如何查看 Employee 的类型(如果是医生或助理)。

我会这样做:

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

解决方法

试着把它放到一个变量中,下面的应该可以。

import seaborn as sns
sns.scatterplot(data=counts,x="PTSD_symptom_SUM",y="PTSD_SUM",hue="size",size="size")
,

根据 IS OF 条件的文档,您需要将类型括在括号中,例如:

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

每个https://docs.oracle.com/cd/B28359_01/server.111/b28286/conditions014.htm#SQLRF52157

我对使用对象类型不是很熟悉,所以可能还有一些我没有看到的其他问题。