ヘッダーをスキップ
Oracle® OLAP DMLリファレンス
11gリリース2 (11.2)
B61346-03
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次
索引へ移動
索引

前
 
次
 

6 OLAP DMLプログラム

この章では、OLAP DMLプログラムの作成方法について説明します。内容は次のとおりです。

OLAP DMLから提供されるプログラム

OLAP DMLでは、Oracleデータ・ディクショナリで事前に定義されたOLAPのキューブとキューブ・ディメンションの処理に使用できるプログラムが多数用意されています。これらのプログラムは、「キューブ対応のOLAP DML文」に記載されています。

また、アナリティック・ワークスペースを直接処理する次のプログラムも用意されています。

  • ALLCOMPILE。現行のアナリティック・ワークスペースにあるコンパイル可能なすべてのオブジェクトを1つずつコンパイルします。

  • ALLSTAT。現行のアナリティック・ワークスペースにあるすべてのディメンションのステータスを、ディメンションのデフォルトのステータス・リストに設定します。

  • AWDESCRIBEは、現行のアナリティック・ワークスペースに関する情報を、現行の出力ファイルに送信します。サマリー・ページの後にレポートが生成され、名前、型および説明を示すアナリティック・ワークスペース・オブジェクトのアルファベット順のリストと、オブジェクト型別に各オブジェクトのDESCRIBEの2つの部分が示されます。

  • COPYDFN。現行のワークスペースまたはアタッチされているワークスペース内の事前定義されたオブジェクトから定義をコピーして、アナリティック・ワークスペース内に新しいオブジェクトを定義します。

  • FORECAST.REPORTは、FORECASTコマンドを使用して作成される予測の標準レポートを生成します。レポートには、予測の計算式および平均絶対誤差率を含む予測のパラメータに続いて、予測値が示されます。

  • FULLDSC。1つ以上のワークスペース・オブジェクトに関して、そのプロパティおよびトリガーを含む定義を表示するレポートを生成します。

  • ISDATEは、テキスト式をDATE値に変換可能かどうかを判定します。テキスト式が有効な日付を表す場合はYESを返し、それ以外はNOを返します。(ISDATEは、実際には変換を実行しません。変換を実行するには、CONVERTを使用する必要があります。)

  • LISTBYは、指定した1つ以上のディメンションまたはコンポジットによってディメンション化されているか、それらに関連付けられている、アナリティック・ワークスペース内のすべてのオブジェクトの名前のレポートを生成します。LISTBYは、アタッチした任意のワークスペースのディメンションまたはコンポジットで使用できます。

  • LISTNAMESは、アナリティック・ワークスペース内のオブジェクトの名前をリストするレポートを生成します。リストの対象を特定の型のオブジェクトに制限し、各オブジェクト型の名前をアルファベット順にリストできます。

  • MODEL.COMPRPTは、モデルの方程式がどのようにブロックにグループ化されたかを示すレポートを生成します。このレポートでは、ディメンション間の依存があるステップ・ブロックおよび連立ブロックについて、依存に関与するディメンションがリストされます。

  • MODEL.DEPRTは、各モデル方程式が依存する変数およびディメンション値がリストされるレポートを生成します。ディメンションに依存している場合、レポートにはディメンションの名前が示されます。

  • MODEL.XEQRPTは、モデルの実行に関するレポートを生成します。レポートには、解決に失敗したブロックが示され、連立ブロックの解決に使用されたモデル・オプションの値が表示されます。

  • PAGEは通常、レポート・プログラム内で使用するか、またはLISTNAMESを指定して使用し、PAGINGの設定がYESである場合に、出力に改ページを挿入します。PAGEに対するオプションの引数は、ページの残りの行数を条件とする改ページを指定します。

  • REGRESS.REPORT。REGRESSコマンドを使用して実行した回帰の標準レポートを生成します。

  • STATUS。1つ以上のディメンション、ディメンション・サロゲートまたは値セットのステータス、あるいはアナリティック・ワークスペース内にあるすべてのディメンションのステータスを現行の出力ファイルに送信します。

  • STDHDR。レポート出力の各ページの上部にOracle OLAP標準ヘッダーを生成します。

  • VALSPERPAGEは、1ページに収める幅を指定する変数の値の最大数を計算します。ページとは、ワークスペース内の格納単位です。

ISDATEプログラムおよびVALSPERPAGEプログラムは単純なファンクションと同様なため、第7章「OLAP DMLファンクション: AからK」および第8章「OLAP DMLファンクション: LからZ」(アルファベット順)でOLAP DMLファンクションとともに説明しています。OLAP DMLから提供されるその他のプログラムについては、第9章「OLAP DMLコマンド: AからG」および第10章「OLAP DMLコマンド: HからZ」(アルファベット順)でOLAP DMLコマンドとともに説明しています。

OLAP DMLプログラムの作成

OLAP DMLプログラムは、OLAP DMLで記述します。プログラムはアナリティック・ワークスペースのデータ上で実行され、一部のワークスペース管理または分析タスクを行うときに有効です。OLAP DMLプログラムを作成し、アナリティック・ワークスペースで繰り返し行う必要のあるタスクを実行でき、開発中のアプリケーションの一部として作成することもできます。

OLAP DMLプログラムを作成するには、次の手順を実行します。

  1. DEFINE PROGRAM文を発行して、プログラム・オブジェクトを定義します。定義したプログラムがファンクションで使用される場合は、datatypeおよびdimension引数を含めます。

  2. 実行する処理を指定するための内容をプログラムに追加します(「プログラム内容の指定」を参照)。

  3. プログラムをコンパイルします(「プログラムのコンパイル」を参照)。

  4. プログラムをテストおよびデバッグします(「プログラムのテストとデバッグ」を参照)。

  5. プログラムを実行します(「プログラムの実行」を参照)。

プログラム内容の指定

