2017-01-11 2 views
1

トリガーを作成する必要があります。すべてをコンパイルしますが、私のビューに何かを挿入したい場合は、エラーメッセージが表示されます。多分あなたは私を助けることができます。ORACLEトリガーではなく、ネストした表のビューに挿入する

SET DEFINE off; 
CREATE OR REPLACE TRIGGER LieferantOV_trig 

INSTEAD OF INSERT 
ON LIEFERANT_OV 
FOR EACH ROW 
BEGIN 
    IF INSERTING THEN 
    INSERT INTO Lieferant (LiefNr, Name, Adresse) 
    VALUES(:new.LiefNr, :new.Name, ntTAdresse()); 

    INSERT INTO TABLE (SELECT Adresse FROM Lieferant ) VALUES 
    (TAdresse(:new.Straße, :new.PLZ, :new.Ort)); 

    END IF; 
    END; 

INSERT INTO Lieferant_OV 
VALUES(752443, 'Laepple Teublitz', 'Maxstr. 12', '93158', 'Teublitz'); 
ネストされた表については

CREATE OR REPLACE TYPE TAdresse AS OBJECT(
Straße VARCHAR2(50), 
PLZ VARCHAR2(5), 
Ort VARCHAR2(50) 
); 



CREATE TABLE Lieferant(
LiefNr number(6) PRIMARY KEY, 
Name varchar2(20) NOT NULL 
); 
1. 
CREATE OR REPLACE TYPE ntTAdresse AS TABLE OF TAdresse; 
2. 
ALTER TABLE Lieferant ADD Adresse ntTAdresse NESTED TABLE Adresse STORE AS TAdresseNT; 


CREATE OR REPLACE VIEW Lieferant_OV (LiefNr, Name, Straße, PLZ, ORT) 
AS SELECT k.LiefNr, k.Name, l.Straße, l.PLZ, l.Ort 
FROM Lieferant k, table(k.Adresse) l; 
+0

あなたはどのようなエラーが出るん:あなたは、このいずれかを行うことができ、既存のLieferantにアドレスを追加するために

? – GurV

+0

ちょっと、もう少しコードを追加しました。このエラーが発生しました:SQL-ERROR:ORA-04098:トリガー 'S74040.LIEFERANT_OV_TRIG'は有効ではありません。 04098. 00000 - "トリガー '%s。%s'は無効で、再検証に失敗しました" –

+0

Doあなたは1つの行を挿入したいですか? – GurV

答えて

0

あなたは挿入ごとに1つの行を保持したい場合、私はあなたがこれを行うしたいと思います。

CREATE OR REPLACE TRIGGER LieferantOV_trig 

INSTEAD OF INSERT 
ON LIEFERANT_OV 
FOR EACH ROW 
BEGIN 
    INSERT INTO Lieferant (LiefNr, Name, Adresse) 
    VALUES(:new.LiefNr, :new.Name, ntTAdresse(TAdresse(:new.Straße, :new.PLZ, :new.Ort))); 
END; 
/

これは、アドレス列に1つのアドレスのみが含まれている場合に機能します。しかし、それはネストされたテーブルの目的ではありません。したがって、LiefNrを指定してテーブルに既存の行が存在するかどうかを確認することをお勧めします。はいの場合は、ネストした表にのみ挿入します。

+0

よろしくお願いいたします。このフォームでは、このトリガーもエラーなしでコンパイルされません。私はこれをほぼ同じにしました。しかし、私はこのように私のビューに行を挿入するとエラーが発生します:INSERT INTO Lieferant_OV VALUES(752443、 'Laepple Teublitz'、 'Maxstr。12'、 '93158'、 'Teublitz'); –

1

構文は次のようにする必要があります:

CREATE OR REPLACE TRIGGER LieferantOV_trig 
    INSTEAD OF INSERT 
    ON LIEFERANT_OV 
    FOR EACH ROW 
BEGIN 
    INSERT INTO Lieferant (LiefNr, Name, Adresse) 
    VALUES(:new.LiefNr, :new.Name, ntTAdresse(TAdresse(:new.Straße,:new.PLZ,:new.ORT)); 

END; 

あなただけINSERT

注意の上お使いのトリガーが起動するのでIF INSERTING THENをスキップすることができ、これにより各レコードは最大1つのアドレスのみ、これネストされたテーブルに持っていますあまり意味がありません。

CREATE OR REPLACE TRIGGER LieferantOV_trig 
    INSTEAD OF INSERT 
    ON LIEFERANT_OV 
    FOR EACH ROW 

DECLARE 
    lieferantCount INTEGER; 
BEGIN 

    select count(*) 
    into lieferantCount 
    from Lieferant 
    where LiefNr = :new.LiefNr 
     and Name = :new.Name; 

    if lieferantCount = 0 then 
     INSERT INTO Lieferant (LiefNr, Name, Adresse) 
     VALUES(:new.LiefNr, :new.Name, ntTAdresse(TAdresse(:new.Straße,:new.PLZ,:new.ORT))); 
    else 
     UPDATE Lieferant 
     SET Adresse = Adresse MULTISET UNION ntTAdresse(TAdresse(:new.Straße,:new.PLZ,:new.ORT)) 
     WHERE LiefNr = :new.LiefNr 
     and Name = :new.Name; 
    end if; 

END; 
関連する問題