2016-07-21 265 views
2

pl/sqlトリガーを学習しようとしています。私はチュートリアルhttp://www.tutorialspoint.com/plsql/plsql_triggers.htmを追跡することによって簡単なトリガーを作成しようとしていますが、私は以下のエラーが発生しました。私はインターネットで検索しましたが、解決策を見つけることができませんでした。この問題について私を助けてくれますか?SP2-0552:バインド変数 "NEW"が宣言されていません

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. 

編集:私はこれを試してみてくださいSQLの開発者向けバージョン4.1.1

enter image description here

+0

(SQL Developerの、PLSQL開発者、ヒキガエル)を入力することができますか? –

+0

@私は、SQLデベロッパーバージョン4.1.1 –

+0

ファイル - >新規 - >すべてのアイテム - > Sqlファイル(データベースファイル) - >ウィンドウの過去のコードを使用していて、F5キーを押しています。スクリーンショットを参照してくださいhttps://gyazo.com/0763ec50a7aa637a66305366f7bed5eeエラーなし –

答えて

1

私の作品(あなたのリンクの例が、それは基本的にあなたのポストと同じです):

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. 

あなたの例では、それは

を示し
Trıgger DISPLAY_SALARY_CHANGES created. 

SQL * Plusの出力に似ています。どのツールを使用しましたか?

それはどのような手順

PL/SQL procedure successfully completed. 

続く、SQL * Plusは未定義のバインド変数についてSP2-0552エラーを与えた後、それはでしたか?私はこれがトリガーが作成された後に失敗しているいくつかの他のステップでスクリプトからの出力だと思う。

トリガーは有効ですか?あなたは通常、右クリックして、[デスクトップツールのプロパティを確認し、またはSQL *でPlusのプロンプトが

あなたはSQLPLUSか何か他の人にコンパイルしよう
show errors trigger display_salary_changes 
+0

私はSql Developer Version 4.1.1を使用していますが、上記のスクリプトのみを実行しています。 –

+0

トリガーは有効ですか? –

+0

Sqlデベロッパーにはエラーはありません –

1

を使用しています:

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

Now:SP2-0552:バインド変数 "新しい "は宣言されていません。 –

+0

私のシステムではこれが守られています。 urプログラムで何か間違っていないか確認してください。 – XING

+0

Sql Developer Version 4.1.1を使用しています。それは問題だろうか? –

1

あなたはあなたの列名をチェックしてくださいすることができます。私はあなたのコードを試してみて、私は出力を得た。

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; 

出力:

1 rows inserted. 


4 rows updated. 
100 
100 
100 
100 

1 rows inserted. 
+0

私はSql Developer Version 4.1.1を使用していますが、スクリプトを再実行すると同じエラーが発生します –

+0

コンパイルエラーを投稿できますか? –

関連する問題