首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle触发器中的RTTI

Oracle触发器中的RTTI
EN

Stack Overflow用户
提问于 2021-01-26 00:13:42
回答 2查看 53关注 0票数 1

我有这样的虚拟类型:

代码语言:javascript
复制
create or replace type Service_TY as object(
  code INTEGER,
  visit_analysis char(1)
)FINAL;
/
代码语言:javascript
复制
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;
/

和这些虚拟表格:

代码语言:javascript
复制
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‘,以知道它是否是合法的元组。

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

我会这样做:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-26 02:42:52

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

代码语言:javascript
复制
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;
/
票数 1
EN

Stack Overflow用户

发布于 2021-01-26 00:31:12

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

代码语言:javascript
复制
IF (:NEW.EMPLOYEE is of (ASSISTANT_TY) )

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65888422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档