2

我在 oracle 中做一些对象关系的东西。我在使用嵌套的引用表时遇到问题,我无法像往常一样控制 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.

谁能帮我?

提前致谢。

4

1 回答 1

0

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

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

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

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

我再次在此处发布此 URL以供您访问以获取更多详细信息。

于 2013-05-22T02:57:58.510 回答