控制oracle中嵌套引用表的约束

时间:2013-01-17 21:34:06

标签: oracle plsql triggers nested-table

我正在oracle中做一些O​​bject-Relational的东西。我有一个嵌套的引用表的问题,我不能像往常一样控制PK,所以我必须创建一个触发器来控制它。

类型是:

CREATE OR REPLACE TYPE Tipo_Persona AS OBJECT (
    id number(5),
    nombre varchar2(20),
    apellidos varchar2(30),
    dni varchar2(9),
    telefonos ListaTelefonos, 
    fecha_alta date,    
    MAP MEMBER FUNCTION getPID RETURN NUMBER    
)NOT FINAL;
/

CREATE OR REPLACE TYPE Tipo_HoraActividad AS OBJECT
(
    idact NUMBER(3),
    Hora_Inicio DATE,
    Dia VARCHAR2(10),
    Duracion NUMBER(4,2),
    ...
    Monitor REF Tipo_Monitor
);
/

CREATE OR REPLACE TYPE Tipo_Monitor_Horas AS TABLE OF REF Tipo_HoraActividad;
/

CREATE OR REPLACE TYPE Tipo_Monitor UNDER Tipo_Persona
(
    Actividades Tipo_Monitor_Horas,
    Sueldo_Hora NUMBER(4,2),
    MEMBER FUNCTION sueldo return NUMBER,
    PRAGMA RESTRICT_REFERENCES (sueldo, WNDS)
);
/

-- Creation of Tables

...

CREATE TABLE Tabla_Monitor OF Tipo_Monitor
(
    constraint PK_MONITOR PRIMARY KEY(id),
    constraint UNIQUE_DNI_MONITOR UNIQUE(dni),
    dni NOT NULL,
    fecha_alta NOT NULL,
    nombre NOT NULL
)
NESTED TABLE Actividades STORE AS Actividades_Impartidas;

...

所以现在......我的触发器:

CREATE OR REPLACE TRIGGER TRG_name
BEFORE INSERT OR UPDATE ON Actividades_Impartidas
FOR EACH ROW

...
-- I can deref the :new row of Tipo_HoraActividad and check if
-- their values are NULL.  But I don't know how to control if
-- it exists any other ref within the current table pointing to
-- the same HoraActividad(unique constraint). My main problem is
-- that I cannot access to this current table (Actividades_Impartidas)
-- because it is a nested table of a concrete row of Tabla_Monitor.

任何人都可以帮助我吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我自己为此找了很多答案,却找不到。访问了Martin Drautzbug在该网址中提供的网址,我对此问题的看法发生了变化。你不应该因为可以而使事情复杂化。这是数据库设计最重要的规则之一 - 尽可能减少DML语句的异常。

我个人的经验是,使用嵌套表作为表列只会使事情变得更复杂,并且难以使用简单的SQL语句进行处理。我读了here,他们证实了这一点。我们尝试对数据库设计进行非规范化,以便通过使用嵌套表来节省一些工作量,但这只会导致我们更加努力地尝试取消嵌套它们。另外,很难对这些嵌套表强制执行约束。

一个好的解决方案是使用单独的表而不是嵌套表,并尽可能地规范化。如果您正在设计一个真正的事务数据库并且要进行大量的DML,那么您应该始终逃避表的非嵌套。

嵌套表是PL / SQL中的一个很好的选项,您必须在集合中临时批量收集查询结果并对其进行处理。创建具有嵌套表列的表是不一样的。

我将再次发布此网址here,以便您访问以获取更多详细信息。