2017-03-20 3 views
0

Ich versuche, diesen Auslöser zu aktivieren. Es wird ausgeführt, bevor Daten aus einer Tabelle und der zugehörigen Tabelle gelöscht werden, und dann werden die gelöschten Daten in 2 Tabellen eingefügt (die ich in tb1_arch und tb2_arch benannt habe). Ich habe gesucht, mögliche Lösungen in Google, aber ich habe wirklich keine Ahnung, wie diese Arbeit machenPLS-00049: Fehlerhafte Bindvariable Auslöser

CREATE OR REPLACE TRIGGER trig 
BEFORE DELETE ON tb1 FOR EACH ROW 
FETCH 
INSERT INTO tb1_arch VALUES (:old.OrderNum, :old.tb1Date,:old.CustomerName); 
DBMS_OUTPUT.PUT_LINE('Data archived.'); 
END; 

der Auslöser wurde oben erstellt. aber wenn ich diese Zeile hinzugefügt

INSERT INTO tb2_arch VALUES (:old.OrderNum, :old.ItemNum, :old.Pieces); 

nach INSERT INTO tb1_arch VALUES, es gibt mir einen Fehler

"Fehler in Zeile 5: PLS-00049: schlechte Bind-Variable 'OLD.PIECES'"

Jede Hilfe würde geschätzt werden!

EDIT: als Herr Vijayakumar vorgeschlagen, ich habe folgendes:

CREATE OR REPLACE TRIGGER trig 
    BEFORE DELETE ON tb1 
    REFERENCING OLD AS old FOR EACH ROW 
    INSERT INTO tb1_arch VALUES (:old.OrderNum, :old.tb1Date,:old.CustomerName); 
    INSERT INTO tb2_arch VALUES (:old.OrderNum, :old.ItemNum, :old.Pieces); 
    DBMS_OUTPUT.PUT_LINE('Data archived.'); 
    END 

Aber ich bin immer noch den gleichen Fehler aufweisen.

EDIT: entfernt FETCH, ich bin der Begegnung noch das gleiche Problem

CREATE OR REPLACE TRIGGER trig 
BEFORE DELETE ON tb1 FOR EACH ROW 

INSERT INTO tb1_arch VALUES (:old.OrderNum, :old.tb1Date,:old.CustomerName); 
INSERT INTO tb2_arch VALUES (:old.OrderNum, :old.ItemNum, :old.Pieces); 
DBMS_OUTPUT.PUT_LINE('Data archived.'); 
END; 

Die Tabelle sind wie folgt: tb1:

create table tb1 (
    OrderNum integer NOT NULL primary key, 
    tb1Date date NOT NULL, 
    CustomerName varchar2(50) NOT NULL, 

--constraints 
    CONSTRAINT tb1_uc unique (CustomerName) 
); 

TB2

create table tb2 (
    OrderNum integer NOT NULL, 
    ItemNum integer NOT NULL, 
    Pieces integer NOT NULL, 

--constraints 
    CONSTRAINT tb2_fk foreign key (OrderNum) references tb1(OrderNum), 
); 
+0

Sie sollten den Verweis 'REFERENCING OLD AS OLD' hinzufügen –

+0

Hallo! Vielen Dank für Ihre Antwort! Ich tat folgendes ERSTELLEN ODER ERSETZEN TRIGGER trig BEVOR LÖSCHEN ON tb_1 REFERENZ ALT AS alt für jede REIHE Allerdings habe ich immer noch den gleichen Fehler! –

Antwort

1

Das Schlüsselwort FETCH sollte verursachen dies, ersetzen Sie es durch BEGIN, die die richtige Syntax,

CREATE OR REPLACE TRIGGER trig 
BEFORE DELETE ON tb1 FOR EACH ROW 
BEGIN 
INSERT INTO tb1 VALUES (:old.OrderNum, :old.Date,:old.CustomerName); 
INSERT INTO tb2_arch VALUES (:old.OrderNum, :old.ItemNum, :old.Pieces); 
DBMS_OUTPUT.PUT_LINE('Data archived.'); 
END; 

EDIT: Der Spaltenname Sie OLD möglicherweise ungültig, was der Grund für diesen Fehler beziehen Verwendung ist.

Auslöser für nur ONE der Tabelle INSERT/UPDATE/DELETE Ereignis anwendbar. Sie können jedoch mehrere Tabellen im Textkörper referenzieren.

Aber OLD und NEW beziehen sich immer auf die Tabelle, die Sie in DDL wie DELETE ON tb1 erwähnt haben.

Der untenstehende modifizierte Code wird Ihnen helfen.

CREATE OR REPLACE TRIGGER trig 
BEFORE DELETE ON tb1 FOR EACH ROW 
DECLARE 
    v_ItemNum tb2.ItemNum%TYPE; 
    v_Pieces tb2.Pieces%TYPE; 
BEGIN 
    INSERT INTO tb1_arch VALUES (:old.OrderNum, :old.Date,:old.CustomerName); 

    /* Select the values for this item from table 2 */ 
    SELECT ItemNum,Pieces 
    INTO v_ItemNum,v_Pieces 
    FROM tb2 
    WHERE OrderNum = :old.OrderNum; 

    /* Insert the selected values in the table2's archive version */ 
    INSERT INTO tb2_arch VALUES (:old.OrderNum, v_ItemNum, v_Pieces); 

    /* Delete the entry */ 
    DELETE from tb2 WHERE OrderNum = :old.OrderNum; 

    DBMS_OUTPUT.PUT_LINE('Data archived.'); 
END; 

Alternativ können Sie die Daten eine weiteren Trigger for delete on table2 und Archiv.

+0

Hallo, vielen Dank für die Antwort auf meinen Beitrag! Ich habe getan, wie Sie gesagt haben, und ich habe immer noch das gleiche Problem. Und ja, es war mein Fehler, dass die FETCH nicht da sein sollte. Ich habe zuerst versucht, das Problem mit einem Cursor anzugehen, aber es hat nicht funktioniert. –

+0

Andernfalls sollte der Spaltenname 'Pieces' ungültig sein. Kannst du die Tabelle 'tb_1' beschreiben? –

+0

ich werde es einfach auf der Post hinzufügen, damit Sie es leichter lesen können haha ​​ –