1

D2k 6i フォームを使用していて、格納されたデータベース (oracle9i) プロシージャ ORA-00001:Unique constraint(.) 違反からフォームにエラーが発生しましたが、どのプロシージャから来たのかを追跡できません。誰でもこれに関して私を助けることができますか

4

3 に答える 3

1

多くの調査、ヘッドバンギング、歯ぎしりの後、このパターンに出くわしました。

CREATE OR REPLACE PACKAGE BODY my_schema.package_name
IS

  PROCEDURE foo
  IS
  BEGIN
    -- Call stored procedures/functions that throw unhandled exceptions
  EXCEPTION
    WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('ERROR! - '
        || DBMS_UTILITY.FORMAT_ERROR_STACK
        || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
  END foo;

END;

このDBMS_UTILITY.FORMAT_ERROR_STACK関数は、エラー コードとメッセージDBMS_UTILITY.FORMAT_ERROR_BACKTRACEを提供するようであり、少なくとも Oracle 10g の行番号とストアド プロシージャ名を含む、正直なスタック トレースを提供するようです。

これらの機能が Oracle 9i で利用できるかどうかはわかりません。Oracle 10gでもこの種のことについて多くの情報を見つけることができなかったので、9iはかなり古いので、少なくともこの回答を投稿すると思いました(つまり、10gです)。

于 2015-03-02T21:55:45.220 に答える
1

後世のために、OPが見つけた解決策は次のとおりです。

D2k フォームでは、関数 DBMS_ERROR_TEXT を使用してプロシージャ、パッケージ名、エラーが発生したステートメントの行番号を取得できる ON-ERROR トリガーがあります。

于 2010-05-11T09:50:44.833 に答える
0

質問とともに例外を投稿すると、直面している問題をよりよく理解できます。

通常、例外はエラー メッセージ内のパッケージと行番号を示します。そこから、USER_SOURCE テーブルにクエリを実行できます。

SELECT text 
FROM user_source 
WHERE type = 'PACKAGE BODY' 
  AND name = 'myProcName' 
  AND line = [the line number];

エラーがトリガーされたコンテキストについて詳しく知ることが役立つ場合があります。そのために、 `BETWEEN' 演算子を使用できます:

SELECT text 
FROM user_source 
WHERE type = 'PACKAGE BODY' 
  AND name = 'myProcName' 
  AND line BETWEEN [the line number - 5] AND [the line number +5];
于 2010-05-10T11:37:12.150 に答える