Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle触发器中的RTTI_Oracle_Plsql_Oracle11g_Triggers_Oracle Objects - Fatal编程技术网

Oracle触发器中的RTTI

Oracle触发器中的RTTI,oracle,plsql,oracle11g,triggers,oracle-objects,Oracle,Plsql,Oracle11g,Triggers,Oracle Objects,我有以下几种类型: create or replace type Service_TY as object( code INTEGER, visit_analysis char(1) )FINAL; / 这些虚拟表格: CREATE TABLE Service of Service_TY( code primary key, visit_analysis not null check (visit_analysis in ('v', 'a')) ); / CREATE TAB

我有以下几种类型:

create or replace type Service_TY as object(
  code INTEGER,
  visit_analysis char(1)
)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;
/

我想创建一个触发器,当在训练中插入一个新元组时,它应该检查,如果员工是助理(而不是医生),那么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;
但它不起作用。 我应该如何检查该类型? 我得到的错误是:
错误(14,4):PLS-00103:在预期以下情况之一时遇到符号“;”:如果根据
的文档,该
处于
状态,则需要将类型括在括号中,如:

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


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

尝试将其放入变量中,下面的一个应该可以工作

创建或替换
触发检查(u)适应化
在插入训练前
每行
声明
emp员工;
服务性;
开始
从dual中选择deref(:new.employee)进入emp;
如果(环境管理计划属于(助理)),则
从dual中选择deref(:new.service)进入ser;
如果ser.visit_analysis='v',则
引发应用程序错误('-20001',无效元组');
如果结束;
如果结束;
结束;
/

CREATE TRIGGER
语句后面没有
/
语句,这与所有其他语句不同。你真的执行了它并创建了触发器吗?是的,我已经执行了它,编译器告诉我IF语句错误(14,4):PLS-00103:遇到符号“;”当期望以下情况之一时:如果编辑你的问题以包含错误消息将是好的。我仍然得到相同的问题,编译器的错误毫无帮助,oracle文档似乎避免谈论对象以及如何处理对象
IF (:NEW.EMPLOYEE is of (ASSISTANT_TY) )