我正在oracle中做一些Object-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.
任何人都可以帮助我吗?
提前致谢。
答案 0 :(得分:0)
我自己为此找了很多答案,却找不到。访问了Martin Drautzbug在该网址中提供的网址,我对此问题的看法发生了变化。你不应该因为可以而使事情复杂化。这是数据库设计最重要的规则之一 - 尽可能减少DML语句的异常。
我个人的经验是,使用嵌套表作为表列只会使事情变得更复杂,并且难以使用简单的SQL语句进行处理。我读了here,他们证实了这一点。我们尝试对数据库设计进行非规范化,以便通过使用嵌套表来节省一些工作量,但这只会导致我们更加努力地尝试取消嵌套它们。另外,很难对这些嵌套表强制执行约束。
一个好的解决方案是使用单独的表而不是嵌套表,并尽可能地规范化。如果您正在设计一个真正的事务数据库并且要进行大量的DML,那么您应该始终逃避表的非嵌套。
嵌套表是PL / SQL中的一个很好的选项,您必须在集合中临时批量收集查询结果并对其进行处理。创建具有嵌套表列的表是不一样的。
我将再次发布此网址here,以便您访问以获取更多详细信息。