[解決済み] Oracle PL/SQL - カスタムSQLERRMでユーザー定義例外を発生させる
2023-06-14 22:32:50
質問
ユーザー定義の例外を作成し、SQLERRMを変更することは可能でしょうか?
例えば
DECLARE
ex_custom EXCEPTION;
BEGIN
RAISE ex_custom;
EXCEPTION
WHEN ex_custom THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
出力は "User-Defined Exception" です。 このメッセージを変更することは可能でしょうか?
編集:以下、もう少し詳しく説明します。
この1枚で、私がやろうとしていることがよりよくわかると思います。
DECLARE
l_table_status VARCHAR2(8);
l_index_status VARCHAR2(8);
l_table_name VARCHAR2(30) := 'TEST';
l_index_name VARCHAR2(30) := 'IDX_TEST';
ex_no_metadata EXCEPTION;
BEGIN
BEGIN
SELECT STATUS
INTO l_table_status
FROM USER_TABLES
WHERE TABLE_NAME = l_table_name;
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- raise exception here with message saying
-- "Table metadata does not exist."
RAISE ex_no_metadata;
END;
BEGIN
SELECT STATUS
INTO l_index_status
FROM USER_INDEXES
WHERE INDEX_NAME = l_index_name;
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- raise exception here with message saying
-- "Index metadata does not exist."
RAISE ex_no_metadata;
END;
EXCEPTION
WHEN ex_no_metadata THEN
DBMS_OUTPUT.PUT_LINE('Exception will be handled by handle_no_metadata_exception(SQLERRM) procedure here.');
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
実際には、これらのサブブロックは何十個もあります。 サブブロックごとに個別のユーザー定義例外を作成するのではなく、それらのサブブロックごとに単一のユーザー定義例外を発生させ、異なるメッセージを表示させる方法はないかと考えています。
.NETでは、このようなカスタム例外を持つようなものでしょう。
public class ColorException : Exception
{
public ColorException(string message)
: base(message)
{
}
}
そして、メソッドならこのようなものになります。
if (isRed)
{
throw new ColorException("Red is not allowed!");
}
if (isBlack)
{
throw new ColorException("Black is not allowed!");
}
if (isBlue)
{
throw new ColorException("Blue is not allowed!");
}
どのように解決するのですか?
はい。
RAISE_APPLICATION_ERROR
関数を使うだけです。 例外の名前も付けたい場合は
EXCEPTION_INIT
プラグマを使って、エラー番号と名前をつけた例外を関連付ける必要があります。 次のようなものです。
SQL> ed
Wrote file afiedt.buf
1 declare
2 ex_custom EXCEPTION;
3 PRAGMA EXCEPTION_INIT( ex_custom, -20001 );
4 begin
5 raise_application_error( -20001, 'This is a custom error' );
6 exception
7 when ex_custom
8 then
9 dbms_output.put_line( sqlerrm );
10* end;
SQL> /
ORA-20001: This is a custom error
PL/SQL procedure successfully completed.
関連
-
[解決済み] Pythonで悪い/不正な引数の組み合わせに対してどの例外を発生させるべきですか?
-
[解決済み] Oracleで主キーカラムを取得する方法は?
-
[解決済み] oracleのsidとデータベース名を確認する
-
[解決済み] OracleのIN句に1000以上の値を入れる方法【重複あり
-
[解決済み] Oracle Database 11g Express Editionを初期インストールした後、新しいデータベースを作成する方法は?
-
[解決済み] 制約名でテーブル名を取得する [重複]。
-
[解決済み] Oracle Database 11gのHibernate方言?
-
[解決済み] Oracleストアドプロシージャにおける "AS "と "IS "の違いは何ですか?
-
[解決済み] Oracleのnullとemptyの文字列 [重複].
-
[解決済み] Oracle 11gでSQL*Plusを使用してデータベースを表示する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Oracleで主キーカラムを取得する方法は?
-
[解決済み] OracleのIN句に1000以上の値を入れる方法【重複あり
-
[解決済み] Oracle Database 11g Express Editionを初期インストールした後、新しいデータベースを作成する方法は?
-
[解決済み] SQL Developerで変数の値を表示する
-
[解決済み] Oracle JDBC ojdbc6 JarをMaven依存にする。
-
[解決済み] Oracleストアドプロシージャにおける "AS "と "IS "の違いは何ですか?
-
[解決済み] Oracle SQL DeveloperのSQLワークシートウィンドウでテキストを印刷する
-
[解決済み] Oracleデータベースからランダムにレコードを取得する方法は?
-
[解決済み] Oracleの "not null "制約の名前がわからない場合、どのようにドロップすればよいですか?
-
[解決済み] SQL Developerでストアドプロシージャを実行しますか?