Oracle Reports レポート作成ガイド 10gリリース2(10.1.2) B25068-01 |
|
この章では、PL/SQLデータ型REFカーソルを含むレポートについて説明します。この章の手順に従うと、図40-1に示すようなレポート出力を生成できます。
SELECT
リストが含まれたSELECT
文と関連付けられている必要があります。次のことを行うときに問合せの基準としてREFカーソルを使用します。
REF
カーソルの実装にストアド・プログラム・ユニットを使用する場合は、Oracleデータベースにそのプログラム・ユニットを同時に格納できるという利点があります。
REF
カーソルを使用することで、それらの問合せにアクセスできます。
SELECT
文を使用するレポートを作成する様子が示されています。また、データベース内のパッケージにSELECT
文を格納できることも示されています。データベースのパッケージはレポートからコールできるので、多数のレポートでパッケージを再使用できます。この例では、REFカーソルを使用して各部門における従業員とその職務上の地位に関する情報を表示する詳細なペーパー・レポートを作成する方法について説明します。データ・モデル・ビューを使用して複数問合せデータ・モデルを作成した後に、レポート・ウィザードを使用してレポート・レイアウトを作成します。データ・モデル・ビューで、詳細な調整を手動で行います。
このサンプル・レポートの作成過程では、次を行います。
REFカーソルを使用したサンプル・レポートを表示するには、サンプル・フォルダRefCursor
を開き、result¥ref_emp68.rdf
を開きます。このファイルの開き方の詳細は、「はじめに」の「サンプル・レポートへのアクセス」を参照してください。この章で使用されているサンプル・ファイルのリストと説明を表40-1に示します。
この章のサンプルを作成するには、提供されたサンプル・ファイルと、Oracleデータベースで提供されるHuman Resourcesサンプル・スキーマ(HR)へのアクセスが必要です。このサンプル・スキーマに対するアクセス権の有無が不明のときは、データベース管理者に問い合せてください。
REF
カーソル問合せを作成するには、まず、REF
カーソルを定義するパッケージ仕様部を作成します。その後で、REF
カーソルを使用する問合せを作成します。この項の手順では、REF
カーソルを定義するパッケージ仕様部を作成します。
concl_cv
と入力します。
PACKAGE concl_cv IS type conclass_rec is RECORD (EMPLOYEE_ID NUMBER(6), FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(25), EMAIL VARCHAR2(25), PHONE_NUMBER VARCHAR2(20), HIRE_DATE DATE, JOB_ID VARCHAR2(10), SALARY NUMBER(8,2), DEPARTMENT_ID NUMBER(4)); type conclass_refcur is REF CURSOR return conclass_rec; END;
このパッケージ仕様部では、次の2つのことを行います。
PACKAGE cont_cv IS type container_rec is RECORD (EMPLOYEE_ID NUMBER(6), START_DATE DATE, END_DATE DATE, JOB_ID VARCHAR2(10), DEPARTMENT_ID NUMBER(4)); type container_refcur is REF CURSOR return container_rec; END;
PACKAGE port_cv IS type portdesc_rec is RECORD (DEPARTMENT_ID NUMBER(4), DEPARTMENT_NAME VARCHAR2(30)); type portdesc_refcur is REF CURSOR return portdesc_rec; END;
ref61_<自分のイニシャル>.rdf
という名前を付けて、任意のディレクトリに保存します。REFカーソルを定義するパッケージ仕様部を作成したら、この項で説明する手順に従い問合せを定義できます。
REF
カーソル問合せのPL/SQLエディタを表示します。
function q_portdescRefCurDS return port_cv.portdesc_refcur is temp_portdesc port_ cv.portdesc_refcur; begin open temp_portdesc for select department_id, department_name from departments; return temp_portdesc; end;
function q_containerRefCurDS return cont_cv.container_refcur is temp_container cont_cv.container_refcur; begin open temp_container for select employee_id, start_date, end_date, job_id, department_id from job_history; return temp_container; end;
function q_conclassRefCurDS return concl_cv.conclass_refcur is temp_concl concl_cv.conclass_refcur; begin open temp_concl for select employee_id, first_name, last_name, email, phone_number, hire_date, job_id, salary, department_id from employees; return temp_concl; end;
データ・モデルは次のようになります。
ref_62_<自分のイニシャル>.rdf
という名前で保存します。この項では、データ・モデル内の一部のオブジェクトの名前を変更して、オブジェクトに意味のある名前を指定します。また、ブレーク・グループも作成します。
ref_63_<自分のイニシャル>.rdf
という名前で保存します。
現時点では、作成した問合せの間に関連性はありません。問合せ間にリレーションシップを構築するには、グループ間データ・リンクを作成する必要があります。この項の手順では、リンクを作成します。
REF
カーソル問合せ間にリンクを作成するには:
SELECT
文のWHERE
句にコードを追加して、主キーおよび外部キーとして使用する列を指定します。from job_history
の後に次のコードを追加します。
where :department_id = department_id;
セミコロン(;)
の前にWHERE
句があることを確認します。
:department_id
は、G_DEPARTMENT_ID
のDEPARTMENT_ID
を参照するバインド変数であることに注意してください。
SELECT
文にWHERE
句を追加します。カーソルをFROM EMPLOYEES
とセミコロン(;
)の間に挿入し、[Enter]または[Return]を押して新しい行を作成します。その後、次のコードを追加します。
where :employee_id = employee_id;
セミコロン(;)
の前にWHERE
句があることを確認します。
:employee_id
は、G_EMPLOYEE_ID
のEMPLOYEE_ID
列を参照するバインド変数であることに注意してください。
ref_64_<自分のイニシャル>.rdf
という名前で保存します。
現在、問合せが完成しリンクが作成されています。この項の手順では、データを集計する列を作成します。
これで、従業員数をカウントするサマリーが作成されました。レポートのレイアウト内ではサマリーを使用しませんが、後で他に対するソースとしてサマリーを使用します。
作成グループ | 名前 | ファンクション | ソース | リセット位置 |
---|---|---|---|---|
G_conlabel |
CS_conlabel_classcount |
合計 |
CS_classcount |
G_conlabel |
G_department_id |
CS_port_count |
合計 |
CS_conlabel_classcount |
G_DEPARTMENT_ID |
これらのサマリーについてはまだ学習していません。これらのサマリーの目的は、レポート・レイアウトを作成してライブ・データをプレビューするときに説明します。
データ・モデルは次のようになります。
ref_65_<自分のイニシャル>.rdf
という名前で保存します。
作業データ・モデルはすでにあるので、この項の手順ではレイアウトを作成します。
My Employees
と入力して、「グループ上」を選択します。
フィールド | ラベル | 幅 |
---|---|---|
DEPARTMENT_NAME |
|
|
EMPLOYEE_ID |
|
|
START_DATE |
|
|
END_DATE |
|
|
JOB_ID |
|
|
CS_port_count |
|
|
ref_66_<自分のイニシャル>.rdf
という名前で保存します。
現行のレポート構成では、REF
カーソル問合せによって使用されるSELECT
文はレポート内に置かれています。多くの場合、REF
カーソル型を定義するパッケージ内にSELECT
文を配置しておくと有利です。これにより、同じSELECT
文を使用するレポートそれぞれにSELECT
文を直接入力しなくても、パッケージを簡単に参照できるようになります。SELECT
文を変更(たとえば、句を修正または追加)する必要がある場合は、パッケージ内でSELECT
文を1回更新するのみです。各レポートで更新する必要はありません。
この項の手順では、REF
カーソル型を定義するパッケージにSELECT
文を移動します。
concl_cv
と入力します。
PACKAGE BODY cont_cv IS function query_container (p_department_id number) return container_refcur is tempcv_container cont_cv.container_ refcur; begin open tempcv_container for select employee_id, start_date, end_date, job_id, department_id from job_history where :department_id=department_id; return tempcv_container; end; END;
END;
文の上に次の行を入力します。
function query_container (p_department_id number) return container_refcur;
function Q_containerRefCurDS return cont_cv.container_refcur is temp_container cont_cv.container_refcur; begin temp_container:=cont_cv.query_container (:department_id); return temp_container; end;
終了すると、問合せのロジックはすべて、query_container
という名前のファンクション内に置かれます。これ以降query_container
を変更するときは、この問合せおよびこの問合せを参照するその他の問合せを変更します。
ref_67_<自分のイニシャル>.rdf
という名前で保存します。
演習(オプション):
レポート内の他の2つの問合せについても、前述の手順を繰り返します。
同一のREF
カーソル型およびSELECT
文を使用する多数のレポートが存在する場合は、ファイルに格納されているPL/SQLライブラリ内に作成したプログラム・ユニットを移動することにより、別のレポートでコードを容易に共有できます。この項の手順では、プログラム・ユニットをPL/SQLライブラリに移動します。
DEPT_CONTAINER
をライブラリとして入力します。
DEPT_CONTAINER
を保存します。
.pll
です。DEPT_CONTAINERを見つけて選択し、「開く」をクリックします。
ref_68_<自分のイニシャル>.rdf
という名前で保存します。
これで、すべての作業が完了しました。REF
カーソル問合せのサンプル・レポートが完成しました。この章で学習した内容は次のとおりです。
REF
カーソルを定義するパッケージ仕様部を作成する。
REF
カーソル問合せを作成する。
REF
カーソル問合せ間のデータ・リンクを作成する。
SELECT
文をパッケージに移動する。
このサンプルで使用するウィザード、ビューまたはプロパティの詳細は、Oracle Reportsオンライン・ヘルプを参照してください。このヘルプは、第3.1.1項「Oracle Reportsオンライン・ヘルプの使用」で説明しているとおり、Reports Builder、またはOracle Technology Network(OTN)から表示できます。
|
Copyright © 2003, 2005 Oracle. All Rights Reserved. |
|