2023年10月6日金曜日

データ・ソースに更新可能ビューを設定する

サンプル・データセットのEMP/DEPTの含まれる表EMPに、英語のデータがロードされていると、検索結果は以下のようになります。

select * from emp;


JOBを日本語で表示するために、以下のようなSELECT文を記述します。列JOB_Jに日本語のジョブ名が表示されます。
select
    empno
    ,ename
    ,job
    -- ジョブの日本語名となる列JOB_Jを追加する。
    ,case job
        when 'PRESIDENT' then '社長'
        when 'MANAGER' then 'マネージャー'
        when 'ANALYST' then 'アナリスト'
        when 'CLERK' then '店員'
        when 'SALESMAN' then '営業員'
        else 'その他'
    end job_j
    ,mgr
    ,hiredate
    ,sal
    ,comm
    ,deptno
from emp

このSELECT文をOracle APEXの対話モード・レポートのソースとしてそのまま使用するかわりに、更新可能ビューを作成してみます。

作成する更新可能ビューはEMP_JVとします。以下のDDLで作成します。

この更新可能ビューEMP_JVを使って、対話モード・レポートとフォームのページを作成します。

最初に更新不可の列を確認します。ビューALL_UPDATABLE_COLUMNSを検索します。

select * from all_updatable_columns where table_name = 'EMP_JV'

JOB_JUPDATABLEINSERTABLEDELETABLEすべてNOであることが確認できます。つまり、Oracle APEXのフォーム対話グリッドを使って、このビューEMP_JVを操作するときは列JOB_J問合せのみに設定する必要があります。


アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。名前更新可能ビューのサンプルとします。


アプリケーション作成ウィザードでは、データ・ソースがビューの場合、フォームを含む対話モード・レポートは作成できません。そのため、この操作はアプリケーションの作成後、ページ作成ウィザードにて実施します。


アプリケーションの作成をクリックし、アプリケーションを作成します。

ページの作成をクリックし、ビューEMP_JVをソースとしたフォームを含む対話モード・レポートのページを作成します。


対話モード・レポートを選択します。作業手順は通常の表と同じです。


対話モード・レポートのページの名前従業員一覧とします。フォーム・ページを含めるオンに変更します。フォーム・ページ名従業員編集とします。

データ・ソース表/ビューの名前としてEMP_JVを指定します。

へ進みます。


主キー列1としてEMPNO (Number)を選択します。

ページの作成を実行します。


対話モード・レポートとフォームのページが作成されます。

ページを実行し、対話モード・レポートの表示を確認します。


JOB_Jとして日本語のジョブ名が表示されています。


このまま編集フォームを開き、データを更新しようとするとORA-01733: ここでは仮想列は使用できません。というエラーが発生します。列JOB_Jの値を変更していなくても、エラーは発生します。Oracle APEXのフォームおよび対話グリッドの行の更新は、編集の有無に関わらず全ての列が更新の対象になります(値を変更していない場合は、同じ値で更新します)。


JOB_Jに対応するページ・アイテムP3_JOB_Jソース問合せのみオンに変更すると、この値はデータ・ベースへの書き込み対象から外れます。そのため、ビューEMP_JV(実体は表EMP)の値を操作することが可能になります。


任意の従業員の編集フォームを開き、項目Job Jを社長に変更、Salも適当な値に変更し、変更の適用を実行します。


データベースへ更新処理が行われます。エラーは発生しません。

対話モード・レポートに戻り、更新された値を確認します。列JOB_Jの値に変更はありません。列JOB_Jの値は問合せのみで、更新対象から外されているためです。列Salは指定した値に更新されています。


フォームの項目Job Jは変更してもデータベースには保存されないため、通常はページ・アイテムタイプ表示のみ、または、非表示にします。


これでジョブ名の表示については日本語になりました。しかし、入力は英語である必要があります。


ジョブ名の入力についても、日本語で行えるように設定します。そのために、共有コンポーネントLOVList Of Valueの略です)を作成します。

共有コンポーネントLOVを開きます。


作成をクリックし、LOVの作成を開始します。


LOVの作成最初からを選択します。

へ進みます。


LOV名前ジョブ一覧とします。タイプStaticを選択します。Dynamicを選択すると、SQLのSELECT文をLOVのソースとすることができます。

へ進みます。


LOV表示値戻り値を設定します。表示値は画面に表示される値、戻り値はデーターベースに保存される値になります。1対1で対応している必要があり、表示値および戻り値はすべて異なる値になっている必要があります。

社長 - PRESIDENTマネージャー - MANAGERアナリスト - ANALYST店員 - CLERK営業員 - SALESMAN表示値戻り値に設定します。これはビューEMP_JVの列JOB_JのCASE文と一致している必要があります。

LOVの作成を実行します。


LOVジョブ一覧が作成されました。


作成したLOVを活用します。

ページ・デザイナでフォームのページを開きます。

ジョブを入力するページ・アイテムP3_JOBを選択します。

識別タイプ選択リストに変更します。LOVタイプとして共有コンポーネントLOVとして先ほど作成したジョブ一覧を設定します。追加値の表示オフNULL値の表示- 未設定 -とします。NULL戻り値空白にします。


以上の設定で、ジョブの入力が日本語の選択リストになります。データベースへ保存される値は英語のままです。


対話モード・レポートの列JOBについても、作成したLOVを活用できます。

ページ・デザイナにて対話モード・レポートのページを開きます。

JOBを選択します。タイププレーン・テキスト(LOVに基づく)に変更し、LOVとしてジョブ一覧を選択します。


対話モード・レポートの表示を確認すると、列Jobも日本語で表示されていることが確認できます。


データ・ソースに更新可能ビューを使用する方法の紹介は以上になります。

今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/sample-updatable-view.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。