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

标签 sql oracle oracle11g user-defined-types ordbms

我有一个 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/

相关文章:

sql - 无循环依赖的依赖树的PostgreSQL设计

python 和甲骨文

c++ - 如何使用 Oracle 存储过程中的 C++ 函数

oracle - to_date 函数与 sysdate

mysql - 如何在表之间传输数据,仅在id不存在的情况下

sql - 如何统计每个老师教过多少学生?

mysql - 无符号字段更新为最大值

java - 敏感可滚动结果集不反射(reflect) Oracle 数据库中的数据库更改

oracle11g - 如何像SQL2005数据库一样备份和还原ORACLE数据库11g

database - Oracle XE 11g 找不到 XE 数据库