2013-01-17 44 views
2

我正在做一些在oracle中的對象關係的東西。我遇到了嵌套的引用表問題,我無法像往常一樣控制PK,所以我必須創建一個觸發器來控制它。在oracle中引用嵌套表的控制約束

的類型是:

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

也許這有助於:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:8135488196597(它當然既可信又官方) –

回答

0

我自己找了很多答案,但找不到它。訪問了Martin Drautzbug在該URL中提供的網址,我的意見就此問題發生了變化。你不應該因爲可以讓事情變得複雜。這是數據庫設計的首要規則之一 - 儘可能減少DML語句的異常情況。

我個人的經驗是,使用嵌套表作爲表列只會使事情變得更加複雜和難以用簡單的SQL語句處理。我讀到它here他們證實了這一點。我們試圖使數據庫設計非規範化,以便通過使用嵌套表節省一些工作量,但這隻會讓我們付出更多的努力試圖將它們全部取消嵌套。另外,對這些嵌套表執行約束很困難。

一個好的解決方案是使用單獨的表格而不是嵌套表格,並儘可能地進行標準化。如果你正在設計一個真正的事務數據庫並且要做大量的DML,你應該總是避免表的非嵌套。

嵌套表是PL/SQL中的一個很好的選擇,您必須從集合中暫時查詢批量結果並處理它。創建嵌套表格列的表不一樣。

我再次發佈此網址here供您訪問了解更多詳情。