sql >> データベース >  >> RDS >> Oracle

PL/SQLトリガーの問題

    コードをチャンクで表示しました。しかし、最初は更新なしで、スクリプトとして一緒に表示したものを実行しているようです:

    drop table SalUpdates cascade constraints;
    create table SalUpdates(
    SalSSN char(9), 
    newSalary decimal(10,2), 
    oldSalary decimal(10,2)
    );
    
    create or replace trigger t1
    after update of salary on employee
    for each row
    begin
    insert into SalUpdates values (:old.Ssn, :new.salary, :old.salary);  
    end;
    

    SQL Developerでスクリプトとして実行すると、スクリプト出力ウィンドウに次のように表示されます。

    drop table SalUpdates cascade constraints
    Error report -
    ORA-00942: table or view does not exist
    00942. 00000 -  "table or view does not exist"
    *Cause:    
    *Action:
    
    Table SALUPDATES created.
    
    
    Trigger T1 compiled
    

    次に、更新ステートメントをスクリプトに追加する場合:

    drop table SalUpdates cascade constraints;
    create table SalUpdates(
    SalSSN char(9), 
    newSalary decimal(10,2), 
    oldSalary decimal(10,2)
    );
    
    create or replace trigger t1
    after update of salary on employee
    for each row
    begin
    insert into SalUpdates values (:old.Ssn, :new.salary, :old.salary);  
    end;
    
    update employee
    set salary=4000
    where ssn='123456789';
    

    あなたが得る:

    Table SALUPDATES dropped.
    
    
    Table SALUPDATES created.
    
    
    Trigger T1 compiled
    
    Errors: check compiler log
    

    次に、更新を単独で(スクリプトではなくステートメントとして、またはそのテストを選択してスクリプトとして実行することにより)実行しようとすると、実際に次のようになります。

    SQL Error: ORA-04098: trigger 'MYSCHEMA.T1' is invalid and failed re-validation
    04098. 00000 -  "trigger '%s.%s' is invalid and failed re-validation"
    *Cause:    A trigger was attempted to be retrieved for execution and was
               found to be invalid.  This also means that compilation/authorization
               failed for the trigger.
    *Action:   Options are to resolve the compilation/authorization errors,
               disable the trigger, or drop the trigger.
    

    user_errorsをクエリする場合 show errorsを表示または実行します 、次のように表示されます:

    PLS-00103: Encountered the symbol "UPDATE"
    

    問題は、create triggerを完了していないことです。 適切にステートメント。 update 同じPL/SQLブロックの一部として表示されています。無効な部分ですが、まだ含まれています。

    PL / SQLブロックがある場合は、スラッシュで終了する必要があります。 SQL*Plusのドキュメントで説明されているとおり (これは主にSQL Developerにも当てはまります):

    ただし、SQL Developerは、スクリプトの最後のブロックに終了スラッシュがない場合でも文句を言わないため、元のスクリプト(更新なし)は機能します。 SQL * Plusでは、プロンプトが表示されます 。それはある種、そこにあるべきだと推測します-助けようとします。 updateを追加するとき ステートメントはスクリプトの終わりではなくなったため、適用されません。

    PL / SQLコードと次のSQL文の間にスラッシュをスクリプトに追加すると、すべて機能します。

    drop table SalUpdates cascade constraints;
    create table SalUpdates(
    SalSSN char(9), 
    newSalary decimal(10,2), 
    oldSalary decimal(10,2)
    );
    
    create or replace trigger t1
    after update of salary on employee
    for each row
    begin
    insert into SalUpdates values (:old.Ssn, :new.salary, :old.salary);  
    end;
    /
    
    update employee
    set salary=4000
    where ssn='123456789';
    

    そして今あなたは見る:

    Table SALUPDATES dropped.
    
    
    Table SALUPDATES created.
    
    
    Trigger T1 compiled
    
    
    1 row updated.
    



    1. SQLServerでINNERJOINを使用して削除するにはどうすればよいですか?

    2. DBAの生涯についての陽気なツイート

    3. apex管理者アカウントのロックを解除する

    4. MySQL wait_timeoutは、長いクエリに対して受け入れられませんか?