プログラムの内容は、次のOLAP DML文で構成されます。
プログラム内容の始まりを示すPROGRAM文(OLAP Worksheetの「編集」ウィンドウで仕様をコーディングする場合は不要)。
(オプション)ローカル変数を定義するVARIABLE文。
(オプション)引数を宣言するARGUMENT文(詳細は、「引数の受渡し」を参照)。
実行する処理を指定する付加的なOLAP DML文。プログラムでは、ほとんどすべてのOLAP DML文を使用できます。また、フロー制御文など、プログラムでのみ使用されるOLAP DML文もあります。
プログラムに行を追加する際は、次の書式設定ガイドラインを使用してください。
コードの各行は、最大4000バイトです。
1つの文を次の行に続けるには、行の終わりにハイフン(-
)を入力して改行します。ハイフンは、継続文字といいます。
テキスト・リテラルの途中では継続文字は使用できません。
1行に複数の文を記述するには、文をセミコロン(;
)で区切ります。
リテラル・テキストは、一重引用符('
)で囲みます。リテラル・テキスト内に一重引用符を含めるには、引用符の前にバックスラッシュ(\
)を付けます。エスケープ・シーケンスの指定は、「エスケープ・シーケンス」を参照してください。
コメントの前には二重引用符("
)を付けます。行の先頭または末尾に、二重引用符を付けた文に関するコメントを付けることができます。
プログラムの内容の終わりを示すEND文(OLAP Worksheetの「編集」ウィンドウで仕様をコーディングする場合は不要)。
一般に記述されるプログラムの1つのタイプとして、ユーザー定義ファンクションがあります。OLAP DMLファンクションを使用するのと同じ方法でOLAP DML文で使用できます。ユーザー定義ファンクションとは、値を返すOLAP DMLプログラムのことです。ユーザー定義ファンクションの例は、例9-43「ユーザー定義ファンクションへの引数の受渡し」を参照してください。
ユーザー定義ファンクションを作成する場合、datatypeおよびdimension引数を含むDEFINE PROGRAM文を使用します。プログラム内には、値を返すRETURN文があります。プログラムにおける戻り式は、その定義で指定されたデータ型と一致する必要があります。戻り値のデータ型が、その定義で指定されたデータ型と一致しない場合、その値は定義で指定されたデータ型に変換されます。
ユーザー定義ファンクションでは、引数を使用できます。ユーザー定義ファンクションは、単一の値のみを返します。しかし、ディメンションをループ処理するコンテキストでユーザー定義ファンクションに引数を指定する場合(たとえばREPORT文)、ファンクションはその引数と同じディメンションを持つ結果を返します。
プログラム内でARGUMENT文を使用して引数を宣言し、プログラムの名前の後にカッコで囲んだ引数を指定する必要があります。
ARGUMENT文を使用して、単純な引数と複雑な引数(式など)の両方を宣言できます。また、ARGUMENT文を使用すると、任意のデータ型、ディメンションまたは値セットの引数を宣言できるため、プログラムから別のプログラムに引数を渡したり、独自のユーザー定義ファンクションを作成したりすることが容易になります。ARGUMENT文はすべて、プログラムの実行可能な最初の行の前に置く必要があります。プログラムを実行する際、それらの宣言された引数は、引数としてプログラムに指定した値で初期化されます。その後、プログラムはローカル変数を使用するのと同様にそれらの引数を使用できます。
プログラムは、必要な数の引数を宣言できます。引数を指定してプログラムを実行する場合、その引数の順序はプログラムで宣言された引数の順序と一致します。プログラムを実行する際、カンマや他の記号ではなく空白で引数を区切る必要があります。記号は、引数の一部として扱われます。複数の引数を渡す例は、例9-44「複数の引数の受渡し」を参照してください。
OLAP DMLプログラムが、値を特定のデータ型に変換せずに引数を処理するように指定することもできます。この場合、プログラムに引数および一時変数を定義するARGUMENT文とVARIABLE文に、WORKSHEET
のデータ型を指定できます。WKSDATAを使用すると、引数または変数の実際のデータ型を調べることができます。
ほとんどの場合は、単純なテキスト引数をプログラムに渡します。しかし、より汎用的なプログラムを作成したり、1つのアナリティック・ワークスペース・オブジェクトの全データや式の結果など、より複雑なテキスト引数を渡したりする場合があります。このような場合、置換式を使用して引数を渡すことができます。このように引数を渡す方法を、アンパサンド置換といいます。
次のような引数では、常にアンパサンドを使用して適切な置換を行う必要があります。
ワークスペース・オブジェクトの名前(units
やproduct
など)
文のキーワード(REPORT文におけるCOMMA
やNOCOMMA
、SORTコマンドにおけるA
やD
など)
アンパサンド置換を使用してワークスペース・オブジェクトの名前(それらの値ではなく)をプログラムに渡す場合、プログラムはその名前を認識しているため、オブジェクト自体にアクセスできます。これは、プログラムが複数の処理でオブジェクトを処理する必要がある場合に便利です。
注意: アンパサンドを含むプログラム行のコンパイルおよび保存はできません。そのかわりに、その行は実行時に評価されますが、プログラムの実行速度が低下する場合があります。このため、パフォーマンスを最適化できるように、他の方法を使用できる場合はアンパサンド置換を使用しないでください。 |
アンパサンド置換を使用して複数のディメンション値を渡す例は、例10-18「LIMITでのアンパサンド置換の使用」を参照してください。アンパサンド置換を使用して式のテキストを渡す例は、例9-46「式のテキストの受渡し」を参照してください。アンパサンド置換を使用してオブジェクト名およびキーワードを渡す例は、例9-47「ワークスペース・オブジェクト名とキーワードの受渡し」を参照してください。
ほとんどのプログラミング言語と同様、OLAP DMLにはプログラム内におけるフロー制御の決定に使用可能な多くの文があります。ただし、多くのOLAP DML文が本来持っているループ特性のため、OLAP DMLプログラムでは明示的なループはできるだけコーディングしないでください。
表4-1「フロー制御を決定する文」に、OLAP DMLのフロー制御文を示します。OLAP DML文のループ特性の詳細は、「すべてのデータ・オブジェクトの値に対するOLAP DML文の適用」を参照してください。
OLAP DMLには、一般のプログラミング言語の場合と同様のフロー制御文が含まれています。表4-1「フロー制御を決定する文」に、これらの文を示します。
表4-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-86「レベル・マーカーの作成」を参照してください。例10-87「PUSHLEVELおよびPOPLEVELコマンドのネスト」では、PUSHLEVEL文およびPOPLEVEL文のネストについて解説します。
プログラムのいずれかの場所でエラーが発生した場合、Oracle OLAPは次のアクションを実行します。
エラーの名前をERRORNAMEオプションに格納し、エラー・メッセージのテキストをERRORTEXTオプションに格納します。
注意: ERRNAMESオプションがデフォルト値のYES に設定されている場合、ERRORTEXTオプションにはエラー・メッセージのテキストのみでなく、エラーの名前(ERRORNAMEオプションの値)も含まれます。 |
ECHOPROMPTがYES
の場合、Oracle OLAPは入力行、エラー・メッセージおよび出力行を現行の出力ファイルにエコー出力します。OUTFILE文またはDBGOUTFILE文を使用すると、エラー・メッセージをファイルに記録できます。ファイルに出力を送信する例は、例10-70「出力のファイルへの送信」を参照してください。
エラー・トラップがオフの場合は、プログラムの実行は停止されます。エラー・トラップがオンの場合、エラーはトラップされます。
プログラムを正常に実行するには、エラーが発生することを予想して、エラーを処理するためのシステムを設定する必要があります。TRAP文を使用すると、プログラムでエラー・トラップ・メカニズムをオンにできます。エラー・トラップがオンになっていれば、エラーが通知された場合でもプログラムの実行は停止されません。そのかわりに、エラー・トラップにより次の処理が実行されます。
エラー・トラップ・メカニズムをオフにし、エラー処理の過程で別のエラーが発生した場合の無限ループを回避します。
TRAP
文で指定したラベルに分岐します。
ラベルの後に続く文を実行します。
コール側のプログラムにエラーを渡すには、次に示す2つの方法のいずれかを使用できます。使用する方法は、エラー・メッセージを生成するタイミングによって異なります。最初の方法を使用した場合、エラー・メッセージはただちに生成され、その後エラー状態がプログラムの連鎖を経由して渡されます。2番目の方法を使用した場合は、エラーがプログラムの連鎖を経由して渡されてから、エラー・メッセージが生成されます。詳細は、「エラーの受渡し: 方法1」および「エラーの受渡し: 方法2」を参照してください。
どちらの方法の場合も、プログラムの連鎖内の各プログラムにおいて適切なエラー処理が実行され、ある時点でOracle OLAPから現行の出力ファイルへエラー・メッセージが送られます。
この方法を使用した場合、エラー・メッセージはただちに生成され、その後エラー状態がプログラムの連鎖を経由して渡されます。
TRAP文は、(デフォルトの)PRINTオプションと組み合せて使用します。エラーが発生すると、エラー・メッセージが生成され、実行はトラップ・ラベルに分岐します。トラップ・ラベル後は、内容を問わず必要なクリーンアップを実行し、次の文を実行します。
SIGNAL PRGERR
この結果、エラー条件が作成され、現行のプログラムの実行元であったプログラムにこのエラー条件が渡されます。ただし、PRGERRからはエラー・メッセージは生成されません。PRGERRでは、ERRORNAMEオプションが空白値に設定されます。
コール側のプログラムにトラップ・ラベルがある場合、プログラムの実行はそのラベルに分岐します。ネストしたプログラムの連鎖内の各プログラムがTRAPおよびSIGNALをこのように使用する場合は、プログラムの連鎖全体を経由してエラー状態を渡すことができます。
この方法を使用した場合は、エラーがプログラムの連鎖を経由して渡されてから、エラー・メッセージが生成されます。
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-122「エラーの通知」を参照してください。
エラー・ラベルに分岐せずに警告メッセージを生成する場合、SHOW
文を使用できます(例10-120「SHOWによるエラー・メッセージの作成」を参照)。
ネストしたプログラムでエラーを処理する場合、各プログラムのエラー処理セクションで環境をリストアする必要があります。さらに、そのプログラムに特有の特別なエラー状態も処理できます。たとえば、プログラムが固有のエラーを通知する場合、そのエラーをテストする文を含めることができます。
ネストしたプログラムで発生したその他のエラーは、プログラムの連鎖を経由して渡され、各プログラムで処理されます。ネストしたプログラムの連鎖を経由してエラーを渡すには、エラー・メッセージを生成するタイミングに応じて、次に示す2つの方法のいずれかを使用できます。
エラー・メッセージがただちに生成され、その後にエラー状態がプログラムの連鎖を経由して渡される。この方法は、例10-156「プログラム・エラー・メッセージの即時の表示」で解説します。
最初にエラーがプログラムの連鎖を経由して渡され、連鎖の最後にエラー・メッセージが生成される。この方法は、例10-157「連鎖の最後でのプログラム・エラー・メッセージの生成」で解説します。
どちらの方法でもSIGNAL
文を使用します。
セッション環境の保存中に発生するエラーを適切に処理するには、TRAP
文の前にPUSHLEVEL
文を、TRAP
文の後にPUSH
文を配置します。
PUSHLEVEL 'firstlevel' TRAP ON error PUSH ...
プログラムの異常終了セクションに、エラー・ラベル(後ろにコロンを入力)、およびセッション環境をリストアしてエラーを処理する文を配置します。異常終了セクションは、次のようになります。
error: POPLEVEL 'firstlevel' OUTFILE EOF
これらの文により、保存されたディメンション・ステータスおよびオプション値がリストアされ、出力をデフォルトの出力ファイルに再転送します。