オランダ在住のRoel Hartmanさん(ODTUGのボード・メンバーです)が彼のブログに以下の記事を書いていました。
Stop using validations for checking constraints!
記事の内容は、データベースの表に設定している制約に違反したときに発生するエラー・メッセージを画面に表示する際には、Oracle APEXが提供している(アプリケーション定義に含まれる)エラー処理ファンクションを活用しましょう、というものです。関連するドキュメントの記載としては、パッケージAPEX_ERRORの説明になります。
彼の記事の中で面白いなと思ったのは、出力するメッセージの取得にAPEX_LANG.MESSAGEを使用しているところです。このファンクションは元々はアプリケーションの翻訳に使用するものです。翻訳で使用する方法については、以前にこのような記事を書きました。もちろん、アプリケーションの翻訳をしなくても、キーとなる値を指定して、メッセージとする文字列を取得することができます。
実際に実装して効果を確認してみましょう。
確認用アプリケーションの作成
Oracle APEXのワークスペースにサインインし、SQLワークショップからユーティリティのクイックSQLを開きます。
以下のクイックSQLのモデルを使って、表AET_EMPとAET_EMP_ATTRIBUTESを作成します。表AET_EMP_ATTRIBUTESには、各種の制約を付加しておきます。これらの制約に違反したときに表示されるエラー・メッセージを、Oracle Databaseが返すメッセージから、利用者向けに分かりやすいメッセージに変更することが本記事のゴールです。
# prefix: aet
# prefixPKwithTname: true
# semantics: default
# language: ja
emp /insert 5
emp_id /pk /values 1,2,3,4,5
emp_name
emp_attributes
emp_attr_id /pk
emp_id /fk emp
national_id num /unique
attribute_name vc20 /nn
attribute_value vc80
gender vc1 /check M,F
age num /between 0 and 120
制約としては、主キー、外部キー、一意、NULL不可、チェック、範囲指定を設定しています。必要なディレクティブはモデルに含んでいるので、クイックSQLでSQLの生成、SQLスクリプトの保存、レビューおよび実行、即時実行とボタンをクリックしていけば、今回使用する表が作成されます。
続いてアプリケーション・ビルダーより、空のアプリケーションを作成します。アプリケーションの作成より新規アプリケーションを選び、アプリケーションの名前だけを指定して、アプリケーションの作成を実行します。ここではアプリケーションの名前を、エラー処理の確認としています。
空のアプリケーションが作成されたら、確認に使用するフォームと対話グリッドのページを作成します。最初にフォームのページを作成します。アプリケーション・ビルダーの画面より、ページの作成を開始します。
コンポーネントのフォームを選択します。
フォーム付きレポートを選択します。
レポート・タイプを対話モード・レポート、フォーム・ページ・モードをモーダル・ダイアログとします。それ以外は任意の値を設定できます。次に進みます。
ナビゲーションのプリファレンスとして新規ナビゲーション・メニュー・エントリの作成を選択します。次に進みます。
エラー処理ファンクションの設定
テキスト・メッセージの登録
エラーの原因となった制約名にTODOというテキストが登録されていることが確認できます。
このTODOを適切なメッセージに置き換えます。今回は制約AET_EMP_ATTRIBU_EMP_ATTR_ID_PKにたいして、従業員属性のIDとなる値は一意である必要があります。とテキストを設定します。変更の適用を行います。
再度、同じ操作を行うと、エラー・メッセージが変更されていることが確認できます。
フォームを使って同じデータを作成しようとしても、表示されるエラー・メッセージは同じです。
以上でエラー処理ファンクションを使った、エラー・メッセージの変更方法の紹介は完了です。
他にも設定した制約があります。演習を行うつもりで、メッセージを設定してみてください。
発生したエラーの確認方法
ひとつ追加で説明すると、Oracle APEXのアプリケーションで発生したエラーはすべて記録されます。
右上の管理者アイコンよりメニューを開き、アクティビティのモニターを呼び出します。