2

私はオラクルでいくつかのオブジェクトリレーショナルなことをしています。いつものように 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 にアクセスし、この質問に対する私の意見が変わりました。できるからといって、物事を複雑にするべきではありません。これは、データベース設計の最も重要なルールの 1 つであり、DML ステートメントの異常を可能な限り減らすことです。

入れ子になったテーブルをテーブルの列として使用すると、単純な SQL ステートメントでの処理が複雑になり、処理が難しくなるというのが私の個人的な経験です。私はそれをここで読み、彼らはこれを確認しました。ネストされたテーブルを使用して、ある程度の労力を節約するためにデータベース設計を非正規化しようとしますが、常にネストを解除しようとするより多くの労力を費やすことになります。さらに、これらのネストした表に制約を適用することは困難です。

1 つの適切な解決策は、ネストされたテーブルの代わりに別のテーブルを使用し、できる限り正規化することです。実際のトランザクション データベースを設計していて、多くの DML を実行する場合は、テーブルのネスト解除を常に回避する必要があります。

ネストした表は、クエリからの結果をコレクションに一時的に一括収集して処理する必要がある PL/SQL の優れたオプションです。ネストされたテーブル列を持つテーブルを作成する場合とは異なります。

詳細については、この URL を再度ここに掲載します。

于 2013-05-22T02:57:58.510 に答える