【问题标题】:RTTI in Oracle TriggersOracle 触发器中的 RTTI
【发布时间】:2021-04-29 11:22:40
【问题描述】:

我有这个虚拟类型:

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

【问题讨论】:

  • 我注意到您在CREATE TRIGGER 语句之后没有/,这与您的所有其他语句不同。你真的执行了它并创建了触发器吗?
  • 是的,我已经执行过了,编译器告诉我 IF 语句中的一些随机错误
  • 错误(14,4):PLS-00103:遇到符号“;”预期以下情况之一时:如果
  • 最好编辑您的问题以包含错误消息。

标签: oracle plsql oracle11g triggers oracle-objects


【解决方案1】:

尝试将它放入一个变量中,下面的应该可以。

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;
/

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我仍然遇到同样的问题,编译器的错误根本没有帮助,oracle 文档似乎避免谈论对象以及如何处理它们
    猜你喜欢
    • 2010-12-17
    • 2015-06-30
    • 2011-05-11
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 2013-02-09
    • 2012-02-08
    相关资源
    最近更新 更多