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で作成します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
create or replace view emp_jv | |
as | |
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 |
この更新可能ビューEMP_JVを使って、対話モード・レポートとフォームのページを作成します。
最初に更新不可の列を確認します。ビューALL_UPDATABLE_COLUMNSを検索します。
select * from all_updatable_columns where table_name = 'EMP_JV'
列JOB_JはUPDATABLE、INSERTABLE、DELETABLEすべてNOであることが確認できます。つまり、Oracle APEXのフォームや対話グリッドを使って、このビューEMP_JVを操作するときは列JOB_Jは問合せのみに設定する必要があります。
アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。名前は更新可能ビューのサンプルとします。
アプリケーション作成ウィザードでは、データ・ソースがビューの場合、フォームを含む対話モード・レポートは作成できません。そのため、この操作はアプリケーションの作成後、ページ作成ウィザードにて実施します。
アプリケーションの作成をクリックし、アプリケーションを作成します。
ページの作成をクリックし、ビューEMP_JVをソースとしたフォームを含む対話モード・レポートのページを作成します。
対話モード・レポートのページの名前は従業員一覧とします。フォーム・ページを含めるをオンに変更します。フォーム・ページ名は従業員編集とします。
データ・ソースの表/ビューの名前としてEMP_JVを指定します。
次へ進みます。
ページの作成を実行します。
対話モード・レポートとフォームのページが作成されます。
ページを実行し、対話モード・レポートの表示を確認します。
列JOB_Jとして日本語のジョブ名が表示されています。
列JOB_Jに対応するページ・アイテムP3_JOB_Jのソースの問合せのみをオンに変更すると、この値はデータ・ベースへの書き込み対象から外れます。そのため、ビューEMP_JV(実体は表EMP)の値を操作することが可能になります。
データベースへ更新処理が行われます。エラーは発生しません。
対話モード・レポートに戻り、更新された値を確認します。列JOB_Jの値に変更はありません。列JOB_Jの値は問合せのみで、更新対象から外されているためです。列Salは指定した値に更新されています。
これでジョブ名の表示については日本語になりました。しかし、入力は英語である必要があります。
ジョブ名の入力についても、日本語で行えるように設定します。そのために、共有コンポーネントにLOV(List 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に基づく)に変更し、LOVとしてジョブ一覧を選択します。
今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/sample-updatable-view.zip
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完