Sql 如何创建需要检查新值是否位于同一表(oracle 11g)中的数组上的触发器

Sql 如何创建需要检查新值是否位于同一表(oracle 11g)中的数组上的触发器,sql,oracle,oracle11g,user-defined-types,ordbms,Sql,Oracle,Oracle11g,User Defined Types,Ordbms,我有一张桌子和一位医生。这位医生有很多专业知识和工作领域的参考资料。我试图创建的触发器检查我将在更新中引用的区域的名称是否与他的某个专长的名称相同 我一直在尝试不同的事情,但都没有成功 例1 CREATE OR REPLACE TRIGGER TRIGGER9 BEFORE INSERT ON DOCTOR FOR EACH ROW WHEN (deref(new.worksIn).name in (select m.COLUMN_VALUE.name from table (select

我有一张桌子和一位医生。这位医生有很多专业知识和工作领域的参考资料。我试图创建的触发器检查我将在更新中引用的区域的名称是否与他的某个专长的名称相同

我一直在尝试不同的事情,但都没有成功

例1

CREATE OR REPLACE TRIGGER TRIGGER9 
BEFORE INSERT ON DOCTOR 
FOR EACH ROW
WHEN (deref(new.worksIn).name in (select m.COLUMN_VALUE.name from table (select deref(specialities) from doctor where pid = new.pid)
BEGIN
   null;
END;
例2

CREATE OR REPLACE TRIGGER TRIGGER9
BEFORE INSERT ON DOCTOR
FOR EACH ROW
BEGIN
    if deref(:new.worksIn).name in (select deref(:new.specialities).name) then
       -- stuff happens
    end if
END;

提前谢谢

我们无法对对象类型创建约束。这只是不推荐使用对象类型进行持久化(而不是在PL/SQL程序中)的一个原因

但是,可以在触发器中强制唯一性。这一步创建一组条目(即唯一值的一个实例),并将其与实际嵌套表进行比较。如果计数不同,则嵌套表具有重复的值

设置:

create or replace type speciality_t as object (name varchar2(30));
/

create or replace type specialities_nt as table of speciality_t;
/

create table doctors (
     doctor_id number primary key
     , works_in specialities_nt
     )
nested table works_in store as works_in_nt     ;
触发因素:

create or replace trigger ck_speciality 
    before insert or update on doctors
    for each row
declare
    dummy1 specialities_nt;
    dummy2 number;
begin
    -- all the unique values for WORKS_IN
    select  set(:new.works_in)
    into dummy1
    from dual;

    -- count diff 
    select  m - n
    into dummy2
    from ( select count(*) as m from table(:new.works_in)) t1
        cross join  ( select count(*) as n from table(dummy1)) t2;

    -- hurl if the difference is not zero
    if dummy2 != 0 then
        raise_application_error (-20042, 'duplicate speciality'); 
    end if;
end;
/

明确地说,我不认为使用嵌套表是存储这些数据的最佳方式:正确的方法是专业参考表和交叉表DOCTOR_SPECIALITY,以保留哪些医生从事哪些专业


然而,我很想知道是否有人能想出比上述更优雅的解决方案。

如果您有一个简单的子表来存储数据,您的生活和SQL就会简单得多。显示您的表结构。这种需求通常使用外键约束来实现,而不是触发器,不要这样做,这是一种代码味道。