2016-07-21 20 views
2

Ich versuche pl/sql Trigger zu lernen. Ich versuche, einen einfachen Trigger durch Tracking Tutorial http://www.tutorialspoint.com/plsql/plsql_triggers.htm zu erstellen, aber ich habe unter Fehler. Ich suchte im Internet, konnte aber keine Lösung finden. Könnten Sie mir zu diesem Thema helfen?SP2-0552: Bindevariable "NEW" ist nicht deklariert

CREATE OR replace TRIGGER display_salary_changes 
    BEFORE DELETE OR INSERT OR UPDATE ON ok.customers 
    FOR EACH ROW 
DECLARE 
    sal_diff NUMBER; 
BEGIN 
    sal_diff := :NEW.salary - :OLD.salary; 
END; 
/


Trıgger DISPLAY_SALARY_CHANGES created. 

SP2-0552: Bind Variable "NEW" is not declared. 

PL/SQL procedure successfully completed. 

Edit: Ich bin mit SQL Developer Version 4.1.1

enter image description here

+0

Sie versuchen, in sqlplus oder etwas andere (SQL-Entwickler, plsql Entwickler, Kröte) zu kompilieren? –

+0

@ АнатолийПредеин, Ich benutze Sql Developer Version 4.1.1 –

+0

Datei -> neu -> Alle Elemente -> Sql-Datei (Datenbank-Datei) -> und früheren Code im Fenster und drücken Sie dann F5. siehe Screenshot https://gyazo.com/0763ec50a7aa637a66305366f7bed5ee ohne Fehler –

Antwort

1

Works für mich (zB von Ihrem Link, aber es ist im Grunde das gleiche wie Ihr Beitrag):

SQL> create table demo (id integer, salary number); 

Table created. 

SQL> create or replace trigger display_salary_changes 
    2 before delete or insert or update on demo 
    3 for each row 
    4 when (new.id > 0) 
    5 declare 
    6  sal_diff number; 
    7 begin 
    8  sal_diff := :new.salary - :old.salary; 
    9  dbms_output.put_line('Old salary: ' || :old.salary); 
10  dbms_output.put_line('New salary: ' || :new.salary); 
11  dbms_output.put_line('Salary difference: ' || sal_diff); 
12 end; 
13/

Trigger created. 

SQL> show errors 
No errors. 
SQL> insert into demo (id, salary) values (1, 100); 
Old salary: 
New salary: 100 
Salary difference: 

1 row created. 

SQL> update demo set salary = salary * 1.1 where id = 1; 
Old salary: 100 
New salary: 110 
Salary difference: 10 

1 row updated. 

In Ihrem Beispiel zeigt es

Trıgger DISPLAY_SALARY_CHANGES created. 

die nicht aussieht wie SQL * Plus-Ausgabe. Welches Werkzeug hast du benutzt?

Danach gibt es eine SQL * Plus SP2-0552 Fehler über einen nicht definierten Bind Variable, gefolgt von

PL/SQL procedure successfully completed. 

Welches Verfahren war das? Ich vermute, dass dies die Ausgabe eines Skripts mit einem anderen Schritt ist, der nach dem Erstellen des Triggers fehlschlägt.

Ist der Trigger gültig? Sie können in der Regel der rechten Maustaste und überprüfen Eigenschaften in Desktop-Tools, oder an der SQL * Plus-Eingabeaufforderung eingeben

show errors trigger display_salary_changes 
+0

Ich benutze Sql Developer Version 4.1.1 und ich laufe nur über Skript. –

+0

Und ist der Trigger gültig? –

+0

Sql-Entwickler sagt, dass es keinen Fehler gibt –

1

Try this:

CREATE OR replace TRIGGER test_trg 
    BEFORE DELETE OR INSERT OR UPDATE ON test 
    FOR EACH ROW 
DECLARE 
    sal_diff NUMBER; 
BEGIN 
    sal_diff := :new.d - :old.d; 
END; 
/
+0

Jetzt: SP2-0552: Bind Variable " neu "wird nicht erklärt. –

+0

Es wurde hier in meinem System erfüllt. Überprüfen Sie, ob etwas anderes in Ihrem Programm falsch ist. – XING

+0

Ich benutze Sql Developer Version 4.1.1. Könnte es das Problem sein? –

1

Können Sie bitte Sie Spaltennamen überprüfen. Ich habe deinen Code unten ausprobiert und ich habe ausgegeben.

create table test 
(
no number(10), 
sal number(10) 
); 

CREATE OR replace TRIGGER test_tr 
    BEFORE DELETE OR INSERT OR UPDATE ON test 
    FOR EACH ROW 
DECLARE 
    sal_diff NUMBER; 
BEGIN 
    sal_diff := :NEW.sal - :OLD.sal; 
    dbms_output.put_line(sal_diff); 
END; 
/



insert into test values(1,100); 

update test set sal=200 where no=1; 

Ausgang:

1 rows inserted. 


4 rows updated. 
100 
100 
100 
100 

1 rows inserted. 
+0

Ich benutze Sql Developer Version 4.1.1 und wenn ich das Skript erneut ausführen, habe ich den gleichen Fehler –

+0

Können Sie bitte Ihren Compiler Fehler veröffentlichen? –