2012-01-26 5 views
0

を発射しますと、画面上のいくつかの余分な例外とメッセージを取得する。これは私のコードです:私は私のオラクルのアプリ画面に取得していますは私のトリガーは

CREATE OR REPLACE TRIGGER unsuccessful_logins 
    AFTER INSERT OR UPDATE 
    ON temp_logins 
    for each row 

DECLARE 

     CURSOR c_unsuccessful_attempts 
     IS 
     SELECT * from temp_attempts 
     and user_id= :new.user_id; 

    max_fails EXCEPTION; 


    BEGIN 
     FOR r_unsuccessful_attempts in c_unsuccessful_attempts 
     LOOP 

      if(:new.user_id = r_unsuccessful_attempts.user_id) then 
       if (r_unsuccessful_attempts.locked = 'Y') then 
        raise max_fails; 
       end if; 
      else 
       null; 
      end if; 

     END LOOP;  

EXCEPTION 
    WHEN max_fails THEN 
     RAISE_APPLICATION_ERROR (-20300,'User '''||:new.login_name||''' has reached maximum failed logins. Please contact your system administrator ');  

    END unsuccessful_logins; 

エラーは次のとおりです。

APP-01564: ORACLE error 20300 in fdssgn 
cause: fdssgn failed due to ORA-20300: You have reached maximum failed logins. Please contact your system administrator. 
    ORA-06512: at "APPS.UNSUCCESSFUL_LOGINS",line 24 
    ORA-04088: error during excution of trigger 'APPS.UNSUCCESSFUL_LOGINS'. 

SQL文エラー時に実行されることであった: INSERT INTO TEMP_LOGINS(USER_ID、ATTEMPT_TIME、TERMINAL_ID、LOGIN_NAME) 値(:USER_ID、SYSDATE、:erminal_id、:のlogin_name)

ORA-20300: You have reached maximum failed logins. Please contact your system administrator部分を表示したいだけです。

と省略します:

ORA-06512: at "APPS.UNSUCCESSFUL_LOGINS",line 24 
    ORA-04088: error during excution of trigger 'APPS.UNSUCCESSFUL_LOGINS'. 
    The SQL statement being executed at the time of the error was: 
INSERT INTO TEMP_LOGINS (USER_ID, ATTEMPT_TIME,TERMINAL_ID,LOGIN_NAME) 
values(:user_id, sysdate,:erminal_id,:login_name) 

どのように私は、画面上でこれらの余分なメッセージをオフに取り除くことができますか?

+4

あなたが見るメッセージやエラーは何ですか?テーブル定義は何ですか? (そして、なぜあなたは、すべてのカーソルを使用している、ともそれにパラメータとしてユーザーIDを渡していない?) –

+3

あなたは余分な何の例外とメッセージを取得していますか?また、なぜあなたが直接関心のあるロックされたレコードを問い合わせることができるときに、temp_attemptsテーブルからすべてのレコードを取り出してループしているのですか? –

+0

私が投稿する前に私が考えていたものを正確に言うためのAlexへ+1。 –

答えて

0

私はあなたが「オラクルのアプリ」の意味を正確にわからないんだけど、this linkが役立つかもしれません。例外処理に関するセクションがあります。

私は以前のコメントで示唆したように、私はあなたがキャッチし、優雅に、トリガによって発生した例外ので、insert文のラッパーのいくつかの種類を処理するために、アプリケーションのコードで何かを必要と疑います。 (おそらくかなり明らかなように)リンクは、具体的には、私は精通していないよ形で例外処理の話ですが、校長は、あなたが関連するものを使用している場合と同じである可能性が高いです。

こののようなものが私が思う何収まるかもしれませんが、少し彼らの例を適応あなたがやろうとしている:

DECLARE 
    too_many_attempts EXCEPTION; 
    PRAGMA EXCEPTION_INIT(too_many_attempts, -20300); 
BEGIN 
    INSERT INTO TEMP_LOGINS (USER_ID, ATTEMPT_TIME,TERMINAL_ID,LOGIN_NAME) 
    values(:user_id, sysdate,:erminal_id,:login_name); 
EXCEPTION 
    WHEN too_many_attempts THEN 
     fnd_message.set_string(SQLERRM); 
     fnd_message.error; 
     RAISE FORM_TRIGGER_FAILURE; 
END; 
+0

ありがとう、アレックス。そのリンクは非常に便利です。はい、あなたは正しいです、そのオラクルアプリケーションのフォーム。私は今これを試してみる。 – prashant1988

+0

リンクに感謝します。私は記事全体を読んで、解決策を見つけました。実際には、アプリケーションコードに触れる必要はありません。私は、トリガ・コードで下記てきました:FND_MESSAGE.SET_NAME(「FND」、「FLEX-USER定義のエラーを」); \t \t FND_MESSAGE.SET_TOKEN( 'MSG'、 '最大ログインに失敗しました。このアカウントは一時的にロックされています。 APP_EXCEPTION.RAISE_EXCEPTION; 「FLEX-USER DEFINED ERROR」は、アプリケーション用にセットアップする必要があるメッセージコードです。それは私のために働いています。ありがとう、トン! prashant1998 @ – prashant1988

+0

- 助けて嬉しいです。もしリンクが役に立つならば、自由にupvote/acceptを感じてください! –

0

簡単な答えは、あなたがRAISE_APPLICATION_ERRORからの出力を省略することはできません。 dbms_output.put_lineを使用して単一のメッセージを提供することを検討できます。

...

WHEN max_fails THEN 
    dbms_output.put_line('User Message'); 
+0

ありがとう!私も同じことを考えていました。しかし、問題は次のとおりです。オラクルのアプリ画面にポップアップメッセージを表示できるのでしょうか? – prashant1988

+0

私はdbms_output.put_lineを使ってみました。バックエンドでは例外が発生していますが、ポップアップは表示されません。画面にエラーはありません。助けてください! – prashant1988