プログラムの内容は、次のOLAP DML文で構成されます。

  1. プログラム内容の始まりを示すPROGRAM文。(OLAP Worksheetの編集ウィンドウで仕様をコーディングする場合は不要です。)

  2. (オプション)ローカル変数を定義するVARIABLE文。

  3. (オプション)引数を宣言するARGUMENT文。(詳細は、「引数の受渡し」を参照してください。)

  4. 実行する処理を指定する付加的なOLAP DML文。プログラムでは、ほとんどすべてのOLAP DML文を使用できます。また、フロー制御文など、プログラムでのみ使用されるOLAP DML文もあります。

    プログラムに行を追加する際は、次の書式設定ガイドラインを使用してください。

    • コードの各行は、最大4,000バイトです。

    • 1つの文を次の行に続けるには、行の終わりにハイフン(-)を入力して改行します。ハイフンは、継続文字といいます。

    • テキスト・リテラルの途中では継続文字は使用できません。

    • 1行に複数の文を記述するには、文をセミコロン(;)で区切ります。

    • リテラル・テキストは、一重引用符(')で囲みます。リテラル・テキスト内に一重引用符を含めるには、引用符の前にバックスラッシュ(\)を付けます。エスケープ・シーケンスの指定は、「エスケープ・シーケンス」を参照してください。

    • コメントの前には二重引用符(")を付けます。行の先頭または末尾に、二重引用符を付けた文に関するコメントを付けることができます。

  5. プログラムの内容の終わりを示す最後のEND文。(OLAP Worksheetの編集ウィンドウで仕様をコーディングする場合は不要です。)

ユーザー定義ファンクションの作成

一般に記述されるプログラムの1つのタイプとして、ユーザー定義ファンクションがあり、OLAP DMLファンクションを使用するのと同じ方法でOLAP DML文で使用できます。ユーザー定義ファンクションとは、単純に値を返すOLAP DMLプログラムのことです。ユーザー定義ファンクションの例は、例9-44「ユーザー定義ファンクションへの引数の受渡し」を参照してください。

ユーザー定義ファンクションを作成する場合、datatypeおよびdimension引数を含むDEFINE PROGRAM文を使用します。プログラム内には、値を返すRETURN文があります。プログラムにおける戻り式は、その定義で指定されたデータ型と一致する必要があります。戻り値のデータ型が、その定義で指定されたデータ型と一致しない場合、その値は定義で指定されたデータ型に変換されます。

ユーザー定義ファンクションでは、引数を使用できます。ユーザー定義ファンクションは、単一の値のみを返します。しかし、ディメンションをループ処理するコンテキストでユーザー定義ファンクションに引数を指定する場合(たとえばREPORT文)、ファンクションはその引数と同じディメンションを持つ結果を返します。

プログラム内でARGUMENT文を使用して引数を宣言し、プログラムの名前の後にカッコで囲んだ引数を指定する必要があります。


関連項目:

プログラムにおける引数の使用の詳細は、「引数の受渡し」を参照してください。

引数の受渡し

ARGUMENT文を使用して、単純な引数と複雑な引数(式など)の両方を宣言できます。また、ARGUMENT文を使用すると、任意のデータ型、ディメンションまたは値セットの引数を宣言できるため、プログラムから別のプログラムに引数を渡したり、独自のユーザー定義ファンクションを作成することが容易になります。ARGUMENT文はすべて、プログラムの実行可能な最初の行の前に置く必要があります。プログラムを実行する際、それらの宣言された引数は、引数としてプログラムに指定した値で初期化されます。その後、プログラムはローカル変数を使用するのと同様にそれらの引数を使用できます。

複数の引数の使用

プログラムは、必要な数の引数を宣言できます。引数を指定してプログラムを実行する場合、その引数の順序はプログラムで宣言された引数の順序と一致します。プログラムを実行する際、カンマや他の記号ではなく空白で引数を区切る必要があります。記号は、引数の一部として扱われます。複数の引数を渡す例は、例9-45「複数の引数の受渡し」を参照してください。

特定のデータ型への値の変換を行わない引数の処理

OLAP DMLプログラムが、値を特定のデータ型に変換せずに引数を処理するように指定することもできます。この場合、プログラムに引数および一時変数を定義するARGUMENT文とVARIABLE文に、WORKSHEETのデータ型を指定できます。WKSDATAを使用すると、引数または変数の実際のデータ型を調べることができます。

アンパサンド置換によるテキスト引数の受渡し

ほとんどの場合は、単純なテキスト引数をプログラムに渡します。しかし、より汎用的なプログラムを作成したり、アナリティック・ワークスペース・オブジェクトの全データや式の結果など、より複雑なテキスト引数を渡したりする場合があります。このような場合、置換式を使用して引数を渡すことができます。このように引数を渡す方法を、アンパサンド置換といいます。

次のような引数では、常にアンパサンドを使用して適切な置換を行う必要があります。

  • ワークスペース・オブジェクトの名前(unitsproductなど)

  • 文のキーワード(REPORT文におけるCOMMANOCOMMA、SORTコマンドにおけるADなど)

アンパサンド置換を使用して、ワークスペース・オブジェクトの値でなく名前をプログラムに渡すと、プログラムではオブジェクト自体にアクセスできます。プログラムでオブジェクトを複数の操作において操作する必要がある場合、この機能は便利です。


注意:

アンパサンドを含むプログラム行のコンパイルおよび保存はできません。そのかわりに、その行は実行時に評価されますが、プログラムの実行速度が低下する場合があります。このため、パフォーマンスを最適化できるように、他の方法を使用できる場合はアンパサンド置換を使用しないでください。

アンパサンド置換を使用して複数のディメンション値を渡す例は、例10-18「LIMITでのアンパサンド置換の使用」を参照してください。アンパサンド置換を使用して式のテキストを渡す例は、例9-47「式のテキストの受渡し」を参照してください。アンパサンド置換を使用してオブジェクト名およびキーワードを渡す例は、例9-48「ワークスペース・オブジェクト名とキーワードの受渡し」を参照してください。


関連項目:

アンパサンド置換の詳細は、「置換式」を参照してください。

プログラムのフロー制御

ほとんどのプログラミング言語と同様、OLAP DMLにはプログラム内におけるフロー制御の決定に使用可能な文が複数あります。ただし、多くのOLAP DML文が本来持っているループ特性のため、OLAP DMLプログラムでは明示的なループはできるだけコーディングしないでください。

表6-1「フロー制御を決定する文」に、OLAP DMLのフロー制御文を示します。OLAP DML文のループ特性の詳細は、「すべてのデータ・オブジェクトの値に対するOLAP DML文の適用」を参照してください。

OLAP DMLには、一般のプログラミング言語の場合と同様のフロー制御文が含まれています。表6-1「フロー制御を決定する文」に、これらの文を示します。

表6-1 フロー制御を決定する文

説明

BREAK


SWITCH、FORまたはWHILE文から、SWITCH、FORまたはWHILEに関連付けられたDOENDの直後の文にプログラム制御を移動する。

CONTINUE


FORまたはWHILEループ処理の終わり(DO/DOEND文の直前)にプログラム制御を移動し、ループの繰返しを可能にする。CONTINUEは、プログラム内でのみ、またFORまたはWHILEと組み合せた場合にのみ使用可能。

DO ... DOEND


1つ以上の文のグループをまとめる。DOおよびDOENDは通常、IF文によって指定される条件下で実行される文のグループ、FORまたはWHILEによって繰り返されるループ内の文のグループ、またはSWITCH文のCASEラベルをまとめるために使用される。

FOR


そのステータスが1つ以上の文の繰返しを制御する、1つ以上のディメンションを指定する。

GOTO


実行する次のプログラム文を示すことにより、プログラム内の文の実行順序を変更する。

IF...THEN...ELSEコマンド


指定した条件に一致する場合に、プログラムの1つ以上の文を実行する。オプションで、条件に一致しない場合に、かわりになる文または文のグループを実行することも可能。

OKFORLIMIT


明示的なFORループでループ処理されるディメンションを制限するかどうかを決定するオプション。

RETURN


最後の行に到達する前に、プログラムの実行を終了する。オプションで、プログラムが返す値を指定可能。

SIGNAL


エラー・メッセージを生成し、プログラムの正常な実行を停止する。プログラムにアクティブなトラップ・ラベルがある場合、プログラムの実行はそのラベルに分岐する。トラップ・ラベルがない場合、プログラムの実行は終了し、そのプログラムが他のプログラムによりコールされていた場合は、コール側プログラムに実行制御が戻る。

SWITCHコマンド


プログラムに複数のパスを持つブランチを設定する。プログラムの実行中に使用される特定のパスは、SWITCHにより指定される制御式の値によって決まる。

TEMPSTAT


FORループ内、またはREPORT文によって生成されるループ内で、ループ処理するディメンションを制限する。ステータスはTEMPSTATに続く文の実行後にリストアされる。DO ... DOEND句がTEMPSTATの後に続く場合、ステータスは、一致するDOENDか、BREAK文またはGOTO文が検出された時点でリストアされる。

TRAP


プログラムでエラーが発生した場合、またはユーザーがプログラムを中断した場合に、プログラムの実行がラベルに分岐するようにする。実行がトラップ・ラベルに分岐した場合、そのトラップ・ラベルは非アクティブ化される。

WHILE


ブール式の値がTRUEの間、文を繰り返し実行する。


環境設定の保存

次の2種類の環境があります。

  • セッション環境。セッション環境は、プログラムが実行される前の実際のディメンション・ステータス、オプション値および出力先で構成されています。

  • プログラム環境。プログラム環境は、プログラムで使用するディメンション・ステータス、オプション値および出力先で構成されています。

プログラム環境の変更

プログラム内でタスクを実行するには、多くの場合、出力先または一部のディメンション値やオプション値を変更する必要があります。たとえば、常に最新の6か月の売上データを示す月間売上レポートを実行するとします。このとき、小数桁のないデータを表示して、売上高がゼロの場合はテキスト「No Sales」を表示し、レポートをファイルに送信します。このようなプログラム環境を設定するには、プログラムで次の文を使用します。

LIMIT month TO LAST 6
DECIMALS = 0
ZSPELL = 'No Sales'
OUTFILE monsales.txt

セッション環境の混乱を避けるため、プログラムの初期化セクションで、プログラムに設定されるディメンションの値およびオプションの値を保存する必要があります。プログラム実行後に保存した環境をリストアできるため、他のプログラムの実行では、変更された値があるかどうかを確認する必要はありません。さらに、出力をファイルに送信した場合、終了セクションでは出力先をデフォルトの出力ファイルに戻す必要があります。

環境を保存およびリストアする方法

次の方法により、プログラムまたはセッションの環境を保存できます。

  • 現行のプログラムで変更される現行のステータス、あるいはディメンション、値セット、オプションまたは単一セル変数の値を保存する場合は、PUSHLEVEL文およびPUSH文を使用します。POPLEVEL文およびPOP文を使用すると、現行のステータス値をリストアできます。

  • 現行のセッションで使用する現行のステータス、あるいはディメンション、値セット、オプション、単一セル変数または単一セルのリレーションの値を保存、アクセスまたは更新する場合、名前付きコンテキストを使用します。コンテキストを定義するには、CONTEXTコマンドを使用します。

コンテキストは、セッション中に使用するオブジェクト値を保存するための最も高度な方法です。コンテキストを使用すると、保存したオブジェクト値にアクセス、更新およびコミットできます。一方、PUSHとPOPは、値の保存およびリストアのみを実行できます。プログラムの実行中にのみ適用される変更を加える場合は、通常、プログラム内でPUSH文およびPOP文を使用します。

ディメンションのステータスまたはオプションの値の保存

PUSH文は、ディメンションの現行のステータス、オプションの値または単一セル変数の値を保存します。たとえば、プログラムの継続期間中にDECIMALSオプションの値に別の値を設定できるように、オプションの現行の値を保存するには、初期化セクションで次の文を使用します。

PUSH DECIMALS

オプションの値を保存またはその後でリストアするために、元の値を知っている必要はありません。保存した値は、POP文でリストアできます。

POP DECIMALS

プログラムが正常に終了した場合だけではなく、エラーの発生により異常終了した場合にも、POP文が実行されるようにする必要があります。そのために、POP文をプログラムの正常終了セクションと異常終了セクションに配置します。

複数の値の同時保存

次の例で示すように、1つ以上のディメンションのステータスおよびいくつかのオプションや変数の値を1つのPUSH文で保存し、それらの値を1つのPOP文でリストアできます。

PUSH month DECIMALS ZSPELL
       ...
POP month DECIMALS ZSPELL

レベル・マーカーの使用

複数のディメンションやオプションの値を保存する場合、セッション環境の保存およびリストアにはPUSHLEVEL文とPOPLEVEL文が有効です。

最初にPUSHLEVEL文を使用して、レベル・マーカーを設定します。レベル・マーカーを設定すると、PUSH文を使用することで、ディメンションのステータス、およびオプションまたは単一セル変数の値が保存されます。

PUSHLEVEL文とPOPLEVEL文の間に複数のPUSH文を配置する場合、それらのPUSH文で指定されたオブジェクトはすべて、1つのPOPLEVEL文でリストアされます。

PUSHLEVELおよびPOPLEVELを使用すると、オブジェクトのリストの入力が一度で済むので、プログラムを記述するときの入力を少なくすることができます。さらに、リストからオブジェクトが欠落したり、オブジェクトの名前のスペルを間違えるリスクを減らすこともできます。

レベル・マーカーの作成の例は、例10-85「レベル・マーカーの作成」を参照してください。例10-86「PUSHLEVELおよびPOPLEVELコマンドのネスト」では、PUSHLEVEL文およびPOPLEVEL文のネストについて解説します。

CONTEXTを使用した複数の値の同時保存

PUSHLEVELおよびPOPLEVELを使用するかわりに、CONTEXTコマンドを使用できます。コンテキストを作成した後、ディメンションの現行のステータスの他、オプション、単一セル変数、値セットおよび単一セル・リレーションの値をそのコンテキストに保存できます。その後、オブジェクト値の一部またはすべてをコンテキストからリストアできます。CONTEXTファンクションは、コンテキスト内のオブジェクトに関する情報を返します。

エラーの処理

プログラムのいずれかの場所でエラーが発生した場合、Oracle OLAPは次のアクションを実行します。

  1. エラーの名前をERRORNAMEオプションに格納し、エラー・メッセージのテキストをERRORTEXTオプションに格納します。


    注意:

    ERRNAMESオプションがデフォルト値のYESに設定されている場合、ERRORTEXTオプションにはエラーの名前(ERRORNAMEオプションの値)およびエラー・メッセージのテキストが含まれます。

  2. ECHOPROMPTがYESの場合、Oracle OLAPは入力行、エラー・メッセージおよび出力行を現行の出力ファイルにエコー出力します。OUTFILE文またはDBGOUTFILE文を使用すると、エラー・メッセージをファイルに記録できます。ファイルに出力を送信する例は、例10-69「出力のファイルへの送信」を参照してください。

  3. エラー・トラップがオフの場合は、プログラムの実行は停止されます。エラー・トラップがオンの場合、エラーはトラップされます。

エラー・トラップ

プログラムを正常に実行するには、エラーが発生することを予想して、エラーを処理するためのシステムを設定します。TRAP文を使用すると、プログラムでエラー・トラップ・メカニズムをオンにできます。エラー・トラップがオンになっていれば、エラーが通知された場合でもプログラムの実行は停止されません。そのかわりに、エラー・トラップにより次の処理が実行されます。

  1. エラー・トラップ・メカニズムをオフにし、エラー処理の過程で別のエラーが発生した場合の無限ループを回避します。

  2. TRAP文で指定したラベルに分岐します。

  3. ラベルの後に続く文を実行します。

コール側プログラムへのエラーの受渡し

コール側のプログラムにエラーを渡すには、次に示す2つの方法のいずれかを使用できます。使用する方法は、エラー・メッセージを生成するタイミングによって異なります。最初の方法を使用した場合、エラー・メッセージはただちに生成され、その後エラー状態がプログラムの連鎖を経由して渡されます。2番目の方法を使用した場合は、エラーがプログラムの連鎖を経由して渡されてから、エラー・メッセージが生成されます。詳細は、「エラーの受渡し: 方法1」および「エラーの受渡し: 方法2」を参照してください。

どちらの方法の場合も、プログラムの連鎖内の各プログラムにおいて適切なエラー処理が実行され、ある時点でOracle OLAPから現行の出力ファイルへエラー・メッセージが送られます。

エラーの受渡し: 方法1

この方法を使用した場合、エラー・メッセージはただちに生成され、その後エラー状態がプログラムの連鎖を経由して渡されます。

TRAP文は、(デフォルトの)PRINTオプションと組み合せて使用します。エラーが発生すると、エラー・メッセージが生成され、実行はトラップ・ラベルに分岐します。トラップ・ラベル後は、内容を問わず必要なクリーンアップを実行し、次の文を実行します。

SIGNAL PRGERR

この文の使用によって、エラー条件が作成され、現行のプログラムの実行元であったプログラムにこのエラー条件が渡されます。ただし、PRGERRからはエラー・メッセージは生成されません。PRGERRでは、ERRORNAMEオプションが空白値に設定されます。

コール側のプログラムにトラップ・ラベルがある場合、プログラムの実行はそのラベルに分岐します。ネストしたプログラムの連鎖内の各プログラムがTRAPおよびSIGNALをこのように使用する場合は、プログラムの連鎖全体を経由してエラー状態を渡すことができます。

エラーの受渡し: 方法2

この方法を使用した場合は、エラーがプログラムの連鎖を経由して渡されてから、エラー・メッセージが生成されます。

TRAP文は、NOPRINTオプションと組み合せて使用します。エラーが発生すると、実行はトラップ・ラベルに分岐しますが、エラー・メッセージは表示されません。トラップ・ラベル後は、内容を問わず必要なクリーンアップを実行し、次の文を実行します。

SIGNAL ERRORNAME ERRORTEXT

オプションERRORNAMEおよびERRORTEXTには、元のエラーの名前とメッセージが記録されているので、このSIGNAL文を実行すると、元のエラーが再現されます。その後、このエラーは、現行のプログラムの実行元であったプログラムに渡されます。

コール側のプログラムにもトラップ・ラベルがある場合、プログラムの実行はそのラベルに分岐します。ネストしたプログラムの連鎖内の各プログラムがTRAP...NOPRINTおよびSIGNAL ERRORNAME ERRORTEXTをこのように使用する場合は、プログラムの連鎖全体を経由してエラー状態を渡すことができます。Oracle OLAPでは、プログラムの連鎖の最後にエラー・メッセージを生成します。

エラー処理を実行するレベルに到達したときにアプリケーションを続行する場合は、SIGNAL文を省略します。独自のメッセージを表示するには、SHOW文を使用します。

エラー・メッセージの抑止

特定のエラーに対し、本来であれば生成されるエラー・メッセージが生成されないようにするには、次のようにTRAP文にNOPRINTキーワードを使用します。

TRAP ON error NOPRINT

TRAPコマンドでNOPRINTキーワードを使用すると、制御はerrorラベルに分岐し、エラーが発生した場合、エラー・メッセージは生成されません。その後、errorラベルの後に続く文が実行されます。

エラー・メッセージを抑止する場合、異常終了セクションで独自のメッセージを生成できます。SHOW文を使用すると、指定したテキストが生成されますが、エラーは通知されません。

TRAP ON error NOPRINT
        ...
error:
        ...
SHOW 'The report will not be produced.'

メッセージを生成した後、プログラムでは次の文が実行されます。

独自のエラー・メッセージの作成

文または文のシーケンスがその要件を満たしていない場合に発生するエラーはすべて、自動的に通知されます。作成するプログラムには、アプリケーション固有の要件を追加できます。要件を満たさない場合、SIGNAL文を実行してエラーを通知できます。

エラーには任意の名前を付けることができます。SIGNAL文を実行すると、OLAP DMLのエラー名が自動的に格納されるのと同様に、指定したエラー名がERRORNAMEオプションに格納されます。SIGNAL文で独自のエラー・メッセージを指定すると、OLAP DMLのエラー・メッセージが生成されるのと同じように、独自のメッセージが生成されます。TRAP文を使用してエラーをトラップする場合、エラー・メッセージが生成された後に、SIGNAL文がTRAPラベルに分岐します。

エラーの通知の例は、例10-123「エラーの通知」を参照してください。

エラー・ラベルに分岐せずに警告メッセージを生成する場合、SHOW文を使用できます(例10-121「SHOWによるエラー・メッセージの作成」を参照)。

ネストしたプログラムでのエラーの処理

ネストしたプログラムでエラーを処理する場合、各プログラムのエラー処理セクションで環境をリストアする必要があります。さらに、そのプログラムに特有の特別なエラー状態も処理できます。たとえば、プログラムが固有のエラーを通知する場合、そのエラーをテストする文を含めることができます。

ネストしたプログラムで発生したその他のエラーは、プログラムの連鎖を経由して渡され、各プログラムで処理されます。ネストしたプログラムの連鎖を経由してエラーを渡すには、エラー・メッセージを生成するタイミングに応じて、次に示す2つの方法のいずれかを使用できます。

どちらの方法でもSIGNAL文を使用します。

セッション環境の保存中のエラーの処理

セッション環境の保存中に発生するエラーを適切に処理するには、TRAP文の前にPUSHLEVEL文を、TRAP文の後にPUSH文を配置します。

PUSHLEVEL 'firstlevel'
TRAP ON error
PUSH 
 ...

プログラムの異常終了セクションに、エラー・ラベル(後ろにコロンを入力)、およびセッション環境をリストアしてエラーを処理する文を配置します。異常終了セクションは、次のようになります。

error:
POPLEVEL 'firstlevel'
OUTFILE EOF

これらの文により、保存されたディメンション・ステータスおよびオプション値がリストアされ、出力をデフォルトの出力ファイルに再転送します。

プログラムのコンパイル

COMPILE文を使用して、プログラムを明示的にコンパイルできます。プログラムを明示的にコンパイルしない場合、プログラムを最初に実行するときにコンパイルされます。

プログラムのコンパイル時、プログラム文は、効率的に処理されるコードに変換され、そのプログラムの元のテキストよりもはるかに高速に実行されます。プログラム内にエラーが検出された場合、コンパイルは完了せず、プログラムはコンパイルされていないと判断されます。

プログラムがコンパイルされると、現行のセッションでプログラムを実行するたびにコンパイルされたコードが使用されます。プログラムのコンパイル後にアナリティック・ワークスペースを更新およびコミットすると、コンパイルされたコードはアナリティック・ワークスペースに保存され、今後のセッションでプログラムを実行するために使用されます。このため、プログラムのコンパイル後に更新およびコミットを確実に行ってください。プログラムのコンパイル後に更新およびコミットを発行することは、そのプログラムが、多くのユーザーが実行しているアプリケーションの一部である場合は特に重要です。コンパイルされたプログラムがアナリティック・ワークスペースに保存されていない場合、プログラムは各ユーザー・セッションで個別に再コンパイルされます。

例9-69「プログラムのコンパイル」では、COMPILEを使用したプログラムのコンパイルについて解説します。

プログラムがコンパイルされたかどうかの確認

OBJファンクションでISCOMPILEDオプションを使用すると、アナリティック・ワークスペース内の特定のプログラムが、最後に変更されてからコンパイルされたかどうかを判断できます。このファンクションは、ブール値を返します。

SHOW OBJ(ISCOMPILED 'myprogram')

コンパイルを回避するプログラミング方法

アンパサンド置換を含むプログラム行は、コンパイルされません。すべての構文エラーは、プログラムが実行されるまで検出されません。他の行が正常にコンパイルされたプログラムは、コンパイルされたプログラムと判断されます。

プログラムがオブジェクトを定義し、プログラム内でそのオブジェクトを使用する場合、プログラムはコンパイルされません。そのオブジェクトがまだアナリティック・ワークスペースに存在しないため、COMPILEはオブジェクトへの参照をスペル間違いとして処理します。

プログラムのテストとデバッグ

作成したプログラムが正しくコンパイルされた場合でも、そのプログラムを実行してテストする必要があります。プログラムの実行は、アンパサンド置換を使用する文のエラー、ロジックのエラー、およびネストしたプログラムのエラーを検出するのに役立ちます。

プログラムを実行してテストするには、プログラムが処理する典型的なデータのフルセットをテスト・データとして使用します。エラー処理メカニズムを含むプログラムのすべての機能をテストしたことを確認するには、異なるデータおよび応答を使用し、プログラムを複数回実行します。次のようなテスト・データを使用します。

  • 予想される範囲内のデータ

  • 予想される範囲外のデータ

  • プログラムの各セクションを実行するデータ

診断メッセージの生成

プログラムを実行するたびに、プログラムがその文を正しい順序で実行し、出力が正しいことを確認する必要があります。作成したプログラムの実行を分析する手段として、プログラムにSHOW文またはTRACE文を記述し、診断メッセージまたはステータス・メッセージを生成できます。テストの完了後に、これらの文を削除します。

プログラムやネストしたプログラムでエラーを検出した場合、またはエラーが発生する可能性がある場合は、この後に説明するデバッグ方法を使用して、エラーが発生する場所を特定できます。

不適切なコード行の識別

BADLINEオプションをYESに設定すると、不適切なコード行が検出された場合、エラー・メッセージとともに追加情報が生成されます。エラーが発生すると、エラー・メッセージ、プログラムの名前、およびエラーを発生させたプログラム行が、現行の出力ファイルに送信されます。特定されたプログラムを編集してエラーを修正し、元のプログラムを実行できます。BADLINEの使用例は、例5-4「BADLINEオプションの使用」を参照してください。

デバッグ・ファイルへの出力の送信

作成したプログラムにロジックのエラーがあっても、エラー・メッセージが表示されることなくそのプログラムが実行されることがありますが、実行される文または生成される結果は適切ではありません。たとえば、IF文に不適切なブール式を記述する(EQのかわりにNEを使用するなど)とします。プログラムは指定した文を実行しますが、不適切な条件で実行されます。

プログラム・ロジックのエラーを検出するには、多くの場合、文が実行される順序を調べる必要があります。その方法の1つとして、次に示すようにDML文を発行し、デバッグ・ファイルを作成してそのファイルを調べることにより、作成したプログラムの問題を診断します。

  1. デバッグ・ファイルを作成するには、DBGOUTFILE文を使用します。

  2. 各プログラム行を実行する際、デバッグ・ファイルに送信するよう指定するには、PRGTRACEオプションをYESに設定します。

  3. (オプション)デバッグ・ファイルに、プログラム入力およびエラー・メッセージの両方を併記しながらプログラム行を出力するには、ECHOPROMPTオプションをYESに設定します。


関連項目:

次のデバッグ・ファイルの使用例を参照してください。

プログラムの実行

CALL文を使用すると、値を返さないプログラムを実行できます。引数はカッコで囲み、値により渡されます。たとえば、2つのINTEGER値の和を計算する簡単なプログラムを作成し、additという名前を付けます。アプリケーションのメイン・プログラムでCALL文を使用し、そのプログラムを実行できます。

OLAP DML文を発行するのと同じ方法でプログラムを実行することもできます。ユーザー定義ファンクションは、組込みファンクションを使用するときと同じ方法で実行します。式でプログラム名を使用し、プログラム引数がある場合はカッコで囲みます。値を返さないプログラム(ユーザー定義コマンド)では、OLAP DMLコマンドと同じようにプログラム名を使用します。ユーザー定義プログラムをファンクションとして実行すると、そのプログラムの戻り値はNAとなります。

次のアクションがOracle OLAPで発生した場合に自動的に実行されるプログラムを作成することもできます。

  • AW ATTACHを実行する。AW CREATE、AW DELETE、AW DETACH、DEFINE、MAINTAIN、PROPERTY、UPDATEまたはSET文(「トリガー・プログラム」を参照)。

  • NA値が検出される($NATRIGGERを参照)。

OLAP DMLプログラムの代表的なタイプ

この項では、次の種類のプログラムについて概説します。

起動プログラム

起動プログラムは、ユーザー自身が作成するプログラムで、AW ATTACH文の実行時、Oracle OLAPによってその名前がチェックされます。起動プログラムは、定義および作成しないかぎりアナリティック・ワークスペースには存在しません。起動プログラムでは、任意のOLAP DML文を実行でき、独自のプログラムも実行可能です。たとえば、起動プログラムにより、オプションをアプリケーションに適した値に設定できます。

最初にアナリティック・ワークスペースをアタッチするときに、Oracle OLAPでは、次の順序でOracle OLAP起動プログラムが検索され、実行されます(存在する場合)。

  1. 権限プログラム。権限プログラムの実行は、AW ATTACH文に指定したアタッチ・モード、およびアタッチしているアナリティック・ワークスペースに関連する権限プログラムが存在するかどうかによって決まります。詳細は、「権限プログラム」を参照してください。

  2. ONATTACHプログラム。ONATTACHプログラムの実行は、AW ATTACH文のONATTACH句およびNOONATTACH句のコーディング方法、およびアタッチしているアナリティック・ワークスペースにONATTACHという名前のプログラムが存在するかどうかによって決まります。詳細は、「ONATTACHプログラム」を参照してください。

  3. AUTOGOプログラム。AUTOGOプログラムの実行は、AW ATTACH文のAUTOGO句およびNOAUTOGO句のコーディング方法、およびアタッチしているアナリティック・ワークスペースにAUTOGOという名前のプログラムが存在するかどうかによって決まります。詳細は、「AUTOGOプログラム」を参照してください。

  4. トリガー・プログラム。トリガー・プログラムの実行は、すでにアタッチしているアナリティック・ワークスペースにTRIGGER_AWという名前のプログラムが存在するかどうかによって決まります。アタッチしたアナリティック・ワークスペースの1つにTRIGGER_AWプログラムが存在する場合は、別のアナリティック・ワークスペースを作成、アタッチ、デタッチまたは削除すると、このプログラムが実行されます。詳細は、「トリガー・プログラム」およびTRIGGER_AWを参照してください。


注意:

セッション内では、次の点に注意します。
  • アタッチ済ワークスペースを再アタッチする場合、Oracle OLAPでは、権限プログラムおよびONATTACHプログラムの検索と実行を行いません

  • すでにデタッチされているワークスペースを再アタッチする場合、そのワークスペースをNOCACHEキーワードを指定したAW DETACH文を使用してデタッチしている場合を除き、Oracle OLAPでは、権限プログラム、ONATTACHプログラムまたはAUTOGOプログラムの実行を行いません。


権限プログラム

権限プログラムは、管理者が作成するプログラムで、ワークスペースのデータにアクセスするアクセス権をユーザーに付与します。ユーザーが最初にアナリティック・ワークスペースをアタッチするときに、Oracle OLAPでは、アタッチ・モードに適した権限プログラムが存在するかどうかを確認します。


注意:

アタッチ済ワークスペースを再アタッチする場合、Oracle OLAPでは、権限プログラムの検索と実行を行いません

アタッチ・モードごとの権限プログラムには、表6-2「様々なアタッチ・モードに対応する権限プログラムの名前」に示されている特定の名前が必要です。

表6-2 様々なアタッチ・モードに対応する権限プログラムの名前

アタッチ・モード プログラムの名前

読取り専用

PERMIT_READ


マルチライタ、読取り/書込み

PERMIT_WRITE



該当する権限プログラムが存在する場合は、Oracle OLAPによってそのプログラムが実行されます。アナリティック・ワークスペースをアタッチするときにユーザーがパスワードを指定すると、このパスワードは権限プログラムの処理に引数として渡されます。


注意:

ディメンション・サロゲートには、そのディメンションのアクセス権があります。そのディメンションのディメンション・サロゲートの値にアクセスするためにアクセス権を付与または拒否するには、そのディメンションに対してPERMITを使用します。

権限プログラムにより、プログラムが常駐するアナリティック・ワークスペースに対して2つのレベルのアクセス権が制御可能です。

  • アナリティック・ワークスペース・レベルでのアクセス: 権限プログラムの戻り値に応じて、アナリティック・ワークスペース全体へのアクセスがユーザーに許可されるかどうかが決定されます。この戻り値を使用すると、ユーザーがワークスペースをアタッチする権限を持っているかどうかをOracle OLAPに示すことができます。

  • オブジェクト・レベルでのアクセス: 読取り専用、または読取り/書込みアタッチの権限プログラム内でPERMIT文を指定すると、個々のワークスペース・オブジェクトへのアクセス権を許可または制限できます。PERMITプログラムは、PERMIT文の発行対象となるオブジェクトと同じワークスペースに存在する必要があります。


    注意:

    特定の権限プログラム内で参照されているすべてのオブジェクトは、同じアナリティック・ワークスペースに存在している必要があります。

権限プログラムを作成するには、認識可能な名前でユーザー定義ファンクション(「ユーザー定義ファンクションの作成」を参照)を定義し、プログラムの内容を定義します(「プログラム内容の指定」を参照)。

ONATTACHプログラム

ONATTACHプログラムには、名前を自由に付けることも、または明示的にONATTACHという名前を付けることもできます。


注意:

アナリティック・ワークスペースがOLAP APIを使用してOLAPキューブとして作成されている場合、OLAP APIによってONATTACHという名前のプログラムも作成されている場合があります。このように自動的に作成されたONATTACHプログラムは変更できません。また、ONATTACHの実行を無効にすることはお薦めしません。

したがって、アナリティック・ワークスペースにこのタイプのONATTACHプログラムが存在する場合は、別のタイプの起動プログラムを作成して、アナリティック・ワークスペースがアタッチされているときに実行する動作を指定してください。


ONATTACHプログラムの実行を指定する方法は、その名前に応じて次のように異なります。

  • アナリティック・ワークスペースにONATTACHという名前のプログラムが存在するときは、AW ATTACH文にNOOTTACHキーワードを指定した場合または別のプログラム名を指定するONATTACH句を記述した場合を除き、ワークスペースをアタッチするたびに、そのプログラムが自動的に実行されます。

  • ONATTACHという名前の付いていないONATTACHプログラムを実行するには、AW ATTACH文のONATTACH句内にプログラムの名前を指定します。


注意:

キャッシュされたアタッチ済ワークスペースを再アタッチする場合、Oracle OLAPでは、ONATTACHプログラムの検索と実行を行いません。ワークスペースを再アタッチしたときにOracle OLAPでONATTACHプログラムの検索と実行が行われるように、強制的にアナリティック・ワークスペースを完全にデタッチするには、アナリティック・ワークスペースをデタッチするDETACH文でNOCACHEキーワードを指定します。

AUTOGOプログラム

AUTOGOプログラムには、名前を自由に付けることも、または明示的にAUTOGOという名前を付けることもできます。

AUTOGOプログラムの実行を指定する方法は、その名前に応じて次のように異なります。

  • アナリティック・ワークスペースにAUTOGOという名前のプログラムが存在するときは、AW ATTACH文にNOAUTOGOキーワードを指定した場合または別のプログラム名を指定するAUTOGO句を記述した場合を除き、ワークスペースをアタッチするたびに、そのプログラムが自動的に実行されます。

  • AUTOGOという名前の付いていないAUTOGOプログラムを実行するには、AW ATTACH文のAUTOGO句内にプログラムの名前を指定します。

データのインポートおよびエクスポート・プログラム

OLAP DMLでは、リレーショナル表、フラット・ファイルおよびスプレッドシートとアナリティック・ワークスペース・オブジェクトとの間で、データのインポートやエクスポートが可能です。

リレーショナル表に対するデータのインポートおよびエクスポート

OLAP DMLのSQL文を使用して、SQL文をOLAP DMLプログラムに埋め込むことができます。OLAP DMLのSQL文を使用すると、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをインポートしたり、アナリティック・ワークスペース・オブジェクトからリレーショナル表にデータをエクスポートしたりできます。

リレーショナル表からワークスペース・オブジェクトへのデータのインポート

OLAP DMLプログラム内でOLAP DML SQL文を使用すると、暗黙カーソルまたは明示カーソルのどちらかを使用してアナリティック・ワークスペース・オブジェクトにリレーショナル・データをコピーできます。

  • 暗黙カーソルを使用して、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするには、SQL SELECT文を使用します。このOLAP DML文は、OLAP Worksheetで対話的に使用できる他、OLAP DMLプログラム内で使用することもできます。

  • 明示カーソルを使用して、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするには、次に示す文を順序のとおりに使用します。これらの文は、OLAP DMLプログラム内でのみ使用できます。OLAP Worksheetで対話的に使用することはできません。

    1. SQL DECLARE CURSORを使用して、SQLカーソルをSELECT文またはプロシージャに関連付けて定義します。

    2. SQL OPENを使用して、SQLカーソルをアクティブ化します。

    3. SQL FETCHおよびSQL IMPORTを使用して、カーソルで指定されたデータを取得および処理します。

    4. SQL CLOSEを使用して、SQLカーソルをクローズします。

    5. SQL CLEANUPを使用して、SQLカーソルの宣言を取り消し、SQLカーソルのメモリー・リソースを解放します。

ワークスペース・オブジェクトに表データをコピーするプログラムの例は、SQL FETCHおよびSQL IMPORTを参照してください。

OLAP DMLオブジェクトからリレーショナル表へのデータのエクスポート

プログラム内でOLAP DML SQL文をINSERTキーワードとともに使用すると、アナリティック・ワークスペース・オブジェクトからリレーショナル表にデータをコピーできます。通常、これを行うには、OLAP DMLプログラムで次の文を発行します。

  1. SQL PREPARE文。INSERT文およびUPDATE文をプリコンパイルするのに使用します。

  2. SQL EXECUTE文。手順1でプリコンパイルした文を実行するのに使用します。

フラット・ファイルに対するデータのインポートおよびエクスポート

Oracle OLAPには、フラット・ファイルに対してデータの読取りや書込みを行うための文が複数用意されています。これらの文は、通常、特別なプログラムの中で組み合せて使用されます。

スプレッドシートに対するデータのインポートおよびエクスポート

OLAP DMLプログラムでは、IMPORT文を使用して、スプレッドシートからアナリティック・ワークスペース・オブジェクトにデータをインポートできます。また、EXPORT文を使用して、アナリティック・ワークスペース・オブジェクトからスプレッドシートにデータをエクスポートできます。

トリガー・プログラム

DEFINE、MAINTAIN、PROPERTY、SET(=)、UPDATEおよびAWコマンドは、Oracle OLAPではOLAP DMLプログラムの実行をトリガーするイベントとして認識されます。

  • DEFINE、MAINTAIN、PROPERTY、UPDATE、SETの各コマンドによりトリガーされるプログラムをオブジェクト・トリガー・プログラムといいます(この項およびTRIGGERコマンドの項を参照)。

  • TRIGGER_AWという名前のプログラムは、アナリティック・ワークスペース内で定義され、別のアナリティック・ワークスペースが作成、アタッチ、デタッチまたは削除された場合にトリガーされます。詳細は、「TRIGGER_AW」の説明を参照してください。

トリガー・プログラムは、アプリケーション固有のメタデータをメンテナンスするために頻繁に作成されます。トリガー・プログラムには、それらをトリガーする文に応じていくつかの特長があります。トリガー・プログラムには、トリガーする文が実行される前に実行されるものと、後に実行されるものがあります。Oracle OLAPがプログラムに引数を渡すかどうかは、プログラムをトリガーする文によって決まります。Oracle OLAPは、ほとんどのトリガー・プログラムが実行されるまでディメンション・ステータスを変更しませんが、一部のMAINTAIN文がプログラムの実行をトリガーする前にディメンション・ステータスを変更します。ほとんどの場合、トリガー・プログラムには選択した任意の名前を付けることができますが、一部のイベントには特定の名前のプログラムが必要です。「オブジェクト・トリガー・プログラムの特長」では、これらの特性について解説します。


関連項目:

次の説明を参照してください。

オブジェクト・トリガー・プログラムの作成

オブジェクトがアナリティック・ワークスペースで定義されると、次の手順に従ってオブジェクトのトリガー・プログラムを作成できます。

  1. プログラムを定義します(DEFINE PROGRAMを参照)。

  2. プログラムに付ける名前と、プログラムをユーザー定義プログラムにするかどうかを決定します。(表6-3「オブジェクト・トリガー・プログラムの特長」を参照。)プログラムをユーザー定義プログラムにする場合は、トリガー・プログラムをユーザー定義ファンクションとして定義するかどうかを決定します。

  3. プログラムを実際にコーディングします(「プログラム内容の指定」を参照)。

  4. トリガー・プログラムをコーディングする際は、次の点に注意してください。

    • 表6-3「オブジェクト・トリガー・プログラムの特長」に基づいて、Oracle OLAPが値をプログラムに渡すかどうかを判断します。渡す場合は、ARGUMENT文を使用してそれらの引数をプログラム内で宣言し、VARIABLE文を使用して値のプログラム変数を定義します。(引数の詳細は、表6-4「トリガー・プログラムに渡される引数」を参照してください。)

    • Assignイベントによってトリガーされるプログラムは、イベントが定義されたオブジェクトにOracle OLAPが値を割り当てるたびに実行されます。このため、Assignイベントでトリガーされるプログラムは通常、代入文がオブジェクトをループ処理して値を代入するときに繰り返し実行されます。TRIGGERASSIGNを使用して、プログラムの実行をトリガーした代入文により指定される値とは異なる値を割り当てることができます。

    • 場合によっては、Oracle OLAPは、Maintainイベントがプログラムの実行をトリガーする際にメンテナンスされるディメンションのステータスを変更します。詳細は、表6-5「Maintainイベントによりトリガーされたプログラムがディメンション・ステータスに与える影響」を参照してください。

    • プログラム内でCALLTYPEファンクションを使用して、プログラムがトリガーとして実行されたことを識別します。

  5. トリガー・プログラムがTRIGGER_AFTER_UPDATE、TRIGGER_BEFORE_UPDATEまたはTRIGGER_DEFINEプログラムではない場合、TRIGGERコマンドを使用してプログラムを適切なオブジェクトおよびイベントに関連付けます。

  6. 再帰的トリガーはサポートされていません。USETRIGGERSオプションをNOに設定してから、トリガー・プログラム自体をトリガーするトリガー・プログラムの内部で同じDML文を発行する必要があります。たとえば、MAINTAIN ADD文によってトリガーされる、TRIGGER_MAINTAIN_ADDというプログラムを作成したとします。TRIGGER_MAINTAIN_ADDプログラムの内部で、USETRIGGERSオプションをNOに設定してからMAINTAIN文を発行する必要があります。

オブジェクト・トリガー・プログラムの特長

オブジェクト・トリガー・プログラムには、それらをトリガーする文に応じていくつかの特長があります。トリガー・プログラムには、トリガーする文が実行される前に実行されるものと、後に実行されるものがあります。Oracle OLAPがプログラムに引数を渡すかどうかは、プログラムをトリガーする文によって決まります。Oracle OLAPは、ほとんどのトリガー・プログラムが実行されるまでディメンション・ステータスを変更しませんが、一部のMAINTAIN文がプログラムの実行をトリガーする前にディメンション・ステータスを変更します。ほとんどの場合、トリガー・プログラムには選択した任意の名前を付けることができますが、一部のイベントには特定の名前のプログラムが必要です。

表6-3「オブジェクト・トリガー・プログラムの特長」には、プログラムをトリガーするOLAP DML文、プログラムの必須名(存在する場合)、Oracle OLAPがプログラムによる戻り値を使用するかどうか、Oracle OLAPがプログラムに引数を渡すかどうかが記載されています。

トリガー・プログラムの設計時には、次の点に注意してください。

  • DML文のに実行されるトリガー・プログラム: トリガー側のOLAP DML文が実行される前に実行されるトリガー・プログラムの場合は、BOOLEAN値を返すユーザー定義ファンクションとしてトリガー・プログラムを定義できます。このプログラムによる戻り値は、トリガー・プログラムの実行をトリガーした文をOracle OLAPが実行するかどうかを決定します。プログラムの戻り値がFALSEの場合、Oracle OLAPはトリガー側の文を実行しませんが、戻り値がTRUEまたはNAの場合は、トリガー側の文が実行されます。

  • トリガー・プログラムに渡される引数: Oracle OLAPは、一部のトリガー・プログラムに引数を渡します。これらのプログラムは、表6-3「オブジェクト・トリガー・プログラムの特長」に記載されています。また、引数の説明は、表6-4「トリガー・プログラムに渡される引数」に記載されています。これらの引数をプログラム内で宣言するには、ARGUMENT文を使用します。値に対してプログラム変数を定義するには、VARIABLEを使用します。WKSDATAファンクションを使用して、WORKSHEETデータ型で引数のデータ型を取得します。

  • Assignトリガー・プログラム: Oracle OLAPは、イベントが定義されたオブジェクトに値を代入するたびに、Assignイベントによってトリガーされるプログラムを実行します。このため、Assignイベントでトリガーされるプログラムは通常、代入文がオブジェクトをループ処理して値を代入するときに繰り返し実行されます。これが実行されるたびに、代入される値は、引数1としてAssignトリガー・プログラムに渡されます。(詳細は、表6-4「トリガー・プログラムに渡される引数」を、例については例10-163「変数のASSIGNトリガー」を参照。)Assignトリガー・プログラムの中でTRIGGER ASSIGN文を使用して、Assignトリガー・プログラムの実行をトリガーした代入文によって指定される値とは別の値を代入できます。

    計算式に値を代入できるのは、その計算式にAssignトリガーが定義されている場合のみです。Assignイベントを持つ計算式に値を代入すると、Oracle OLAPは、代入された値のイベントに対してトリガー・プログラムを実行し、代入された値をトリガー・プログラムに渡します。Assignトリガーは、計算式自体の定義は変更しません。計算式に関するAssignトリガーの例は、例10-165「計算式に関するASSIGNトリガー」を参照してください。

  • Maintainトリガー・プログラムとディメンション・ステータス: Maintainイベントがプログラムの実行をトリガーすると、Oracle OLAPは、メンテナンスの対象になっているディメンションのステータスを変更する場合があります。詳細は、表6-5「Maintainイベントによりトリガーされたプログラムがディメンション・ステータスに与える影響」を参照してください。

  • Maintainトリガーとディメンション・サロゲート: ディメンション・サロゲートのMaintainトリガーは、その他のオブジェクトのMaintainトリガーとは異なります。ディメンション・サロゲートに対してMAINTAIN文を正常に発行できるのは、ディメンション・サロゲートにMaintainトリガーが存在する場合のみです。Maintainトリガーのないサロゲート・ディメンションに対してMAINTAIN文を発行すると、エラーが返されます。さらに、Maintain AddトリガーやMaintain Mergeトリガーの場合も、引数がプログラムに渡されるかどうかは、次のようにトリガーが定義されるオブジェクトによって決まります。

    • Maintainトリガーを持つディメンション・サロゲートの場合、Oracle OLAPは、値が追加またはマージされるたびにトリガー・プログラムを1回実行し、値をプログラムに渡します。

    • Maintainトリガーを持つその他のオブジェクトの場合、Oracle OLAPが実行するトリガー・プログラムはMAINTAIN文の実行後1回のみであり、プログラムに値は渡されません。

表6-3 オブジェクト・トリガー・プログラムの特長

トリガー側の文(イベント) プログラム名 戻り値 渡される引数

=(代入)文(SET)

必須名なし

なし

あり

DEFINE

TRIGGER_DEFINE


なし

なし

MAINTAIN ADD

必須名なし

なし

なし

MAINTAIN DELETE(ALL以外)

必須名なし

あり

なし

MAINTAIN DELETE ALL

必須名なし

あり

なし

MAINTAIN MERGE

必須名なし

なし

なし

MAINTAIN MOVE

必須名なし

あり

あり

MAINTAIN RENAME

必須名なし

あり

あり

PROPERTY

必須名なし

あり

あり

UPDATE (Update AW)

TRIGGER_AFTER_UPDATE


なし

なし

UPDATE (Update AW)

TRIGGER_BEFORE_UPDATE


あり

なし

UPDATE (Update Multi)

必須名なし

なし

なし


表6-4 トリガー・プログラムに渡される引数

イベント 引数1 引数2

Property

PROPERTY文によってプロパティがオブジェクトに割り当てられている場合は、プロパティの名前。PROPERTY文によって1つ以上のプロパティが削除される場合は、リテラルDELETE。(TEXTデータ型)

引数1の値がDELETEの場合は、プロパティの名前またはリテラルALL。これ以外の場合は、プロパティの名前。(WORKSHEETデータ型)

Assignment

代入する値。値の代入先となるオブジェクトのデータ型がわかったら、そのデータ型を引数に指定する。実際のデータ型がわからない場合は、引数のデータ型としてWORKSHEETを指定する。

なし。Oracle OLAPからプログラムに渡される引数は1つのみ。

Maintain Add


(ディメンション・サロゲート専用)追加された値。(WORKSHEETデータ型)

Maintain Rename

名前変更の対象となるディメンション値。(TEXTデータ型)

ディメンション・メンバーの新しい名前。(WORKSHEETデータ型)

Maintain Merge


(ディメンション・サロゲート専用)マージされた値。(WORKSHEETデータ型)

Maintain Move

移動するディメンション値の位置。(TEXTデータ型)

リテラルBEFOREまたはAFTER。(WORKSHEETデータ型)


表6-5 Maintainイベントによりトリガーされたプログラムがディメンション・ステータスに与える影響

イベントとサブイベント プログラム実行前のディメンション・ステータス

Maintain Add

ステータスは追加直後のディメンション値に設定される。

Maintain Delete

ステータスは削除直前のディメンション値に設定される。

Maintain Delete All

現行のステータスは変更されない。

Maintain Merge

ステータスはマージ直後のディメンション値に設定される。

Maintain Move

ステータスは移動直前のディメンション値に設定される。

Maintain Rename

現行のステータスは変更されない。


集計、割当て、およびモデリングのプログラム

OLAP DMLを使用してデータの集計、割当て、またはモデリングを実行するには、まず計算仕様の定義(「計算オブジェクトの作成」を参照)を行って、実行する計算の種類を指定します。後でデータベースのメンテナンス手順として集計、割当て、またはモデリングされた値を変数に移入するには、計算オブジェクトを実行するプログラムを作成します。これらのプログラムで使用するOLAP DML文の詳細は、「モデルの実行」「集計の実行」および「データの割当て」を参照してください。

予測プログラム

OLAP DMLには、Geneva Forecastingエンジンを使用したデータの予測に関連する文がいくつか用意されています。Geneva Forecastingエンジンは、Roadmap Technologies社の統計予測エンジンであり、需要計画で広く利用されています。

Geneva Forecastingエンジンを使用して予測を行うには、次の手順を実行します。

  1. 将来の時間値を時間ディメンションに追加します。

  2. 予測の結果を保持するための変数を作成します。

  3. 予測プログラムを作成します。プログラムには、次の文を記載されているとおりの順に記述します。

    1. FCOPENファンクション: 予測コンテキストを作成します。

    2. FCSETコマンド: 予測の特性を指定します。

    3. FCEXECコマンド: 予測を実行し、Oracle OLAP変数に予測データを移入します。

    4. FCQUERYファンクション: 予測の特性または予測の試行に関する情報を取得します。

    5. FCCLOSEコマンド: 予測コンテキストを閉じます。

これらの文を使用したデータ予測の実行例は、例9-119「予測プログラム」を参照してください。

ワークスペース・オブジェクトをエクスポートおよびインポートするプログラム

ワークスペース全体、複数のワークスペース・オブジェクト、単一のワークスペース・オブジェクト、またはアナリティック・ワークスペース・オブジェクトの一部分を、特別な形式のEIFファイルにエクスポートできます。その後、同じスキーマまたは別のスキーマ内にある別のワークスペースに情報をインポートできます。

エクスポートおよびインポートを行う目的の1つは、データを新しい場所に移動することです。もう1つの目的は、多数のオブジェクトまたはディメンション値の追加と削除によって発生した不要な領域をアナリティック・ワークスペースから削除することです。これを行うには、EXPORT文を発行してすべてのデータをEIFファイルに出力し、別のワークスペースを異なる名前で作成した後、IMPORT文を使用してEIFファイルを新しいワークスペースにインポートします。同じデータベースにインポートした場合、古いワークスペースを削除して、古いワークスペースで使用していたのと同じワークスペース別名で新しいワークスペースを参照できます。

次の文は、現行のアナリティック・ワークスペースからmydirというディレクトリ・オブジェクトにあるreorg.eifというEIFファイルに、すべてのデータおよび定義をコピーします。

EXPORT ALL TO EIF FILE 'mydir/reorg.eif'