2012-01-31 26 views
3

oracleフォームのエラー・メッセージを生成するdbトリガーを作成中に問題が発生しました。私を助けてもらえますか?トリガーの実行中に余分なメッセージを取得する

私のコードは次のとおりです。

CREATE OR REPLACE TRIGGER unsuccessful_attempts_lock 
     BEFORE UPDATE of last_logon_date 
ON temp_user 
FOR EACH ROW 

DECLARE 
CURSOR c_unsuccessful_attempts IS 
    SELECT * 
    FROM temp_unsuccessful_attempts 
    WHERE user_id=:NEW.user_id; 
max_fails EXCEPTION; 

BEGIN 
    FOR r_unsuccessful_attempts IN c_unsuccessful_attempts 
    LOOP 
    IF(r_unsuccessful_attempts.locked ='Y') THEN 
     RAISE max_fails; 
    END IF; 
    END LOOP; 
EXCEPTION 
    WHEN max_fails THEN 
    FND_MESSAGE.SET_NAME ('FND', 'FLEX-USER DEFINED ERROR'); 
    FND_MESSAGE.SET_TOKEN ('MSG', 'You have reached maximum failed logins. 
       This account has been locked temporarily. Please contact 
       your system administrator') 
    FND_MESSAGE.RAISE_ERROR; 
    WHEN OTHERS THEN 
    RAISE_APPLICATION_ERROR(-20400,'An error has occured.Please contact 
       your system administrator'||SQLCODE||SQLERRM); 
END unsuccessful_attempts_lock; 

ユーザーのアカウントがロックされると、temp_unsuccessful_attempts.lockedは「Y」に更新されますと/ SE彼はさらに、ログインできないようにする必要があり。 temp_userは、ユーザーがログインに成功したときに更新されるテーブルです。

ユーザーのアカウントがロックされた後(temp_unsuccessful_attempts.locked='Y')、正しいパスワードでログインしようとすると、tisのトリガーが起動して(temp_userの更新時に)、フォームでエラーが発生するロックされており、さらに進むべきではありません。私は取得しています

メッセージは次のとおりです。

ORACLE error -20001: ORA-20001: FLEX-USER DEFINED ERROR:N, MSG, You have reached maximum failed logins. Please contact your system administrator.

ORA-06512: at "APPS.FND_MESSAGE",line 66

ORA-06512: at "APPS.UNSUCCESSFUL_ATTEMPTS_LOCKS",line 38

ORA-04088: error during excution of trigger 'APPS.UNSUCCESSFUL_ATTEMPTS_LOCKS' has been detected in FND_SIGNON.NEW_SESSION.

私のトリガーは私のオラクルのアプリ画面上でいくつかの余分なメッセージを与えています。 FND_SIGNON.NEW_SESSIONはtemp_user.last_logon_dateが更新取得された手順である:私はちょうど

You have reached maximum failed logins.Your account is locked temporarily.Please contact your helpdesk.

P.Sを表示したいです。

答えて

2

ここでは、取得するには、スタックの最初のエラーだ機能を使用します。

function strip_first_error(pcode in number, pmessage in varchar2) return varchar2 is 
    -- 
    vpos number := instr(pmessage, 'ORA-', 5); 
    -- 
    begin 
    if pcode between 20000 and 20999 then 
     if vpos != 0 then 
     return(substr(substr(pmessage, 1, vpos -2),12)); 
     else 
     return(substr(pmessage,12)); 
     end if; 
    else 
     return pmessage; 
    end if; 
    end; 

と使用方法は次のとおりです。

when others then 
    message(strip_first_error(abs(sqlcode), sqlerrm)); 

EDIT

PS:これはですあなたのupdateの呼び出しでエラーを処理するものあなたの特定の例では:

begin 
    update last_logon_date ... 
exception 
    when others then 
     -- in forms you should use message or other function that display the error 
     -- in pl/sql you should use dbms_output.put_line, for example. 
     dbms_output.put_line(strip_first_error(abs(sqlcode) , sqlerrm)); 
end; 
+0

ありがとうございました。しかし、それは私にエラーを与えていると言って残念ながら、関数自体のコンパイル:TRIGGER UNSUCCESSFUL_ATTEMPTS_LOCKため エラー: LINE/COLのERROR -------- ---------- -------------------------------------------------- ----- 21/5 PLS-00201:識別子 'MESSAGE'を宣言する必要があります 21/5 PL/SQL:文は無視されます この機能はデータベース・トリガーでは機能しません。助けてください。 P.S:データベースにこのトリガーを作成して、アプリケーションでエラーメッセージを表示しています。私はアプリケーションコードを変更していません。 – prashant1988

+0

@ prashant1988 "メッセージ"を含むサンプルは、この機能を持つフォームの内部で使用することです。これをpl/sqlで使用する場合は、strip_first_errorだけを呼び出します。 –

+0

私は同じことを改めました。それでも私は1つのエラーが発生しています。 TRIGGER UNSUCCESSFUL_ATTEMPTS_LOCKのエラー: ライン/コールドエラー -------- ----------------------------- ------------------------------------- 21/5 PLS-00221: 'STRIP_FIRST_ERROR'はありません。プロシージャまたは定義されていません 21/5 PL/SQL:ステートメントが無視されました しかし、私はすでに関数を作成してコミットしました。 ------------------------- 関数が作成されました。 esp0002-SQL>コミット。 コミットが完了しました。 ------------------- お知らせください。 – prashant1988

関連する問題