我如何创建一个触发器来检查新值是否在同一个数组中 table (oracle 11g)

How do i create a trigger that needs to check if the new value is on an array in the same table (oracle 11g)

我有一个 table 区域和医生。医生有一系列的专业和工作领域的参考。我试图创建的触发器检查我将在更新中引用的区域名称是否与他的其中一个名称相同专长

我一直在尝试不同的东西,但是 none 的作品

示例 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 程序中)的原因之一。

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

设置:

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

明确地说,我不认为使用嵌套 tables 是存储此数据的最佳方式:正确的方法是引用 table 的 SPECIALTY 和一个交集 table DOCTOR_SPECIALITY坚持哪个医生执业哪个专科

不过,我很想知道是否有人可以提出比上述更优雅的解决方案。