我有一个 table 区域和医生。医生有各种各样的专业和工作领域的引用。我试图创建的触发器检查我将在更新中引用的区域的名称是否与他的其中一个区域的名称相同特色专业。
我一直在尝试不同的事情,但没有任何效果
示例 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;
/
需要明确的是,我不认为使用嵌套表是存储这些数据的最佳方法:正确的方法是使用 SPECIALTY 的引用表和交集表 DOCTOR_SPECIALITY 来保存哪些医生从事哪些专业。
但是,我很想知道是否有人可以想出比上述更优雅的解决方案。
关于sql - 如何创建需要检查新值是否位于同一个表中的数组上的触发器(oracle 11g),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50109424/