D2k 6i フォームを使用していて、格納されたデータベース (oracle9i) プロシージャ ORA-00001:Unique constraint(.) 違反からフォームにエラーが発生しましたが、どのプロシージャから来たのかを追跡できません。誰でもこれに関して私を助けることができますか
3 に答える
多くの調査、ヘッドバンギング、歯ぎしりの後、このパターンに出くわしました。
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です)。
後世のために、OPが見つけた解決策は次のとおりです。
D2k フォームでは、関数 DBMS_ERROR_TEXT を使用してプロシージャ、パッケージ名、エラーが発生したステートメントの行番号を取得できる ON-ERROR トリガーがあります。
質問とともに例外を投稿すると、直面している問題をよりよく理解できます。
通常、例外はエラー メッセージ内のパッケージと行番号を示します。そこから、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];