10 OLAP DMLコマンド: HからZ

この章では、OLAP DMLコマンドのリファレンス項目の続きをアルファベット順に説明します。文字HからZで始まる各OLAP DMLコマンドにつき1つの項目があり、HEADINGから説明します。

OLAP DMLコマンドのアルファベット順リスト、カテゴリ別リスト、およびここで紹介する以外のOLAP DMLコマンドのリファレンス項目については、「OLAP DMLコマンド: AからG」を参照してください。

OLAP DMLリファレンスのその他のトピックについては、「OLAP DMLプロパティ」「OLAP DMLオプション」「OLAP DMLファンクション: AからK」,および「OLAP DMLファンクション: LからZ」を参照してください。

ヒント:

OLAP DML文の多くはコーディングの際、文の名前の頭文字および2つの子音字を並べた3文字に省略して表すことができます。

HEADING

HEADINGコマンドは、レポートのタイトルおよび列ヘッダーを生成するコマンドです。ヘッダー出力は、現行の出力ファイルに送信されます。HEADINGコマンドの形式はROWコマンドの形式と同じです。ただし、HEADINGを使用する場合、Oracle OLAPはヘッダーから列小計および総計に数値を追加しません。

多くの場合、HEADING文はPAGEPRGプログラムで使用して、レポートの各ページにタイトルまたは列ヘッダーを生成します。

ヒント:

ROWコマンドの小計機能を必要としないことが前もって明らかな場合、ROWコマンドのかわりにHEADINGコマンドを使用してレポートの行を生成すると、この場合、Oracle OLAPは小計を管理しないので時間を節約できます。

構文

HEADING [attribs] {expression1|SKIP}, [attribs] {expressionN|SKIP}

パラメータ

attribs

各列の書式を指定する属性。(使用可能な属性のリストおよび詳細な説明は、ROWコマンドを参照してください。)

expression

列ヘッダーとして使用するテキスト。列ヘッダーにリテラル・テキストを使用するには、テキストを一重引用符で囲みます。(列を生成するための式、属性およびACROSSグループの使用の詳細は、ROWコマンドを参照してください。)

SKIP

式のかわりに使用され、その列を空白のままにすることを示します。

使用上の注意

ROWコマンドに関する注意は、HEADINGコマンドにも適用されます(ROWの行および列の算術に関する注意は除く)。

HEADINGを使用したタイトルの作成

レポートにタイトルまたはサブタイトルを作成するには、HEADINGを使用して、LSIZEオプションの設定と同じ幅の単一の列を生成します。その列内でテキストを中央揃えして、中央揃えのタイトルを作成します。

最大ヘッダー幅

ヘッダー行を含めて、レポートの各行の最大幅は4,000文字です。

例10-1 列ヘッダーの生成

レポートで、列にヘッダーを付けるとします。プログラム内で次のようなHEADING文を使用します。

HEADING UNDER '-' CENTER <WIDTH 15 'Product' -
   ACROSS district FIRST 3: district>

この文によって生成される出力は、次のとおりです。

    Product      Atlanta     Boston    Chicago
--------------- ---------- ---------- ----------

HIDE

HIDEコマンドは、プログラムのテキストを非表示にし、DESCRIBE、EDITまたはOBJ文を使用したときにテキストを表示できないようにするコマンドです。そのプログラムに対しては、実行、コンパイル、名前の変更、エクスポートなどの他のすべてのアクションを実行できます。

プログラムを非表示にする場合、Oracle OLAPがプログラム・テキストをエンコードするために使用するシード式を指定します。このシード式を後でUNHIDE文とともに使用すると、テキストを表示できます。

注意:

このコマンドは、単純なエンコードを実行します。セキュアな暗号化の使用方法や、その他のOracleのセキュリティ機能については、『Oracle Databaseセキュリティ・ガイド』Oracle Databaseセキュリティの概要に関する項を参照してください。

構文

HIDE prog-name seed-exp

パラメータ

prog-name

テキストを非表示にするプログラムの名前。プログラム名は引用符で囲まないでください。

seed-exp

プログラム・テキストをエンコードする際にシード値として使用される単一行のテキスト式。この値にNAは指定できません。

後でUNHIDE文とともに使用するために、このシード式は記録しておく必要があります。UNHIDE文で指定するシード式は、HIDE文で使用していた値とすべてのバイトが同じである必要があります。さらに、シード式は大/小文字が区別されるので、記録するときに注意してください。

使用上の注意

エクスポートおよびインポートした場合のシード指定

非表示のプログラムをエクスポートおよびインポートするた場合、インポート先のアナリティック・ワークスペースでもテキストは非表示のままです。UNHIDEコマンドとともに使用するために、同じシード式が保持されます。

例10-2 プログラム・テキストの非表示

次の例は、sales_rptという名前のプログラムのテキストを非表示にします。

HIDE sales_rpt 'Crystal' 

HIERDEPTH

HIERDEPTHコマンドは、リレーションの各階層について、最上位の階層からの深さを計算し、深さリレーションとも呼ばれる事前に定義されたリレーションにその値を格納するコマンドです。

構文

HIERDEPTH parent-rel [(qdr-list)] INTO depth-rel [INHIERARCHY inh-valueset ]

パラメータ

parent-rel

階層ディメンションの親子のセルフ・リレーション。詳細は、parentrelリレーションを参照してください。

qdr-list

parentrelの値を制限するQDRのリスト。修飾データ参照の構文の説明に従ってQDRを指定します。qdrlistの値を指定しない場合、HIERHEIGHTは現行のステータスにあるparentrelの値を使用します。

depth-rel

HIERDEPTHコマンドが実行されたときに移入される、事前に定義されたリレーション。このリレーションは、複数のディメンションを持つことができますが、階層ディメンションの深さを表す他の1つのNUMBERディメンション、およびparentrelのディメンションによってディメンション化されている必要があります。

たとえば、parent-relが、dim1およびdim2という2つのディメンションを持つ場合、次に示すコードでは、3つの値を持つnumdimという名前のNUMBERディメンションを定義し、さらにdim1およびdim2によってディメンション化され、numdimの値をその値として持つdepthrelという名前の深さリレーションを定義します。

DEFINE numdim dimension NUMBER(3)
DEFINE depthrel RELATION numdim <dim1 dim2>
inh-valueset

グルーピングIDを作成する際に検討される階層ディメンション値を持つ値セット・オブジェクトの名前。値セットに含まれない値は無視されます。詳細は、inhier値セットまたは変数を参照してください。

例10-3 階層の深さリレーションの作成および移入

アナリティック・ワークスペースに、geoggeog_hierlistおよびgeog_parentrelオブジェクトが含まれる場合を想定します(例9-145を参照)。これらのオブジェクトによって表される階層の深さリレーションを作成するには、次のDMLコードを発行します。

"   Define the number dimension for the depthrel
DEFINE numdepth DIMENSION NUMBER (3)
"   Define the depth relation
"   Populate the depth relation
HIERDEPTH geog_parentrel INTO depthrel
REPORT DOWN geog depthrel
 
               ------------------DEPTHREL-------------------
               ----------------GEOG_HIERLIST----------------
GEOG               Political_Geog           Sales_Geog
-------------- ---------------------- ----------------------
Boston         3                      3
Springfield    3                      3
Hartford       3                      3
Mansfield      3                      3
Montreal       3                      3
Walla Walla    3                      3
Portland       3                      3
Oakland        3                      3
San Diego      3                      3
MA             2                      2
CT             2                      2
WA             2                      2
CA             2                      2
Quebec         2                      2
East           0                      1
West           0                      1
All Regions    0                      0
USA            1                      0
Canada         1                      0
All Countries  0                      0

HIERHEIGHTコマンド

HIERHEIGHTコマンドは、指定された階層ディメンションの値を、事前定義済のリレーションにレベル別に移入するコマンドです。通常HIERHEIGHTコマンドは、OLAP_TABLEファンクションを使用してアナリティック・ワークスペースにアクセスできるようにする場合に使用します。

階層ディメンションの値としてノードの値(レベル別)を取得するには、HIERHEIGHTを使用します。

関連項目:

familyrelリレーションを参照してください

構文

HIERHEIGHT parentrelation [(qdrlist)] INTO{familyrel-        [USING level-relation | A | D] [INHIERARCHY { inh-variable | inh-valueset}]

パラメータ

parentrel

階層ディメンションの親子のセルフ・リレーション。詳細は、parentrelリレーションを参照してください。

qdrlist

parentrelの値を制限するQDRのリスト。修飾データ参照の構文の説明に従ってQDRを指定します。qdrlistの値を指定しない場合、HIERHEIGHTは現行のステータスにあるparentrelの値を使用します。

familyrel

HIERHEIGHTコマンドが実行されたときに移入される、事前に定義されたリレーション。このリレーションは、複数のディメンションを持つことができますが、階層ディメンションのレベルを表す他の1つのディメンション、およびparentrelのディメンションによってディメンション化されている必要があります。階層ディメンションのレベルを表すディメンションの実際の構造は、次のようにHIERHEIGHT文にUSING句が含まれているかどうかによって異なります。

  • 文にUSING句が含まれている場合、階層ディメンションのレベルを表すディメンションは、レベルの名前が含まれるディメンションです。

  • 文にUSING句が含まれていない場合、階層ディメンションのレベルを表すディメンションは、値としてレベルの深さを持つINTEGERディメンションです。

HIERHEIGHT文が実行される前にfamilyrelが移入されている場合、移入値が削除されてから新しい値が計算されます。

USING levelrel

指定のlevelrelを使用してリレーションが移入されるように指定します。詳細は、levelrelリレーションを参照してください。

A

リレーションが昇順で移入されるように指定します。

D

(デフォルト)リレーションが降順で移入されるように指定します。

inh-variable

階層ディメンションによってディメンション化されるか、または複数階層の階層ディメンションの場合には階層の名前であるディメンションによってディメンション化されるBOOLEAN変数。ディメンション値が階層にある場合の変数の値はTRUEであり、ない場合はFALSEです。

inh-valueset

グルーピングIDを作成する際に検討される階層ディメンション値を持つ値セット・オブジェクトの名前。値セットに含まれない値は無視されます。詳細は、inhier値セットまたは変数を参照してください。

使用上の注意

OLAP_TABLEファンクションを使用したHIERHEIGHT

通常、OLAP_TABLEファンクションを使用してアナリティック・ワークスペースにアクセスできるようにするには、HIERHEIGHT文を使用します。

例10-4 地理階層のリレーション表現の作成

地理階層が次の定義のアナリティック・オブジェクトによって定義されているmyawという名前のアナリティック・ワークスペースがあるとします。

DEFINE geog.hierdim DIMENSION TEXT
LD Hierarchy names for Geography hierarchies

DEFINE geog.leveldim DIMENSION TEXT
LD List of levels for GEOGRAPHY hierarchies

DEFINE geography DIMENSION TEXT WIDTH 12
LD Values for the Geography hierarchies

DEFINE geog.levelrel RELATION geog.leveldim <geography geog.hierdim>
LD Level of each value in the Geography hierarchies

DEFINE geog.parent RELATION geography <geography geog.hierdim>
LD Child-parent relation for the Geography hierarchies

DEFINE geog.familyrel RELATION geography <geography geog.leveldim geog.hierdim>
LD Geography values by level and hierarchy

これらのオブジェクトの構造は、次のとおりです。

GEOGRAPHY
------------------
World
Americas
Canada
USA
Toronto
Montreal
Boston
LosAngeles

GEOG.HIERDIM
------------------
Standard
Consolidated

GEOG.LEVELDIM
------------------
World
Continent
Country
City
Consolidated
Continent
Consolidated
Country

                   ------------GEOG.LEVELREL------------
                   ------------GEOG.HIERDIM-------------
GEOGRAPHY               Standard         Consolidated
------------------ ------------------ ------------------
World              World              NA
Americas           Continent          Consolidated
                                      Continent
Canada             Country            Consolidated
                                      Country
USA                Country            Consolidated
                                      Country
Toronto            City               NA
Montreal           City               NA
Boston             City               NA
LosAngeles         City               NA

                   -------------GEOG.PARENT-------------
                   ------------GEOG.HIERDIM-------------
GEOGRAPHY               Standard         Consolidated
------------------ ------------------ ------------------
World              NA                 NA
Americas           World              NA
Canada             Americas           Americas
USA                Americas           Americas
Toronto            Canada             NA
Montreal           Canada             NA
Boston             USA                NA
LosAngeles         USA                NA

地理階層のファミリ・リレーションを作成するために、次の定義によってアナリティック・ワークスペース・オブジェクトを定義します。

DEFINE geog.familyrel RELATION geography <geography geog.leveldim geog.hierdim>
LD Geography values by level and hierarchy

次に、次の文に示すように、HIERHEIGHT文を使用してそのオブジェクトを移入します。

HIERHEIGHT geog.parent INTO geog.familyrel USING geog.levelrel

次のREPORT文を発行すると、geographyディメンションのStandard階層およびConsolidated階層のリレーション表現を表示できます。

REPORT DOWN geography geog.familyrel
GEOG.HIERDIM: Standard
             -------------------------------GEOG.FAMILYREL--------------------------------
             --------------------------------GEOG.LEVELDIM--------------------------------
                                                                 Consolidated Consolidated
GEOGRAPHY       World      Continent     Country        City      Continent     Country
------------ ------------ ------------ ------------ ------------ ------------ ------------
World        World        NA           NA           NA           NA           NA
Americas     World        Americas     NA           NA           NA           NA
Canada       World        Americas     Canada       NA           NA           NA
USA          World        Americas     USA          NA           NA           NA
Toronto      World        Americas     Canada       Toronto      NA           NA
Montreal     World        Americas     Canada       Montreal     NA           NA
Boston       World        Americas     USA          Boston       NA           NA
LosAngeles   World        Americas     USA          LosAngeles   NA           NA

GEOG.HIERDIM: Consolidated
             -------------------------------GEOG.FAMILYREL--------------------------------
             --------------------------------GEOG.LEVELDIM--------------------------------
                                                                 Consolidated Consolidated
GEOGRAPHY       World      Continent     Country        City      Continent     Country
------------ ------------ ------------ ------------ ------------ ------------ ------------
World        NA           NA           NA           NA           NA           NA
Americas     NA           NA           NA           NA           Americas     NA
Canada       NA           NA           NA           NA           Americas     Canada
USA          NA           NA           NA           NA           Americas     USA
Toronto      NA           NA           NA           NA           NA           NA
Montreal     NA           NA           NA           NA           NA           NA
Boston       NA           NA           NA           NA           NA           NA
LosAngeles   NA           NA           NA           NA           NA           NA

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

IF...THEN...ELSEコマンドは、OLAP DMLプログラム内で使用すると、指定された条件に適合した場合にプログラム内の1つ以上の文を実行するコマンドです。オプションで、条件に一致しない場合に、かわりになる文または文のグループを実行することも可能。

注意:

式の条件演算子としてIFを使用することもできます。IF...THEN...ELSE式を参照してください

構文

IF boolean-expression    THEN statement1    [ELSE statement2]

パラメータ

boolean-expression

TRUEまたはFALSEを返す有効なブール式。

THEN statement1

Oracle OLAPは、ブール式がTRUEである場合にstatement1引数を実行します。statement1はTHENと同じ行にある必要があります。

ELSE statement2

Oracle OLAPは、ブール式がFALSEである場合にstatement2引数を実行します。statement2はELSEと同じ行にある必要があります。ELSE句を省略した場合、プログラムのIF...THEN...文全体の後ろにある文によって実行が継続されます。

使用上の注意

DOとともに使用するIF

IF文は、THENまたはELSEキーワード(あるいはその両方)をDO ... DOENDシーケンスとともに使用することによって、複数の文を条件付きで実行できます。例10-5を参照してください。

単一行か複数行か

IFを式として使用する場合、THENおよびELSEキーワードはIFと同じ行にある必要があります。IFをコマンドとして使用する場合は、THENおよびELSEは別々の行にある必要があります。

例10-5 IF...THEN...ELSEの使用方法

プログラム内の次の行は、IF...THEN...ELSE...の使用方法を示します。ブール式ANY(DOLLARS LT 200000)TRUEである場合、THENの後の文(statement group 1)が実行されます。式がFALSEである場合、ELSEの後の文(statement group 2)が実行されます。

IF ANY(DOLLARS LT 200000)
THEN DO
  ... " (statement group 1)
  DOEND
ELSE DO
  ... "(statement group 2)
   DOEND

例10-6 条件演算子としてのIFの使用方法

レポートを生成するプログラムで、引数としてプログラムに渡す年によって、前年の実績経費または当年の予算をレポートするとします。JOINCHARSファンクションの条件式は、単語ActualまたはBudgetが付加されたヘッダーを生成します。別の条件式でレポートに対する変数を選択します。プログラムの各行は次のとおりです。

ARGUMENT cur.year year
 
LIMIT month TO year cur.year
REPORT -
   HEADING JOINCHARS( 'Expenses: ' -
                        IF cur.year LT 'Yr95' -
                        THEN 'Actual FOR ' -
                        ELSE 'Budget FOR ', -
                       cur.year ) -
   IF cur.year LT 'Yr95' THEN actual ELSE budget

IMPORT

IMPORTコマンドは、テキスト・ファイルまたはスプレッドシートからアナリティック・ワークスペースに、あるいはEIFファイルから別のアナリティック・ワークスペースにデータを転送するコマンドです。

IMPORTコマンドの構文は、インポートするデータがある場所によって異なるので、次のようにソース・ファイルの種類別に説明します。

IMPORT (EIF)

IMPORT(EIFから)コマンドを使用して、EIFファイルからOracle OLAPアナリティック・ワークスペースにデータおよび定義をコピーできます。IMPORTは、コマンドにディメンションを指定しなくても、ワークスペースに存在していない、インポートされるデータのディメンションもコピーします。

ヒント:

EIFファイルのインポートおよびエクスポートの方法を決定するオプションは複数あります。これらのオプションは、EIFオプションに記載されています。

IMPORT(EIFから)は、通常EXPORT(EIF)とともに使用して、Oracle OLAPアナリティック・ワークスペースの一部を別のOracle OLAPアナリティック・ワークスペースにコピーしますが、これは、オブジェクトをソース・ワークスペースからEIFファイルにエクスポートし、次にそのオブジェクトをEIFファイルからターゲット・ワークスペースにインポートします。ソースおよびターゲットのワークスペースが存在する場所は、同じプラットフォームでも異なるプラットフォームでも構いません。コンピュータ間でEIFファイルを転送する場合、バイナリ転送を使用してプラットフォーム間のファイル形式の非互換性の問題を回避します。EIFファイルは、EIFVERSIONをターゲット・ワークスペースのリリース番号以下のリリースに設定して作成する必要があります。ターゲットのリリース番号を確認するには、EVERSIONを使用します。

IMPORTを使用すると、EIFNAMESおよびEIFTYPESオプションにも情報が格納されます。

構文

IMPORT import_item FROM EIF FILE file-id [INTO workspace] -    [MATCH [STATUS]|APPEND|REPLACE [DELETE]] [LIST [ONLY]] [DATA] -    [DFNS] [UPDATE] [NOPROP] [NASKIP] [NLS_CHARSET charset-exp] -    [API |  NOAPI]

ここで、import_itemは次のいずれかです。

  • name [AS newname]
  • ALL

パラメータ

name [AS newname]

EIFファイルからアタッチされたアナリティック・ワークスペースにインポートされるワークスペース・オブジェクトの名前。このオブジェクトはまだワークスペースに存在していないので、オブジェクトに対する修飾オブジェクト名を指定できません。一度に複数の名前を指定できます。オブジェクトがインポートされる場所については、INTO workspace引数を参照してください。

AS newnameは、ディメンションを除く、インポートされるあらゆる型のオブジェクト名の変更に使用できます。

多次元のオブジェクトを別々の変数としてエクスポートした場合、すべての変数名を指定します。(EXPORT(EIF)のSCATTER ASキーワードを参照してください。)

ALL

(デフォルト)EIFファイルに含まれるすべてのオブジェクトをインポートすることを示します。オブジェクトがインポートされる場所については、INTO workspace引数を参照してください。

INTO workspace

オブジェクトのインポート先となるアタッチされたアナリティック・ワークスペースの名前。指定されたワークスペースにオブジェクトが存在する場合、そのデータはインポートされるデータによって上書きされます。オブジェクトが存在しない場合、IMPORTは指定されたワークスペースにオブジェクトを作成します。他のアタッチされたワークスペースに同じ名前のオブジェクトが存在する場合は無視されます。

この引数を指定しない場合は、次のように処理されます。

  • インポートされるオブジェクトをアタッチされたワークスペースで事前定義していない場合、IMPORTは現行のワークスペースでそのオブジェクトを自動的に定義します。

  • いずれかのアタッチされたワークスペースにそのオブジェクトがすでに存在する場合、IMPORTはそこに含まれるデータをインポート・データによって上書きします。

FROM EIF FILE file-id

インポートするファイルを指定します。file-idはファイルの名前を表すテキスト式です。名前はファイル識別子の標準形式である必要があります。

MATCH [STATUS]

ターゲット・ワークスペースにすでに存在するディメンション値と一致するディメンション値に関連付けられているデータのみをIMPORTコマンドが転送することを示します。時間ディメンション以外のディメンションの場合、EIFファイルとターゲット・ワークスペースの対応するディメンション値を一致させるには、スペルおよび大/小文字の区別が同じであることを確認します(たとえば、TentsTENTSと一致しません)。時間ディメンションの場合、Oracle OLAPは、ディメンション値の表示方法によってではなく、ディメンション値が表す日付によってディメンション値を識別します。したがって、EIFファイルとワークスペースの時間ディメンション値が同じ期間を表す場合、両方の時間ディメンション値は自動的に一致します。MATCH STATUSを指定した場合、IMPORTはそのディメンションの現行のステータスに含まれる値に関連付けられているデータのみをインポートします。ディメンションがターゲット・ワークスペースで制限されている場合、Oracle OLAPはステータスから除外されている値に関連付けられているEIFファイルのデータを無視します。

APPEND

(デフォルト)ディメンション値がターゲット・ワークスペースにすでに存在するディメンション値と一致するかどうかにかかわらず、関連付けられているデータとともにすべてのディメンション値をIMPORTコマンドが転送することを示します。APPENDは、既存のディメンション値と一致しないディメンション値を追加し、新しい値はディメンション値のリストの最後に追加されます。時間ディメンションの場合、ターゲット・ワークスペースのディメンション値と新しいディメンション値の間に差があれば、APPENDはそれを埋めるためのディメンション値の追加も行います。

REPLACE [DELETE]

ワークスペースですでに定義されているオブジェクトに対して、IMPORTがEIFファイルのディメンション値と一致する既存のディメンション値を保持することを示します。EIFファイルのディメンション値と一致しないディメンション値(およびそのデータ)は削除されます。EIFファイルに関連付けられているデータの変数が含まれる場合、IMPORTは、新しいディメンションの一部として保持されるディメンション値の関連付けられているデータを置き換えます。テキスト・ディメンションの場合、EIFファイルのディメンション値の順序も変更されます。

REPLACE DELETEを指定した場合、マッチングは行われません。ディメンションをインポートする前に、Oracle OLAPはMAINTAIN DELETE ALLを実行しますが、これによって既存ディメンションに関連付けられているすべてのデータがディメンション値がとともに廃棄されます。

注意:

REPLACEキーワードを使用する場合は注意が必要です。ディメンションの値を置き換えると、そのディメンションによってディメンション化されているターゲット・ワークスペースのすべての変数およびリレーションが影響を受けます。変数またはリレーションを同時にインポートするのではない場合に、そのディメンションのうちの1つで値を置き換えると、結果としてデータが失われることがあります。

LIST
LIST ONLY

定義のリストを生成します。ディメンションの場合、ターゲット・ワークスペースにインポートされるときの、各ディメンションの値の数が出力に示されます。コンポジットの場合、ディメンション値の組合せの数が示されます。さらに、2分ごとおよびインポート処理後には常に、読取りバイト数および経過時間もIMPORTによって示されます。

デフォルト以外の索引タイプを使用する結合またはコンポジットを定義した場合、IMPORT LISTコマンドはその索引タイプを表示します。デフォルトの索引タイプ(結合用のHASH、コンポジット用のBTREE)を使用する場合、その情報は表示されません。

EXPORT(EIF)は現行の出力ファイルにリストを送信します。LIST ONLYを指定した場合、実際のインポートは行われずにリスト表示のみが行われます。

ONLY

Oracle OLAPが、実際のインポートを行わずにEIFNAMESおよびEIFTYPESオプションに正しい値を配置します。ただし、オブジェクト定義の完全なリストは生成されません。そのリストを生成するには、ONLYキーワードの前にLISTキーワードを指定します。

DATA

ターゲット・ワークスペースにすでに存在するオブジェクトに対して、IMPORTがそのオブジェクトに関連付けられているデータのみを更新することを示します。すでに存在する計算式に対して、IMPORTはそのEQ式を更新します。IMPORTがターゲット・ワークスペースに作成するオブジェクトは、完全な定義および関連付けられているデータとともに作成されます。DATAとDFNSの両方を指定できますが、どちらも指定しない場合のデフォルトはDATAです。

DFNS

ターゲット・ワークスペースにすでに存在するオブジェクトに対して、IMPORTが定義を更新するのみで、データは変更しないままにすることを示します。IMPORT DFNSによって影響を受ける定義のコンポーネントは、LDコマンド、VNFおよびPROPERTYです。IMPORTがターゲット・ワークスペースに作成するオブジェクトは、そこでもデータを受け取ります。DATAとDFNSの両方を指定できますが、どちらも指定しない場合のデフォルトはDATAです。

UPDATE

IMPORTが各オブジェクトをインポートした後にUPDATE文を実行することを示しますが、これは、Oracle OLAPでメモリー不足が発生するような大きなEIFファイルのインポートに有効な場合があります。更新の頻度を制御するには、EIFUPDBYTESオプションを使用します。

NOPROP

各オブジェクトに割り当てたプロパティをEIFファイルから読み取りません。

NASKIP

NAデータのみを含むコンポジット・タプル(索引)をターゲット・ワークスペースにインポートしないことを指定します。この引数はすでにワークスペースに存在するタプルには影響を与えません。

NLS_CHARSET charset-exp

file-idによって指定されるファイルからテキスト・データをインポートする際にOracle OLAPが使用するキャラクタ・セットを指定します。通常、EIFファイルにはそのキャラクタ・セットの独自指定が含まれているので、この引数は必要ありません。ただし、EIFファイルで不適切なキャラクタ・セットが指定されている場合、またはキャラクタ・セットの指定が不明である場合は、この引数を使用してキャラクタ・セットを正しく指定する必要があります。

指定可能なキャラクタ・セットについては、『Oracle Databaseグローバリゼーション・サポート・ガイド』キャラクタ・セットの選択に関する項を参照してください。

この引数は最後に指定する必要があります。この引数が省略されていて、Oracle OLAPがEIFファイルからキャラクタ・セットを決定できない場合、Oracle OLAPは、NLS_LANGオプションに記録されているデータベース・キャラクタ・セットを使用してデータをインポートします。

API

(デフォルト)EIFファイルがAPIキーワードを使用したEXPORT(EIF)コマンドで作成された場合、指定した項目に対して定義されているキューブのメタデータをインポートします。

注意:

このようなインポートの実行後には、UPDATEおよびCOMMITが自動的に実行されます。

NOAPI

EIFファイルがAPIキーワードを使用したEXPORT(EIF)コマンドで作成された場合でも、指定した項目に対して定義されているキューブのメタデータをインポートしません。このキーワードを指定すると、Oracle OLAPでは、IMPORTコマンドの実行後にUPDATEおよびCOMMITは自動的に実行されません

使用上の注意

別々のIMPORT文

MATCH、APPEND、REPLACE、DATAおよびDFNS引数を指定すると、インポートするために指定したすべてのオブジェクトに影響を与えます。それぞれのオブジェクトを異なる方法で処理するには、IMPORT文を個別に使用します。

非表示のプログラムのインポートとエクスポート

リレーションのインポート

リレーションをインポートする場合、IMPORTは関連ディメンションの定義および値も転送します。

連結ディメンションのインポート

連結ディメンションをアナリティック・ワークスペースにインポートするときに、連結ディメンションはすでにアナリティック・ワークスペースに存在するが、そのコンポーネントのディメンションは存在しない場合、Oracle OLAPは連結ディメンション、コンポーネントのディメンションおよびすべてのディメンションの定義をインポートします。

アナリティック・ワークスペースに存在していない連結ディメンションをインポートするときに、そのコンポーネントのディメンションの1つ以上がすでにアナリティック・ワークスペースに存在する場合、Oracle OLAPは連結ディメンション、新しいコンポーネントのディメンションおよびそれらの定義をインポートします。アナリティック・ワークスペースにすでに存在するコンポーネントのディメンションに対しては、他のディメンションの場合と同様に、IMPORT文にMATCH、APPEND、REPLACEの指定があればそれに従ってコンポーネントであるディメンションがインポートされます。

アナリティック・ワークスペースにすでに存在する連結ディメンションの名前および定義で連結ディメンションをインポートする場合、Oracle OLAPは他のディメンションの場合と同様に連結ディメンションをインポートします。

アナリティック・ワークスペースにすでに存在する連結ディメンションと同じ名前で連結ディメンションをインポートするときに、インポートされる連結ディメンションの定義が既存の連結ディメンションの定義と異なる場合、既存の連結ディメンションの定義は変更されず、既存の連結ディメンションのコンポーネントのディメンションの定義も変更されません。既存の連結ディメンションのコンポーネントのディメンションでもある、インポートされる連結ディメンションのコンポーネントのディメンションのみがインポートされます。インポートされる連結ディメンションが既存の連結ディメンションとコンポーネントのディメンションを共有しない場合、エラー条件が発生します。連結ディメンションによってディメンション化されているオブジェクトをインポートする場合、Oracle OLAPはインポートされるディメンションの値に対応するオブジェクトの値のみをインポートします。

ディメンション・サロゲートのインポートとエクスポート

ディメンション・サロゲートをExpress Interchange File(EIF)にインポートまたはEIFからエクスポートできます。この操作で、ディメンション・サロゲートは、サロゲートのディメンションによってディメンション化される変数のように動作します。EXPORT操作では、サロゲートが定義されているディメンションもエクスポートされます。IMPORT操作では、サロゲートが定義されているディメンションがインポートされますが、MATCH、STATUS、DATA、DFNS、APPENDおよびREPLACEキーワードを使用して、どの値をインポートするかを決定できます。

ディメンション・サロゲートをインポートすると、サロゲートの基になるディメンションの定義および値もインポートされます。同じ定義のディメンションが現行アナリティック・ワークスペースにすでに存在する場合、MATCH、APPEND、REPLACE、DATA、DFNSなどのIMPORTのキーワードのサロゲートに対する効力は、ディメンションによってディメンション化される変数のサロゲートの場合と同じです。インポートされるサロゲートの名前および定義が現行アナリティック・ワークスペースの既存のディメンション・サロゲートと同じ場合、およびインポートされるサロゲートに既存のサロゲートと同じ値がある場合、エラー条件が発生します。

同じ名前のオブジェクトが現行アナリティック・ワークスペースに存在しない場合、またはDFNSキーワードを使用する場合、INTEGERディメンション・サロゲートをインポートできます。INTEGERディメンション・サロゲートをインポートすると、インポートされるサロゲート・ディメンションの暗黙的なインポートによって既存のディメンションの値が変更される場合に、既存のINTEGERディメンション・サロゲートに影響を与えます。

APPENDとREPLACE

ターゲット・ワークスペースにすでに存在するINTEGERディメンションをインポートする場合、次の点に注意してください。

  • インポートされるINTEGERディメンションが既存のINTEGERディメンションより大きい場合、APPENDとREPLACEの効力は同じです。ディメンションの値の数は、大きい方のインポートされるディメンションの値の数になります。

  • インポートされるINTEGERディメンションのほうが小さい場合、REPLACEはディメンションの最後から該当するディメンション値を関連付けられているデータとともに削除しますが、APPENDは既存のディメンション値をそのまま残します。

INTEGERとSHORTINTEGERのデータ型

IMPORTコマンドは、INTEGERとSHORTINTEGERの間でデータ型を変換します。この2つのデータ型のうちの一方を持つ変数をEIFファイルからインポートするときに、その変数がすでにワークスペースに他方の型で存在する場合、Oracle OLAPはデータを自動的に変換します。SHORTINTEGERの最大値は32,767、最小値は-32,767です。この制限を超えるINTEGER値をSHORTINTEGER変数にインポートすると、結果はNAです。

TEXTとIDのデータ型

インポートするEIFファイルに、TEXTディメンション、変数、リレーションまたは値セットにインポートするIDデータが含まれる場合、Oracle OLAPはインポート処理時にIDデータをテキストに自動的に変換します。

既存のプログラムとモデル

ワークスペースにすでに存在するプログラムまたはモデルをインポートする場合、DFNSを指定する必要があります。プログラムまたはモデルは定義のみで、データを持ちません。デフォルトのオプションDATAは、すでに存在するソース・コードをインポートしません。

プログラムを定義する場合、プログラムがファンクションとしてコールされるときに使用されるデータ型またはディメンション名を指定できます。データ型を指定すると、戻り値のデータ型が決定されます。ディメンション名を指定すると、戻り値はそのディメンションの単一の値です。既存のプログラムをインポートする場合、インポートされるプログラム定義のデータ型またはディメンションは既存のプログラム定義と一致する必要があります。一致しない場合は、エラー・メッセージが生成されます。

PERMIT文

オブジェクトに関連付けられたPERMIT文は、オブジェクト定義とともにインポートされます。このコマンドは、そのオブジェクトを引数にしてDESCRIBEコマンドを使用すると参照できます。ただし、オブジェクトがインポートされるときに権限条件は評価されません。

同じ名前のオブジェクトがターゲット・ワークスペースにすでに存在する場合に、DFNSキーワードを指定すると、オブジェクトのPERMIT文は更新されます。ただし、新しいアクセス権を有効にするには、PERMITRESETを実行する必要があります。同じ名前のオブジェクトがターゲット・ワークスペースにすでに存在する場合に、DFNSキーワードを指定しないと、オブジェクトのPERMIT文は更新されません。ターゲット・ワークスペースに既存のオブジェクトがない場合には、インポート時にDFNSキーワードを指定するかどうかにかかわらず、オブジェクトのPERMITコマンドは更新されますが、新しいアクセス権を有効にするためにPERMITRESETを実行する必要があります。(PERMITコマンドを参照してください。)

ワークスペース全体をエクスポートおよびインポートし、続いてそのワークスペースを更新、デタッチおよび再アタッチする場合、Oracle OLAPはエクスポート前に有効だったすべてのアクセス権をターゲット・ワークスペースでも有効にします。

ワークスペース・サイズの削減

EXPORT文とともにIMPORTを使用すると、ワークスペース全体を即座に稠密にできます。これを行うには、最初にワークスペースをエクスポートし、次にそれを別の名前でインポートします。古いワークスペースを削除し、新しいワークスペースを元の名前に変更します。

結合型の維持

HASH、BTREEまたはNOHASH結合ディメンションをEIFファイルにエクスポートする場合、EIFファイルにはその定義とともに結合型がエクスポートされます。その結合ディメンションをアナリティック・ワークスペースにインポートすると、新しいディメンションまたはその結合型をすでに使用しているディメンションにインポートしたときに、Oracle OLAPはその結合型を維持します。同じ結合型を使用しない既存のディメンションにそのディメンションをインポートしたときには、Oracle OLAPはEIFファイルに保存された元の結合型を維持しません。

EIFBYTES、EIFNAMESおよびEIFTYPES

EIFBYTESオプションを使用すると、最後にIMPORT(EIFファイル)文が実行されたときの読取りまたは書込みのバイト数がわかります。EIFNAMESオプションを使用すると、最後に実行したIMPORT文によってインポートされたすべてのオブジェクトの名前のリストを取得でき、EIFTYPESオプションを使用すると、そのリストにあるオブジェクトの型がわかります。

次の形式の文では、IMPORTは指定されたオブジェクトを実際にインポートせずに、オブジェクトに関する情報をEIFNAMESおよびEIFTYPESオプションに格納します。IMPORTは、IMPORTコマンドによって指定されるオブジェクト名のリストをEIFNAMESオプションに配置します。また、IMPORTは、EIFNAMESにリストされる各オブジェクト型のリストをEIFTYPESオプションに配置します。LISTキーワードを使用すると、オブジェクト定義の完全なリストを現行の出力ファイルに送信できます。

IMPORT name FROM EIF FILE file-id [LIST] ONLY

詳細は、EIFBYTESEIFNAMESおよびEIFTYPESオプションを参照してください。

名前のないコンポジットのインポート

SPARSEキーワードを使用してディメンション・リストに変数または他のオブジェクトを定義した場合、Oracle OLAPはSPARSEディメンション・リストに対応する名前のないコンポジットを作成します。定義に名前のないコンポジットがあるオブジェクトをエクスポートまたはインポートすると、そのコンポジットはオブジェクトとともに自動的にエクスポートまたはインポートされます。名前のないコンポジットは通常のワークスペース・オブジェクトではないため、単独でのインポートやエクスポートはできません。

SEGWIDTHで指定された変数セグメント

CHGDFN文でSEGWIDTHキーワードを使用して変数セグメントの長さを指定した場合、セグメント情報は自動的にエクスポートおよびインポートされません。SEGWIDTH設定を維持するには、ワークスペース全体をエクスポートして新しく作成したワークスペースにワークスペース・オブジェクトのみをインポートし、セグメント設定を指定してから変数データを新しいワークスペースにインポートします。

TEXT値とNTEXT値のインポート

TEXT値およびNTEXT値はエクスポートやインポートが可能です。どちらのデータ型も単一のEIFファイルにエクスポートされます。

  • エクスポートされるTEXT値は、EXPORT(EIF)でファイルに指定されているキャラクタ・セットを使用してEIFファイルに格納されます。

  • エクスポートされるNTEXT値は、NTEXT(UTF8 Unicode)としてEIFファイルに格納されます。

  • TEXTオブジェクトにインポートされるNTEXT値は、データベース・キャラクタ・セットに変換されます。その結果、NTEXT値がデータベース・キャラクタ・セットで表せない場合にデータが失われることがあります。

  • NTEXTオブジェクトにインポートされるTEXT値は、NTEXT(UTF8 Unicode)キャラクタ・セットに変換されます。

例10-7 EIFファイルからのディメンションのインポート

この例は、2つの変数の内容およびディメンションを、カレント・ディレクトリ・オブジェクトにあるfinance.eifという名前のディスク・ファイルから現行Oracle OLAPワークスペースにインポートする方法を示します。

IMPORT actual budget FROM EIF FILE 'finance.eif'

例10-8 連結ディメンションのインポート

この例は、現行アナリティック・ワークスペースにすでに存在する連結ディメンションとは異なる定義を持つ連結ディメンションのインポートの結果を示します。DESCRIBE文によって、現行アナリティック・ワークスペースのディメンションおよび変数の定義が次のように返されるとします。

DEFINE city TEXT DIMENSION
DEFINE state TEXT DIMENSION
DEFINE country TEXT DIMENSION
DEFINE locality DIMENSION CONCAT (city, state)
DEFINE geog DIMENSION CONCAT (locality, country)
DEFINE sales INTEGER VARIABLE <geog>

次の文は、salesデータをレポートします。

REPORT sales

この文によって生成される結果は、次のとおりです。

GEOG                SALES
------------------- -----
<city: Boston>       1000
<city: Springfield>  2000
<state: Ma>          3000
<country: Usa>       4000

DESCRIBE文によって、diffconcat.eifファイルのディメンションおよび変数の定義が次のように返されます。

DEFINE CITY TEXT DIMENSION
DEFINE REGION TEXT DIMENSION
DEFINE COUNTRY TEXT DIMENSION
DEFINE GEOG DIMENSION CONCAT (CITY, REGION, COUNTRY)
DEFINE SALES INTEGER VARIABLE <GEOG>

次の文は、diffconcat.eifファイルにある連結ディメンションのエクスポート元であるアナリティック・ワークスペースのディメンション値のsalesデータをレポートします。

REPORT sales

この文によって生成される結果は、次のとおりです。

GEOG               SALES
------------------ -----
<city: Boston>      1111
<city: Worcester>   2222
<region: East>      3333
<country: Usa>      4444

次の文は、diffconcat.eifファイルからsales変数をインポートし、連結ディメンションgeogを暗黙的にインポートします。APPENDキーワードによって、Oracle OLAPは値Worcestercityディメンションに追加します。その後、<city: Boston><city: Worcester>および<country: Usa>に一致するsalesの新しい値がインポートされます。

IMPORT sales FROM EIF FILE diffconcat.eif APPEND

インポート操作の後、SALESの値をレポートすると次の結果が返されます。

GEOG                SALES
------------------- -----
<city: Boston>       1111
<city: Springfield>  2000
<city: Worcester>    2222
<state: Ma>          3000
<country: Usa>       4444

IMPORT (テキスト)

IMPORT(テキストから)コマンドを使用すると、テキスト・ファイルからOracle OLAP Worksheetオブジェクトにデータをコピーできます。ワークシートの各行は、テキスト・ファイルの行と同じです。

IMPORTは、一般に、他のソフトウェア製品からアナリティック・ワークスペースにテキスト・ファイルをコピーするために使用されます。

通常、テキスト・ファイルの場合、IMPORTではなくFILEREAD文を使用します。FILEREADはより効率的で、ワークシート・オブジェクトを必要とせず、各列のデータを別々に処理する必要もありません。

構文

IMPORT worksheetname FROM [TEXT|STRUCTURED|RULED [RULER ruler-exp] -    PRN FILE file-id [STOPAFTER n] [TEXTSTART schar] [TEXTEND echar] -   [DELIMITER dchar] [NLS_CHARSET charset-exp]

パラメータ

worksheetname

Oracle OLAP Worksheetオブジェクトの名前を指定するテキスト式。ワークスペースでworksheetnameを事前定義していない場合、IMPORTがデフォルト・ディメンションWKSCOLおよびWKSROWを使用して自動的にそれを定義します。worksheetnameの前の内容は上書きされます。1つのIMPORT文で、1つのテキスト・ファイルからインポートできるworksheetnameは1つのみです。

FROM . . .PRN

Oracle OLAP Worksheetをテキスト・ファイルからインポートすることを示します。

TEXT

ソース・ファイルをそのまま行単位でOracle OLAP Worksheetにインポートします。ソース・ファイルは、単一の幅の広いワークシート列にTEXTのデータ型でコピーされます。その列は常にワークシートの列1です。ソース・ファイルの各行は、その最初の列の、ソース・ファイルと同じ数の個別の行の各セルにインポートされます。ソース・ファイルの空白行は、ワークシートの最初の列の対応する行でゼロ文字(NULL)のTEXT値になります。(TEXTがデフォルトです。)

STRUCTURED

ソース・ファイルをセル単位でターゲット・ワークシートにインポートし、自動的に次の3つの機能を果します。

  1. ソース・ファイルの文字の各行を、ターゲット・ワークシートの単一行にコピーします。

  2. ソース・ファイルの行の文字の各グループを、ターゲット・ワークシートの同じ行の別々のTEXTセルにコピーします。文字グループは、連続する数列(小数点がついた場合には分離しているとはしない)、および二重引用符で囲まれた文字という2つの条件で定義されます。そのため、3桁を区切るカンマを含む数列は、最初にカンマを削除しないかぎり別々のセルに分割されます。

  3. 二重引用符で囲まれない数字以外の文字は無視されますが、数字の直前のマイナス記号のみは数字とともに同じTEXTセルにコピーされます。(ソース・ファイルでマイナス記号と数字の間に空白がないことを確認してください。)

ソース・ファイルの空白行は、対応するワークシートの行の最初のセルでNAになります。

ファイル形式が前述のパターンに従わない場合、TEXTSTART、TEXTENDおよびDELIMITERキーワードを使用します。これらの引数によって、各フィールドの先頭および末尾を識別するためにIMPORTが使用するデリミタをカスタマイズできます。

RULED

ソース・ファイルを様々なデータ型のワークシート・セルに対して列単位でインポートします。ソース・ファイルのすべての行が、長さも含めてファイルの他のすべての行と同じパターンのデータである必要があります。このデータ・パターンは、Oracle OLAPに対してRULERキーワードを使用して1行のruler-expで記述します。IMPORTはソース・ファイルの各行をループ処理し、その内容をターゲット・ワークシートの行のパターンが同じセルに1行ずつコピーします。ruler-expはソース・ファイルの後続の行をループ処理し、同じパターンのセルからなる複数の列が1行としてターゲット・ワークシートに縦に並べられていきます。20 rows processedから始まるステータス・メッセージが、20行ごとに現行の出力ファイルに送信されます。

文字グループのパターンがそれぞれ異なるレコードがソース・ファイルに含まれる場合、データをインポートするには、それほど厳密さを求められないオプションであるSTRUCTUREDまたはTEXTを使用します。

RULER ruler-exp

ソース・ファイルのレコード・パターンにおけるデータ型、長さおよび各文字グループの繰返し数を指定するために、RULEDキーワードのみとともに使用します。Ruler-expは文字グループ指定のリストです。各文字グループ指定は、カンマ(,)、バックスラッシュN(\n)または空白( )によって区切る必要があります。ソース・ファイルの基本となるレコード・パターン(行パターン)に、すべての文字を明らかにするほど多くの指定を含める必要はなく、RULERは、現行レコードの末尾までの距離にかかわらず、各行で指定がなくなるとすぐに次のレコードに進みます。リテラル・テキストは一重引用符で囲んでください。

文字グループの指定は、TEXTのT、数値(INTEGERまたはDECIMAL)のA、およびスキップまたは無視のSの3タイプあります。これらのタイプの形式を、次の表に示します。

表10-1 IMPORTに対するテキストの文字グループの指定

書式 説明

[mm]Tnn

Oracle OLAPがそれぞれnn文字(バイト)のmm個のグループ(デフォルトは1)をTEXTとしてコピーすることを指定します。0文字グループを指定すると、ワークシートの対応する位置で空のセルになります。各グループは最大498文字です。後続の空白は削除されます。

[mm]Ann

Oracle OLAPがnn文字(バイト)のmm個のグループ(デフォルトは1)をそれぞれコピーし、各グループの数値への変換を試みることを指定します。文字グループが数値に変換できない場合、TEXTセルにコピーされ、後続の空白は削除されます。有効な数値は、NA以外のGET(DECIMAL)ファンクションに指定できる値などです。

ピリオド(小数点)の前の数値に埋め込まれたカンマは無視されます。そのため、カンマによってのみ区切られる複数の数字、または1つのピリオドによってのみ区切られる2つの数字は、単一の数値の一部として扱われます(これらの数字を分離して扱うには、ソース・ファイルで間に空白を挿入します)。先頭のドル記号($)および末尾のパーセント記号(%)は無視され、先頭および末尾の空白は削除されます。複数のピリオドは余分な小数点として扱われて無視されます(それらのピリオドは削除されます)。たとえば、...17...17のフィールドとして扱われます。

1つのハイフンまたはハイフンと空白が先頭にある数値、およびカッコで囲まれた数値は負数として扱われます。0(ゼロ)文字グループを指定すると、ワークシートの対応する位置で空のセルになります。各グループは最大4,000文字です。

[mm]Snn

Oracle OLAPがnn文字(バイト)のmm個のグループをスキップまたは無視することを指定します。nnの制限は32,767です。(mmを使用するのは、通常、非常に長いレコードを処理するためにこの制限を拡張する場合のみです。)

FILE file-id

インポートするファイルを指定します。file-idはファイルの名前を表すテキスト式です。名前はファイル識別子の標準形式である必要があります。

STOPAFTER n

n個以下のレコードがファイルから読み取られることを指定します。STOPAFTERを省略すると、ファイル全体が読み取られます。

TEXTSTART schar

schar引数は、構造化ファイルでOracle OLAPがテキスト・フィールドの先頭として解釈する単一文字を指定するテキスト式です。デフォルト文字は二重引用符(")です。

TEXTEND echar

echar引数は、構造化ファイルでOracle OLAPがテキスト・フィールドの末尾として解釈する単一文字を指定するテキスト式です。デフォルト文字は二重引用符(")です。

DELIMITER dchar

dchar引数は、構造化ファイルでOracle OLAPが標準フィールド・デリミタとして解釈する単一文字を指定するテキスト式です。Oracle OLAPは、標準フィールド・デリミタを使用して数値フィールドおよびテキスト・フィールドを識別します。デフォルト文字はカンマ(,)です。

NLS_CHARSET charset-exp

file-idによって指定されるファイルからテキスト・データをインポートする際にOracle OLAPが使用するキャラクタ・セットを指定しますが、これによって、Oracle OLAPはデータをそのキャラクタ・セットから正確に変換できます。この引数は最後に指定する必要があります。この引数が省略されていて、Oracle OLAPがファイル自体からキャラクタ・セットを決定できない場合、Oracle OLAPは、NLS_LANGオプションに記録されているデータベース・キャラクタ・セットを使用してデータをインポートします。

使用上の注意

WKSROWディメンションとWKSCOLディメンション

Oracle OLAP WorksheetオブジェクトのWKSROW(デフォルトのワークシート行)ディメンションは、テキスト・ファイルの行に対応します。ワークシートのWKSCOL(デフォルトのワークシート列)ディメンションは、ソース・ファイルの各行に複数のデータ型がある場合に、ワークシートの各行を複数のセルに分割してデータ型を分けるために使用します。WKSROWおよびWKSCOLは、123などの値を持つINTEGERディメンションです。

最小ワークシート・サイズ

すべてのセルが使用されるかどうかにかかわらず、Oracle OLAPは縦横63セルの最小サイズのワークシートを設定します。ソース・テキスト・ファイルがこの最小サイズより大きなOracle OLAP Worksheetを必要とする場合、IMPORTは必要に応じて自動的にWKSCOLおよびWKSROWのディメンション値を増やします。

数値のインポート

テキスト・ファイルから数値をインポートする場合、IMPORTはINTEGERデータ型を与えます。

他のコンピュータへのファイル転送

別のコンピュータで作成したファイルをインポートする場合、キャラクタ・セットが適切であることを確認してください。テキスト・ファイルを別のコンピュータに転送する場合、転送を処理する通信プログラムが必要な文字変換(たとえば、ASCIIからEBCDICへの変換)を行います。結果のファイルを受け取るコンピュータに対して正しいキャラクタ・セットになるように、転送プログラムのパラメータを設定します。

例10-9 RULERキーワードを使用しない列のインポート

カレント・ディレクトリにabctxtという名前のファイルがあるとします。そのファイルには、5桁のINTEGER値のグループが10個と20文字のテキストのグループが1個あります。このファイルをsheet1という名前のOracle OLAP Worksheetにインポートするには、次の文を使用します。

IMPORT sheet1 FROM RULED PRN FILE 'abctxt' ruler '10a5, t20'

ファイル名の実際の形式は、オペレーティング・システムの規則に従う必要があります。

例10-10 RULERキーワードを使用する列のインポート

mixという名前のファイルには、行デリミタがなく、それぞれ100文字を含むレコードがあるとします。各レコードの文字配分は、次の表に示すとおりです。

文字 内容

1 - 10

無視

11 - 17

10進数

18 - 28

無視

29 - 30

2つの単一文字コード

31 - 35

整数

36 - 100

無視

このファイルをsheet2という名前のOracle OLAP Worksheetにインポートするには、次の文を使用します。

DEFINE sheet2 WORKSHEET temp
IMPORT sheet2 FROM RULED PRN FILE 'mix' RULER -
   's10, a7, s11, 2t1, a5' 

IMPORT (スプレッドシート)

IMPORT(スプレッドシートから)コマンドを使用すると、スプレッドシート・ファイルからOracle OLAP Worksheetオブジェクトにデータ(計算式ではない)をコピーできます。ワークシートのディメンションは、スプレッドシートの列および行と同じです。IMPORTは、常にスプレッドシート・ファイル全体を一度にコピーします。

IMPORTは、一般に、他のソフトウェア製品(たとえばLotusスプレッドシート)からOracle OLAPワークスペースにデータをコピーするために使用されます。

構文

IMPORT worksheetname FROM source [INTO workspace]

ここで、sourceは、次のいずれかです。

  • WKS FILE file-id [NLS_CHARSET charset-exp]
  • WK1 FILE file-id [NLS_CHARSET charset-exp]
  • WRK FILE file-id [NLS_CHARSET charset-exp]
  • WR1 FILE file-id [NLS_CHARSET charset-exp]
  • DIF FILE file-id [NLS_CHARSET charset-exp]
  • CSV FILE file-id [STOPAFTER n|DELIMITER dchar|NLS_CHARSET charset-exp]

パラメータ

worksheetname

Oracle OLAP Worksheetオブジェクト。1つのIMPORT文で、1つのスプレッドシート・ファイルからインポートできるworksheetnameは1つのみです。ワークシートに修飾オブジェクト名を指定できますが、INTO worksheet引数を指定する場合、指定するターゲット・ワークスペースは同一である必要があります。ワークシート・オブジェクトがインポートされる場所については、INTO workspace引数を参照してください。

FROM WKS
FROM WK1
FROM WRK
FROM WR1
FROM DIF

Oracle OLAP Worksheetを1-2-3ファイルのバージョン1(WKS)またはバージョン2(WK1)、Symphonyファイルのバージョン1.0(WRK)またはバージョン1.1(WR1)、あるいはデータ交換フォーマット・ファイル(DIF)にインポートすることを示します。

Oracle OLAPは、DIFファイルのE形式(指数表現)の数値を認識しません。

INTO workspace

データのインポート先となるアタッチされたアナリティック・ワークスペースの名前。指定されたワークスペースにworksheetnameが存在する場合、そのデータはインポートされるデータによって上書きされます。worksheetnameが存在しない場合、IMPORTは指定されたワークスペースにそれを作成します。他のアタッチされたワークスペースに同じ名前のワークシートが存在する場合は無視されます。

この引数を指定しない場合は、次のように処理されます。

  • アタッチされたワークスペースでworksheetnameを事前定義していない場合、IMPORTがデフォルト・ディメンションWKSCOLおよびWKSROWを使用して、現行のワークスペースに自動的に定義します。

  • いずれかのアタッチされたワークスペースにworksheetnameがすでに存在する場合、IMPORTはそこに含まれるデータをインポートされるデータによって上書きします。

FILE file-id

インポートするファイルを指定します。file-id引数はファイルの名前を表すテキスト式です。名前はファイル識別子の標準形式である必要があります。

NLS_CHARSET charset-exp

file-idによって指定されるファイルからテキスト・データをインポートする際にOracle OLAPが使用するキャラクタ・セットを指定しますが、これによって、Oracle OLAPはデータをそのキャラクタ・セットから正確に変換できます。この引数は最後に指定する必要があります。この引数が省略されていて、Oracle OLAPがワークシート自体からキャラクタ・セットを決定できない場合、Oracle OLAPは、NLS_LANGオプションに記録されているデータベース・キャラクタ・セットを使用してデータをインポートします。

注意:

NTEXTデータ型は、ワークシートでサポートされていません。

FROM CSV FILE file-id [STOPAFTER n] [DELIMITER dchar]

ソース・ファイルからセル単位でインポートすることを示します。CSVのインポートを参照してください。

STOPAFTER nは、n個以下のレコードがファイルから読み取られることを指定します。STOPAFTERを省略すると、ファイル全体が読み取られます。

DELIMITER dcharは、Oracle OLAPが標準フィールド・デリミタとして解釈する単一の文字(dchar)を指定します。デフォルト値はカンマです。

使用上の注意

Oracle OLAP Worksheetオブジェクトのデフォルト・ディメンション

Oracle OLAP Worksheetのデフォルト・ディメンションは、スプレッドシートの列および行に対応するWKSCOLおよびWKSROWです。WKSCOLおよびWKSROWは、1、2、3などの値を持つINTEGERディメンションです。これらのディメンションがアタッチされたワークスペースにすでに存在するが、現行のワークスペースに存在しない場合、IMPORT文はこれらのディメンションを作成しようとする際に失敗します。この問題を回避するには、最初にワークシートを異なるディメンションで定義します。(詳細は、ワークシート・ディメンションを参照してください。)

必要に応じたセルの追加

ワークシートのディメンションによって定義されているより多くのセルがソース・スプレッドシートに含まれる場合、IMPORTは自動的にディメンション値を追加して必要数のセルを用意します。

空のセルとNAのセル

IMPORTは、ソース・ファイルをワークシートにセル単位でマージします。ソース・ファイルの空ではないセルは、NA値である場合も含めて、ワークシートの対応するセルの内容を上書きしますが、ソース・ファイルの空のセルは、ワークシートを上書きせず、現行ワークシートの末尾を超えるソース・ファイルのセルはワークシートに追加されるので、データが廃棄されることはありません。

DIFファイルの数値

DIFファイルから数値をインポートする場合、IMPORTはDECIMALデータ型を与えます。

CSVのインポート

CSVのインポート・オプションは、ソース・ファイルからワークシートのセルにインポートする際に、自動的に次の機能を実行します。

  • ソース・ファイルの文字が含まれる各行を、ターゲット・ワークシートの単一行にコピーします。

  • ソース・ファイルの行にあるそれぞれの文字グループを、ターゲット・ワークシートの行の別々のTEXTセルにコピーします。グループはデリミタ文字で区切られます。

文字グループが二重引用符で囲まれている場合、次のように処理されます。

  • グループ内にあるデリミタ文字はリテラルとして扱われます。

  • グループ内に二重引用符が含まれる場合、その後にさらに二重引用符を付ける必要があります。

  • グループ内にある改行(\n)は無視されます。

  • 開始引用符の前および終了引用符の後にある空白またはタブは無視されます。

例10-11 DIFファイルのインポート

この例は、DIF形式のスプレッドシートをmortgage.difという名前のファイルにインポートする方法を示します。メモリーおよび記憶領域を節約するために、最初に一時オブジェクトとしてワークシートを定義します。ワークシートsheet1が存在しない場合、IMPORTが自動的に定義します。このワークシートが前のIMPORT文で使用されていた場合、そのデータは新しいデータによって上書きされます。

DEFINE sheet1 WORKSHEET TEMP
IMPORT sheet1 FROM DIF FILE 'mortgage.dif' 

INFILE

INFILEコマンドによって、Oracle OLAPは指定されたファイルから文入力を読み取ります。

構文

INFILE {file-id|EOF} [NOW] [NLS_CHARSET charset-exp

パラメータ

file-id

入力の読取り元のファイルの名前。file-idはファイルの名前を表すテキスト式です。名前はファイル識別子の標準形式である必要があります。

入力ファイルには、OLAP DML文と、その文によって生成されるプロンプトに対応する応答のみが含まれる必要があります。各文または各応答は、ファイルで別々の行にある必要があります。

EOF

現行ファイルからの入力の読取りを終了し、INFILE文の実行元の場所から入力の読取りをOracle OLAPが再開します。INFILE EOFの使用はオプションです。入力ファイルについておよびNOWとEOFの両方を指定したINFILEを参照してください。

NOW

Oracle OLAPが、INFILEを含むプログラムが終了するまで待機せずにINFILEが見つかるとすぐに、INFILEで指定される入力ファイルを開いて文を読み取ることを示しますが、これには、プログラム内で入力ファイルの文をネストする効果があります。NOWとEOFの両方を指定したINFILEを参照してください。この引数はfile-idの後に指定する必要があります。

NLS_CHARSET charset-exp

file-idによって指定されるファイルからデータを読み取る際にOracle OLAPが使用するキャラクタ・セットを指定しますが、これによって、NLS_LANGオプションによる指定の場合と同様に、Oracle OLAPはデータを現行キャラクタ・セットに正確に変換できます。この引数はfile-idの後に指定する必要があります。この引数を省略すると、Oracle OLAPでは、ファイルのデータは、NLS_LANGオプションに記録されているデータベース・キャラクタ・セットを持つものとして処理されます。

使用上の注意

入力ファイルについて

入力ファイルの末尾に達すると、Oracle OLAPはINFILE文の実行元の場所から入力の読取りを再開します(これは別の入力ファイルの場合もあります)。文INFILE EOFによって入力ファイルを終了する必要はありません。

INFILEは、行の最後にある末尾の空白、および行の最後のテキストと継続マークの間の空白を無視します。さらに、INFILEは空白行を無視します。

NOWキーワードを使用している場合に、入力ファイルが継続文で終了すると、その文は無視されます。たとえば、ファイルが「show -」で終了すると、Oracle OLAPはSHOW文を無視します。

プログラムでのINFILEの使用

NOWキーワードを付けずにINFILE文をプログラムに含めた場合、プログラムが実行を終了するまでINFILE文は実行されません。ネストしたプログラムでは、関連のすべてのプログラムが実行を終了するまではこれが実行されません。また、複数のINFILEコマンドが1つのプログラムによって実行される場合、入力ファイルは指定された順番とは逆に読み取られます。

たとえば、program.aprogram.cをコールするprogram.bをコールし、各プログラムには2つのINFILEコマンドが含まれ、1つは次のプログラムのコールの前、もう1つはそのコールの後にあるとします(次のコードを参照)。この場合、実行順序はa2b2c2c1b1a1になります。

program.a
   INFILE a1
   "
        program.b
           INFILE b1
           "
                program.c
                   INFILE c1
                   INFILE c2
           "
           INFILE b2
   "
   INFILE a2

NOWキーワードを付けてINFILE文をプログラムに含めた場合、INFILE文は即座に実行されます。ただし、NOWキーワードを付けたINFILEには、プログラム・スタックに通常よりも大きな領域が必要です。スタック領域を節約するために、必要な場合にのみNOWキーワードを使用してください。

プログラム以外でのNOWを指定したINFILE

NOWキーワードはプログラム内での使用を想定していますが、他の場合も使用できます。入力ファイルが通常で遅延されていない場合にNOWキーワードを使用しても目立った効果はありません。NOWには余分なスタック領域が必要なので、このような場合は使用しないでください。

NOWとEOFの両方を指定したINFILE

NOWとEOFの両方のキーワードを使用した場合、NOWキーワードは無視されます。

ファイル入力された文および応答の表示

ディスク・ファイルからの文を実行に伴ってデバッグ・ファイルにコピーするには、DBGOUTFILEコマンドを参照してください。

例10-12 入力ファイルの即座の読取り

プログラム内の次の行によって、newdefsという名前のファイルが即座に読み取られます。

INFILE 'newdefs' NOW 

LD

LDコマンドは、現行オブジェクト定義に説明を追加するコマンドです。説明は、オブジェクトを説明するために指定するテキストで構成されます。任意の定義に説明を割り当てることができます。

ヒント:

現行オブジェクト定義は、最も新しく定義したオブジェクト、または現行セッションで検討しているオブジェクトの定義です。オブジェクト定義を現行定義にするには、CONSIDER文を使用します。

構文

LD [text]

パラメータ

text

定義に割り当てる説明のテキスト。textを省略した場合、現行定義の既存の説明が削除されます。

継続文字としてハイフンを使用することによって、複数行の説明を作成できます。ただし、LD文で空白行を先頭にして説明を作成することはできません。

例10-13 変数の定義への説明の追加

この例では、変数unitsに関連付けられている説明を変更します。最初に、CONSIDER文を実行してunitsを現行定義にします。次に、LD文を使用して新しい説明を割り当てます。units変数の定義は、次のとおりです。

DEFINE units VARIABLE INTEGER <month product district>
LD Actual Unit Shipments

次の文により

CONSIDER units
ld Actual Unit Shipments for Each Division
DESCRIBE units

この文によって、次のようなunitsの定義が生成されます。

DEFINE units VARIABLE INTEGER <month product district>
LD Actual Unit Shipments for Each Division

LIMITコマンド

LIMITコマンドでは、ディメンションおよびそのディメンション・サロゲートの現行のステータス・リストを設定し、値セットに値を代入します。LIMITは、ディメンションのデータの範囲を一時的に制限することで、作業するデータ値を制限するために使用します。LIMITを使用すると、ディメンションの現行のステータス・リストを作成します。ディメンションの現行のステータス・リストとは、そのディメンションで現在アクセス可能な値を順序付けしたリストです。ディメンションの現行のステータス・リストに存在する値は、「ステータスにある」と言われます。ディメンション・ステータスの詳細およびアナリティック・ワークスペースのデータで作業する際のステータスの重要性の詳細は、OLAP DML処理対象のデータセットの指定方法を参照してください。

ヒント:

コンポジット、結合ディメンション、連結ディメンション、またはパーティション・テンプレートの1つ以上のベース・ディメンションの現行のステータス・リストの設定を、そのオブジェクトに対して選択された値に基づいて行います(LIMIT BASEDIMSを参照)。

構文

LIMIT {dimension | valueset } [concat-component] limit-type [limit-clause] [IFNONE label]

limit-typeは、Oracle OLAPによる現行のステータス・リストの変更方法を指定する、次のキーワードのいずれかになります。

  • TO
  • ADD
  • INSERT [FIRST|LAST|BEFORE position|AFTER position]
  • KEE
  • REMOVE
  • KEEP REORDER
  • COMPLEMENT
  • SORT [NAFIRST]

パラメータ

dimension

ステータスが設定されるディメンションまたはディメンション・サロゲートの名前。

valueset

値が代入される値セットの名前。

concat-component

制限に使用する値の連結ディメンションのコンポーネントの名前を指定します。concat-componentに値を指定すると、指定した連結ディメンションのステータスが、その連結ディメンションのコンポーネントであるdimensionの値で制限されます。このlimit-clauseは、dimensionが連結ディメンションの場合にのみ適用されます。連結ディメンションのステータスとそのコンポーネントのディメンションのステータスは、共有されません。連結ディメンションのステータスを設定する際に、コンポーネントのディメンションをlimit-clauseとして使用した後、そのディメンションのステータスを変更した場合、連結ディメンションのステータスは変更されません。

TO

ディメンションのステータスまたは値セットのステータスを、limit-clause 引数で指定した値で置換しますTOキーワードの値は、LIMIT文に指定する順序またはvaluelist引数によって暗黙的に指定される順序で、ディメンションのデフォルト・ステータスから選択されます。順序を暗黙的に指定する引数を使用した場合、値の順序はデフォルト・ステータス内における値の位置に基づきます。

ADD

ステータスに存在していない値をlimit-clause 引数で指定して追加することによって、ディメンションのステータスまたは値セットのステータスを拡張します。ADDキーワードの値は、LIMIT文に指定する順序またはvaluelist引数によって暗黙的に指定される順序で、ディメンションのデフォルト・ステータスから選択されます。順序を暗黙的に指定する引数を使用した場合、値の順序はデフォルト・ステータス内における値の位置に基づきます。ADDによって、一意のディメンション値は、現行のステータス・リストまたは値セット・リストの後に指定された順序で追加されます。

INSERT

現行のステータス内の指定した位置に値をlimit-clause 引数で指定して挿入することによって、ディメンションまたは値セットのステータスを拡張します。INSERTキーワードの値は、LIMIT文に指定する順序またはvaluelist 引数によって暗黙的に指定される順序で、ディメンションのデフォルト・ステータスから選択されます。

順序を暗黙的に指定する引数(value1 TO value2など)を使用した場合、値の順序はデフォルト・ステータス内における値の位置に基づきます。INSERTは、現行のステータス内の指定された位置に値を追加します。追加する値がすでにステータスにある場合は、その値は現行のステータスにある位置から削除され、値リストにある順序で追加されるので、追加する値の順序は維持されます。

FIRST

ステータスにある最初の値の前に新しい値を挿入します。

LAST

ステータスにある最後の値の後に新しい値を挿入します。

BEFORE
AFTER

新しい値を現行のステータス内のpositionの前または後に挿入することを指定します。

position

現行のステータス内のディメンション値、現行のステータス内のディメンション値を値とする文字式、またはデフォルト・ステータス内のディメンション値の位置を表すINTEGER式。

KEEP

limit-clause 引数で指定した値のみを維持したまま、ディメンションのステータスまたは値セットのステータスを削減しますOracle OLAPでは、値の選択は、現行のディメンション・ステータスに基づいて行われます。KEEPによってステータス内に残される値は、現行の値順序で維持されます。

KEEP REORDER

KEEPと同様、KEEP REORDERはlimit-clause 引数で指定した値のみを維持したまま、ディメンションのステータスまたは値セットのステータスを削減しますOracle OLAPでは、値の選択は、現行のディメンション・ステータスに基づいて行われます。ただしKEEP REORDERでは、現行のステータスの順序ではなく、選択した引数(つまりlimit-clause 引数)の順序で結果が並び替えられます。

REMOVE

limit-clause 引数で指定した値を削除して、ディメンションのステータスまたは値セットのステータスを削減しますOracle OLAPでは、値の選択は、現行のディメンション・ステータスに基づいて行われます。KEEPによってステータス内に残される値は、現行の値順序で維持されます。

COMPLEMENT

ディメンションのステータスまたは値セットのステータスを、limit-clause 引数で指定していない値で置換しますCOMPLEMENTの後に引数を指定しない場合、ステータスは、現在ステータスに存在しないすべての値で置き換えられます。Oracle OLAPでは、値の選択は、現行のディメンション・ステータスに基づいて行われます。COMPLEMENTでは、ディメンション値はデフォルトの順序のまま維持されます。(省略形はCOMP)

SORT

limit-clause 引数に基づいてディメンションの値または値セットの値をソートしますLIMITでは、limit-clause 引数に基づいた一時的な値リストを作成し、このリストを使用して現行のステータス・リストをソートします。一時リスト内に存在しない値はすべて現行のステータス・リストの最後に移動されます。

NAFIRST

NA値が、ソートされたリストの最後でなく最初に配置されます。

limit-clause

制限に使用する値を指定します。この構文は複雑なため、次のトピックに分けて説明します。

IFNONE

(OLAP DMLプログラム内でのみ使用)要求されたステータスが、NULLステータスであるか、NULLステータスの関連ディメンション(つまり、値のない関連ディメンション)に基づく場合、プログラムの実行をlabelに分岐することを指定します いずれの場合も、プログラムの実行が分岐すると、NULLステータスは適用されません。かわりに、LIMIT文が実行される前の元のステータスが維持されます。これは、OKNULLSTATUSがYESの場合も同様です。1つのOLAP DMLプログラム内で、同じ文にIFNONEおよびNULLの両方は使用できません。

label

ラベルの構成のガイドラインに従って構成された、プログラム中の他の位置にあるラベルの名前。プログラムの実行は、指定したラベルの直後の行に分岐します。

IFNONEで指定するlabelの後にはコロンを付けないでください。ただし、プログラムの他の位置にある実際のラベルの後にはコロンを付けます。

使用上の注意

連結ディメンションの値の指定

一意でない連結ディメンションの値を指定するには、次の構文を使用します。

<base-dimension: value>.

デフォルトのステータス・リスト

アナリティック・ワークスペースを最初にアタッチする場合、各ディメンションの現行のステータス・リストは、値が格納されている順で読取り権限を持つディメンションのすべての値によって構成されます。この値のリストは、ディメンションのデフォルトのステータス・リストと呼ばれています。

一意の値

LIMITでは、ディメンションの一意の値のみが選択されます。値がLIMIT文内に2回以上指定されている場合、その値は、最初に指定された位置でステータスに配置されます。たとえば、次の行

LIMIT time TO 'Jan97', 'Feb97', 'Jan97'
STATUS time

によって、次の出力が生成されます。

The current status of TIME is:
JAN97, FEB97 

存在しない値

Oracle OLAPでは、存在しない値を明示的にリストしないかぎり、値を持たないディメンションや値セットのステータスを設定しようとした場合、エラーは表示されません。たとえば、新しく定義したディメンションWEEKに値を何も追加しなかったとします。この場合、文LIMIT week TO FIRST 10を実行してもエラーになりません。しかし、LIMIT week TO 'Pete'の場合は、Peteが値ではないため、エラーになります。同様に、LIMIT week TO 20の場合も、weekには位置20に値がないため、エラーになります。

ディメンションまたは値セットのステータスのNULLへの設定

Oracle OLAPでは、NULLステータスを許可することを明示的に指定した場合にのみ、ディメンションまたは値セットのステータスをNULL(空のステータス)に設定できます。これを許可するには、次の2つの方法があります。

  • OKNULLSTATUSオプションをYESに設定する。この指定は、(LIMIT文にIFNONE引数が存在しないかぎり)常にNULLステータスを許可することを示します。

  • LIMIT文でNULLキーワードを使用して、特定のディメンションまたは値セットのステータスをNULLに設定する。TO NULLまたはKEEP NULLを指定することで、これを実行できます。この指定は、このLIMIT文についてのみNULLステータスを許可することを示します。

これらのいずれの方法でもNULLステータスを許可していない状態で、結果としてNULLステータスとなるLIMIT文を実行しても、Oracle OLAPでは、文の実行時にステータスはNULLに変更されません。かわりに、Oracle OLAPでは、ステータスは文の実行前のステータスのまま維持され、エラーが表示されるか(IFNONEが存在しない場合)、IFNONEラベルへの分岐が実行されます(IFNONEが存在する場合)。

IFNONE引数は、ディメンションのステータスがNULLに設定された場合、プログラムの実行が通常どおりに処理されないことを示します。したがって、IFNONEが存在すると、OKNULLSTATUSがYESの場合でもIFNONEラベルへの分岐が実行され、ステータスはNULLに設定されません。NULLキーワードとIFNONEがどちらも存在する場合、Oracle OLAPでは、エラーによって非一貫性が通知されます。

IFNONEでは、非構造化プログラミング技術の使用が必須です。現在、Oracle OLAPでは、それにかわる別の構造化技術を提供しているため、IFNONEの使用は推奨されていません。IFNONEは、Oracle OLAPの以前のリリースとの互換性のために残された機能です。

結合の制限

結合ディメンションを値リストに制限するには、次の構成を使用します。

  • 実際の値を指定し、値の各組合せを山カッコで囲みます。

    LIMIT proddist TO '<Tents, Boston>' -
       '<Footwear, Denver>'
  • その値の変数名を使用し、その組合せを山カッコで囲みます。

    prodname = 'Canoes'
    distname = 'Seattle'
    LIMIT proddist To <prodname, distname>
    
  • 各行の組合せを山カッコで囲んだ複数行のリストを作成します。

    namelist = '<Tents Boston>\n<Footwear, -
       Denver>\n <Canoes, Seattle>'
    LIMIT proddist TO namelist
  • 結合ディメンションとそのベース・ディメンションの間の暗黙的なリレーションを使用して、結合ディメンションを制限します。たとえば、次の文を使用すると、PRODDISTが、ベース値の1つとしてCanoesを持つすべての結合値に制限されます。

    LIMIT proddist TO product 'Canoes'

    注意:

    結合ディメンションのベース・ディメンション値には論理位置番号が使用できます。論理位置番号の使用は、例7-125を参照してください。

連結ベース・ディメンションを持つ結合ディメンションを制限する方法の例は、例10-25を参照してください。

連結の制限

単純なディメンション、結合ディメンションおよび他の連結ディメンションを連結のベース・ディメンションとして使用して、連結ディメンションを定義できます。連結ディメンションをその値の1つに制限するための構文は、次のとおりです。

LIMIT concatdim TO <base-dim: value>

たとえば、連結ディメンションreg.dist.ccdimが、そのベース・ディメンションとして単純なディメンションregiondistrictを持つとします。次の文によって、reg.dist.ccdimのステータスはregion: Eastdistrict: Atlantaの2つの値に設定されます。

LIMIT reg.dist.ccdim TO <region: 'East'> <district: 'Atlanta'>

連結ディメンションのステータスを設定する他の方法は、例10-16を参照してください。

IFNONEラベルを使用した分岐の代替処理

IFNONEラベルへ分岐するかわりに、OKNULLSTATUSオプションを使用してディメンションのNULLステータスを処理することもできます。OKNULLSTATUSをYESに設定すると、ディメンションのステータスをNULLへ設定できるようになります。その後、NULLステータスを確認してからIF...THEN...ELSEコマンド文で適切なコマンドを実行するか、SWITCHコマンド文のケースの1つとしてNULLステータスを処理できます。

OKNULLSTATUS = YES
LIMIT month TO sales GT salesnum
IF STATLEN(month) LT 1
   THEN GOTO showerr

例10-14 値の追加と削除

次の行によって、monthディメンションのステータスに値を追加します。

LIMIT month TO 'Jan96' TO 'Jun96'
LIMIT month ADD 'Jul96' 'Sep96'

STATUS month文を発行すると、次の出力が生成されます。

The current status of MONTH is:
Jan96 TO Jul96, Sep96

次の行によって、monthディメンションのステータスから値を削除します。

LIMIT month REMOVE 'Jan96' TO 'Mar96'

STATUS month文を発行すると、次の出力が生成されます。

The current status of MONTH is:
Apr96 TO Jul96, Sep96

例10-15 ディメンション・サロゲートを使用した制限

ディメンションとそのディメンション・サロゲートは、同じステータスを共有します。

たとえば、store_idというNUMBERディメンションがあり、このディメンションには値 25410150205310および10があるとします。また、このディメンションは、store_idのINTEGERディメンション・サロゲートstoreposも使用します。ディメンション・サロゲートstoreposには値12345および6があります。store_idのTEXTディメンション・サロゲートはstorenameです。このディメンション・サロゲートには、テキスト値Raoul's - BostonPoldy's PotpourriMolly's EmporiumRaoul's - AtlantaKinch's Kitchen SuppliesおよびRaoul's - Chicagoがあります。次のすべての文は等価です。

LIMIT store_id TO 25 410 150
LIMIT store_id TO storepos 1 2 3
LIMIT storepos TO 1 TO 3
LIMIT storepos TO first 3
LIMIT storename TO first 3
LIMIT storename TO 'Raoul\'s - Boston' TO 'Molly\'s Emporium'
LIMIT store_id TO storename storepos 1 2 3
LIMIT storename TO store_id 25 TO 150

次の文では、store_idのTEXTディメンション・サロゲートであるstorenameを制限することで、store_idディメンションのステータスを設定し、store_idの値をレポートします。

LIMIT storename TO 'Raoul\'s Sweets' TO 'Henry\'s Flowers'
REPORT store_id

この文によって生成される出力は、次のとおりです。

STORE_ID
--------------
10
20
30

例10-16 連結ディメンションの制限

次の例では、連結ディメンションreg.dist.ccdimが、そのベース・ディメンションとして単純なディメンションregiondistrictを持つとします。連結ディメンションとコンポーネントの各ディメンションとの間には暗黙的なリレーションが存在します。

  • 次の文では、関連ディメンションの構文を使用し、コンポーネントの(関連)ディメンションの位置を指定して、連結ディメンションのステータスを設定します。

    LIMIT reg.dist.ccdim TO district 1, 4, 5
    

    STATUS reg.dist.ccdim文を発行すると、次の出力が生成されます。

    The current status of REG.DIST.CCDIM is:
    <DISTRICT: BOSTON>, <DISTRICT: DALLAS>, <DISTRICT: DENVER>
    
  • 次の文では、連結ディメンションを直接、連結ディメンションの位置で指定した値に制限します。

    LIMIT reg.dist.ccdim TO 1, 4, 5
    

    STATUS reg.dist.ccdim文を発行すると、次の出力が生成されます。

    The current status of REG.DIST.CCDIM is:
    <REGION: EAST>, <DISTRICT: BOSTON>, <DISTRICT: ATLANTA>
    
  • 次の文では、まずdistrictのステータスを設定してから、reg.dist.ccdimdistrictのステータスに制限します。

    LIMIT district TO LAST 3
    LIMIT reg.dist.ccdim TO district
    

    REPORT reg.dist.ccdim文を発行すると、次の出力が生成されます。

    REG.DIST.CCDIM
    ----------------------
    <district: Dallas>
    <district: Denver>
    <district: Seattle>
    
  • 次の文では、limit-clause引数は連結ディメンションの値のリストです。

    LIMIT reg.dist.ccdim TO <region: 'East'> <district:  'Boston'> <district: 'Atlanta'>
    
  • 次の文では、reg.dist.ccdimの値セットを定義して、値セットに連結ディメンションの現行のステータスを格納し、連結のステータスをALLにリセットしてから、連結を値セットに制限して、ステータスにある連結の値をレポートします。

    DEFINE regdist.vset VALUESET reg.dist.ccdim
    LIMIT regdist.vset TO reg.dist.ccdim
    LIMIT reg.dist.ccdim TO ALL
    LIMIT reg.dist.ccdim TO regdist.vset
    RPR W 22 reg.dist.ccdim
    

    この文によって生成される結果は、次のとおりです。

    REG.DIST.CCDIM
    ----------------------
    <region: East>
    <district: Boston>
    <district: Atlanta>
    

連結ディメンションを、そのコンポーネントのディメンションの値セットを使用して制限することもできます。

  • 複数のコンポーネントのディメンションに同一の値が含まれている場合、連結ディメンションをそれらの値に制限するにはブール式を使用します。districtregionの両方のディメンションに値New Yorkが存在する場合、reg.dist.ccdimをこれらの値に制限するには次の文を使用します。

    LIMIT reg.dist.ccdim TO BASEVAL(reg.dist.ccdim) EQ 'New York'
    
  • 次の例では、連結ディメンションgeogが、そのベース・ディメンションとして単純なディメンションregionと結合ディメンションcityandstateを持つとします。次の文で、結合ベース・ディメンションを制限して連結ディメンションのステータスを設定します。

    LIMIT geog TO cityandstate <'Princeton' 'New Jersey'> -
       <'Patterson' 'New Jersey'>
    

    STATUS geog文を発行すると、次の出力が生成されます。

    The current status of GEOG is:
    <CITYANDSTATE: <PRINCETON, NEW JERSEY>, <CITYANDSTATE: <PATTERSON, NEW JERSEY>>
    
  • 次の文では、結合ディメンションのベース・ディメンションの値を指定することで結合ベース・ディメンションを制限し、連結ディメンションのステータスを設定します。

    LIMIT geog TO cityandstate city 'Princeton'
    RPR W 30 geog
    

    この文によって生成される出力は、次のとおりです。

    GEOG
    ------------------------------
    <cityandstate: <Princeton, New Jersey>>
    <cityandstate: <Princeton, Indiana>>

例10-17 ワークシートを使用した制限

この例では、ディメンションをワークシートの列に含まれる値に制限する方法を示します。ここでは、ディメンションmonthをワークシートworkitemの最初の列に含まれている値に制限します。次の文によって、その下に示されているworkitemレポートが生成されます。

LIMIT month TO ALL
LIMIT wkscol TO 1
LIMIT wksrow TO workitem NE NA
REPORT workitem
               -WORKITEM-
               --WKSCOL--
WKSROW             1
-------------- ----------
             1 Jan96
             2 Feb96
             3 Mar96
             4 Apr96
             5 May96
             6 Jun96
             7 Jul96
             8 Aug96
             9 Sep96
            10 Oct96
            11 Nov96
            12 Dec96

次の文で、monthディメンションをworkitemの最初の列にリストされている値に制限します。

LIMIT month TO CHARLIST(workitem)

STATUS month文を発行すると、次の出力が生成されます。

The current status of MONTH is:
Jan96 TO Dec96

例10-18 LIMITでのアンパサンド置換の使用

product.rptというプログラムで、正確に2つの製品を指定する必要があるとします。この場合、2つのdimension-value引数を宣言してそれらを処理することも可能です。しかし、LIMITコマンドを使用して任意の数の製品を指定する場合は、単一の引数でアンパサンド置換を使用します。

プログラム内で次のコマンドを使用するとします。

ARGUMENT natext TEXT
ARGUMENT widthamt INTEGER
ARGUMENT rptprod TEXT
    ...
LIMIT product TO &rptprod

プログラムを実行して、レポートに最初の3つの製品を表示するように指定します。

CALL product.rpt ('Missing' 8 'first 3')

first 3をスペースで区切られた2つの別個の引数ではなく、単一の引数として扱うように指定するには、一重引用符で囲むことが必要です。アンパサンドによって、LIMITコマンドは'first 3'を、ディメンション値ではなくキーワード式として解釈します。

例10-19 NULLステータスの場合の分岐

売上数量が500を超える製品のみを含めるように、プログラムでproductディメンションのステータスを設定または絞込みするとします。IFNONEキーワードを使用して、売上数量が500を超える製品がない場合はプログラムの実行をnovalsラベルへ分岐するように指定します。

LIMIT product KEEP units GT 500 IFNONE novals

novalsラベルに続くコマンドで、売上数量が500を超える製品がないという特別な状況に対処できます。

LIMITコマンド(値を使用)

LIMITコマンドで値の制限句を使用すると、値が値セットに代入されるか、単一のディメンションまたは複数のディメンション・サロゲートの現行のステータス・リストが次のように設定されます。

  • 指定した単一の値または複数の値。値は次のいずれかです。

    • カンマで区切られたリテラル値として表現されたディメンション値、または各行がディメンション値である複数行のテキスト式

    • value1 TO value2で表現されたディメンション値の範囲

    • カンマ区切りのINTEGER値で表現された、ディメンション値の論理位置を表すINTEGER値

    • value1 TO value2で表現された、ディメンション値の論理位置を表すINTEGER値の範囲

    • 値セット。

  • ブール式がTRUEである値

  • ある基準に基づいた最上位または最下位のディメンション値

  • 式で表された基準に基づいた割合による最上位または最下位のディメンション値

構文

LIMIT {dimension | valueset} [concat-component] limit-type -

     {inclusive-val-args....| exclusive-val-args} [IFNONE label]

ここで

  • inclusive-val-argsは、次のいずれか1つ以上で構成されます。

    •      intvaluelist 
    •      text-expression
    •      value1 TO value2
    •      valuelist
    •      valueset
  • exclusive-val-argsは、次のいずれか1つです。

    •      ALL
    •      boolean-expression
    •      {BOTTOM|TOP} BASEDON expression
    •      {BOTTOM|TOP} n-percent PERCENTOF expression
    •      {FIRST|LAST} n
    •      NTH {n |n TO n}...
    •      LONGLIST
    •      LONGLIST
    • SESSION
    • STATUS
    •      NULL

パラメータ

dimension

ステータスが設定されるディメンションまたはディメンション・サロゲートの名前。

valueset

値が代入される値セットの名前。

concat-component

制限の決定に使用する値の連結ディメンションのコンポーネントの名前。(この引数の詳細な説明は、LIMITコマンドを参照してください。)

limit-type

Oracle OLAPによる現行のステータス・リストの変更方法を指定するキーワード。(これらのキーワードのリストおよび説明は、LIMITコマンドを参照してください。)

intvaluelist

1つ以上のINTEGER値のリスト、または数値を保持する単一セル変数の名前のリスト。各値はカンマ(,)で区切ります。小数桁のある数値(SHORTDECIMAL値またはDECIMAL値)は、ディメンション値として使用される前に自動でINTEGER値に切り捨てられます。INTEGERは、ディメンション値全体における論理位置によってディメンション値を指定します。NUMBERディメンションの値はINTEGER位置では指定できません。NUMBERディメンションの値がINTEGER値の場合は、intvalue1intvalue2などにディメンション値を指定することでディメンションのステータスを設定できます。

text-expression

各行がディメンションの値である複数行のテキスト式。

value1 TO value2

ディメンション値の範囲を指定しますが、ここで、value1およびvalue2は、INTEGER値またはディメンション値のいずれかです。範囲は、昇順(1から10までなど)または降順(10から1までなど)のどちらでも指定できます。INTEGER値を指定すると、その値がディメンションのデフォルトのステータス・リストにおける値の論理位置となります。ディメンション値を指定すると、コマンドによってその値がディメンションのデフォルトのステータス・リストにおける値の論理位置に変換されます。これに従って、ディメンションまたは値セットの現行のステータスが割り当てられます。

ヒント:

NUMBERディメンションの値は、INTEGER位置で指定できません。かわりに、NUMBERディメンションのINTEGERディメンション・サロゲートを定義して、サロゲートの位置でディメンションを制限します。

valuelist

ディメンションの1つ以上の値のリスト。ディメンション値は、有効なディメンション値のテキスト式として指定できます。NUMBERディメンションの場合は、ディメンション値は数値です。DAY、WEEK、MONTH、QUARTER、YEAR型のディメンションの場合は、ディメンション値はDATE式として指定できます。

valueset

ステータスを設定するディメンションの値を含む保存済のリストであるアナリティック・ワークスペースの値セット・オブジェクト。ディメンション・サロゲートに対して値セットは定義できないため、ディメンション・サロゲートのステータスを設定する場合、値セットは指定できません。ただし、ディメンションを値セットで制限すると、そのディメンションのディメンション・サロゲートも自動で同じ値セットに制限されます。また、LIMITファンクションを指定することもできます。

ALL

デフォルトのステータス内にあるすべてのディメンション値をステータスに含めることを指定します。デフォルトのステータスは、読取り権限が付与されているすべてのディメンション値で構成され、これらのディメンション値は、ディメンションを前回メンテナンスしたときと同じ順序で配置されています。アナリティック・ワークスペースを起動した時点では、アナリティック・ワークスペース内の各ディメンションのステータスはデフォルトのステータスです。PERMIT文またはPERMITRESET文でディメンションに対する読取り権限を変更すると、そのディメンションのデフォルトのステータスも変更されます。

boolean-expression

ディメンションまたはステータスを制限する際にOracle OLAPによってそのTRUE値が使用される式。boolean-expressionは、ステータスを設定するディメンションによってディメンション化されている必要があります。ディメンション・サロゲートの場合、ブール式はサロゲートの作成元のディメンション全体で評価されます。ブール式で比較する各式のデータ型は、同様のものである必要があります。データ型の変換の詳細は、CONVERTファンクションを参照してください。LIMITでブール式を正しく使用するには、LIMITコマンドが複数のディメンションを持つブール式をどのように処理するかを理解する必要があります(詳細は、LIMITによる複数のディメンションで使用するブール式の処理を参照)。

BOTTOM  n BASEDON expression
TOP n BASEDON expression

ディメンションのステータスまたは値セットのステータスを基準に基づいて設定することを指定しますが。ここで、n は選択する値の数で、expressionは選択のための基準です。ステータスを設定するディメンションを除き、expressionのディメンションはすべて単一の値に制限されている必要があります。TOPではステータスが降順で格納され、BOTTOMではステータスが昇順で格納されます。BASEDONキーワードの後にコンポジットは使用できません。これを行うと、エラー・メッセージが表示されます。

BOTTOM n-percent PERCENTOF expression
TOP n-percent PERCENTOF expression

式で表された基準に基づく最上位または最下位の検索をし、ディメンションまたは値セットのステータスを設定するように指定します。この構成では、値は式に対する占有率に基づいてソートされ、ステータスに追加されます。

たとえば、次の文では、製品がTOTAL(sales)に対する各製品の占有率に従って降順でソートされ、productごとのsalesの累積合計が全売上の30パーセント以上になるまで、上位の値から順にステータスに追加されます。

LIMIT product TO TOP 30 PERCENTOF TOTAL(sales, product)

注意:

副次的な影響がある基準式、またはそれ自体の値を変更するような基準式は使用しないでください。

FIRST n
LAST n

TO、ADD、COMPLEMENTまたはINSERTで使用する場合は、ディメンションの値全体における最初のn個または最後のn個の値を示します。KEEPまたはREMOVEで使用する場合は、現行のステータス内の最初のn個、最後のn個またはn番目の値を示します。

注意:

PERCENTOF基準に基づくステータスにある最後の値が、関連付けられた同じ基準値を持つ複数のディメンション値の1つである場合があります。この場合、LIMITでは、基準値の合計が指定された割合をはるかに上回る場合でも、結果のステータス内にその基準値を持つすべてのディメンション値を含めます。

NTH {n |n TO n}

TO、ADD、COMPLEMENTまたはINSERTで使用する場合は、ディメンションの値全体におけるn個の値を示します。KEEPまたはREMOVEで使用する場合は、現行のステータス内のn個の値を示します。指定できる値の個数や範囲は任意です。

LONGLIST

LIMIT文に引数を2,000まで含めることができることを示します。引数が300より少ない場合、LONGLISTは必要ありません。

SESSION

制限を行う際、MAINTAIN ADD SESSION文を使用して作成したディメンション・メンバーのみが使用されるよう指定します。

STATUS

制限を行う際、現在ステータス内にある値を使用するよう指定します。このキーワードは、VALUES (dimname)文と同じ役割を果たします(ただし、より効率的です)。

NULL

空のディメンションまたは値セットのリストを示します。このキーワードをTOまたはKEEP引数で使用すると、OKNULLSTATUSがNOに設定されている場合でも、現行のステータスからすべての値が削除され、空のディメンションまたは値セットのリストが残されます。同じLIMIT文内に、IFNONEとNULLの両方は使用できません。ADD、INSERTおよびREMOVEでは、ステータスは変更されません。COMPLEMENT NULLは、ステータスにあるすべての値を認識します。

IFNONE label

要求されたステータスが、NULLステータスであるか、NULLステータスの(つまり、値のない)関連ディメンションに基づく場合、プログラムの実行をlabelに分岐することを指定します。(この句の詳細な説明は、LIMITコマンドを参照してください。)

使用上の注意

値を指定する際の注意点

limit-clauseに値を指定する際は、次の点に注意してください。

  • 存在しない値が、LIMITコマンド、LIMITファンクション、またはQDRの値のリストに含まれている際のOracle OLAPの動作は、LIMITSTRICTオプションの設定によって決まります。存在しない値を指定した場合、デフォルトでは、存在しない値は無効な値として処理された後、制限の実行は停止され、エラーが発生します。存在しない値が NA値として処理されるようにするには、LIMITSTRICTの値をNOに設定します。

  • 引用符付き文字列内に引用符付き文字列を埋め込むことができ、これは、Joe's Deliなどのように、コンポジットまたは結合ディメンションのベース・ディメンション値に特殊文字がある場合に必要です。テキスト・リテラルを参照してください。

  • ディメンションがNTEXTデータ型で、ディメンション値を示す引数がTEXTデータ型の場合、LIMITによって引数の値はNTEXTに変換されます。同様に、ディメンションがTEXTデータ型で、ディメンション値を示す引数がNTEXTデータ型の場合、LIMITによって引数の値はTEXTに変換されますが、この場合、データベース・キャラクタ・セットで表せないNTEXT値のデータは失われる可能性があります。

  • DAY、WEEK、MONTH、QUARTER、YEAR型のディメンションの値を指定する場合、値は、ディメンションのVNF(値名書式)で指定されている書式(ディメンションにVNFがない場合は、制限するディメンションの型に対するデフォルトVNF)またはDATE値の有効な入力形式で指定できます。

    指定する必要のある日付のコンポーネントは、制限するディメンションの型に関連するコンポーネントのみです。DAYまたはWEEKディメンションでは、日、月および年の各コンポーネントを指定する必要があります。MONTHまたはQUARTERディメンションでは、月および年のみを指定します(1995年6月の場合はJun95または0695など)。YEARディメンションでは、年のみを指定します(1995年の場合は95など)。日付の有効な入力形式の説明は、DATEORDERを参照してください。

    完全な日付を表すDATE式またはテキスト値を指定する場合は、該当するディメンション値が表す期間内にある任意の日付を指定できます。指定された値があいまいな場合、Oracle OLAPでは、DATEORDERオプションを使用して解決します。

LIMITによる複数のディメンションで使用するブール式の処理

このタイプのLIMITコマンド(またはLIMITファンクション)を使用して、多次元ブール式のディメンションを1つのみに制限すると、その式を、制限されるディメンションの値と制限されないディメンションの現行の値のみに効率よく制限できます。

たとえば、sales変数がproductdistrictおよびmonthという3つのディメンションによってディメンション化されているとします。

ブール式を使用して、最初にdistrictmonthのディメンションを単一の値に明示的に制限して結果を確認し、次にproductを制限します。

LIMIT month TO 'Jan95'
LIMIT district TO 'Boston'
LIMIT product TO sales GT 90000
STATUS product

STATUS文によって生成される出力は、次のとおりです。

The current status of PRODUCT is:
Footwear

この場合、結果のステータスには、Boston地区において1995年1月に月の売上額が$90,000を超えた製品がすべて含まれます。ここではFootwearのみです。

MONTHディメンションが単一の値に限定されていない場合の例は次のとおりです。

LIMIT product TO ALL
LIMIT month TO 'Jan95' 'Feb95' 'Mar95'
LIMIT district TO 'Boston'

REPORT sales文を実行すると、BOSTONの3か月間の売上額を確認できます。

DISTRICT: BOSTON
               -------------SALES--------------
               -------------MONTH--------------
PRODUCT          Jan95      Feb95      Mar95
-------------- ---------- ---------- ----------
Tents           32,153.52  32,536.30  43,062.75
Canoes          66,013.92  76,083.84  91,748.16
Racquets        52,420.86  56,837.88  58,838.04
Sportswear      53,194.70  58,913.40  62,797.80
Footwear        91,406.82  86,827.32 100,199.46

しかし、次のようなLIMITコマンドおよびSTATUSコマンドを実行すると、その下に示されている出力が生成されます。ここでも、monthのステータスに含まれるのはFootwearのみです。

LIMIT product TO sales GT 90000
STATUS product
 
The current status of PRODUCT is:
Footwear

この例では、各製品に対し月別に3つの売上額があります。LIMITは、それぞれの製品についてステータスにある最初の月の販売データのみを評価します。その月の売上データが$90,000を超えている場合に、その製品がステータスに追加されます。

各製品のすべての月のデータを評価するには、EVERY、ANYまたはNONEファンクションを使用します。たとえば、次のLIMIT文では、いずれかの月の売上額が$90,000を超えている場合、その製品はステータスに追加されます。

LIMIT product TO ANY(sales GT 90000, product)

この場合、STATUS product文を発行すると、次の出力が生成されます。

The current status of product is:
Canoes, Footwear

暗黙的なリレーションを使用した制限

DAY、WEEK、MONTH、QUARTER、YEAR型の各ディメンションは、この型の他のすべてのディメンションと暗黙的なリレーションで関連付けられています。あるDAY、WEEK、MONTH、QUARTERまたはYEARディメンションの値を、related-dimensionとして別のDAY、WEEK、MONTH、QUARTERまたはYEARディメンションを指定して制限すると、デフォルトで暗黙的なリレーションが使用されます。ただし、これらの型の2つのディメンション間に明示的なリレーションが定義されている場合は、related-dimension として明示的なリレーションの名前を指定することによって、デフォルトを変更できます。たとえば、次のような文を発行します。

LIMIT month TO quarter year

この文では、quarterを一時的にyearに制限した後で、monthquarterに制限し、最後にquarterを元のステータスにリストアします。

例10-20 LIMITによる変数の部分的な移入

DEFINE GEOG DIMENSION TEXT
DEFINE PRODUCTS DIMENSION TEXT
DEFINE SALES VARIABLE DECIMAL <PRODUCTS GEOG>
DEFINE COSTS VARIABLE DECIMAL <PRODUCTS GEOG>

次のレポートに示すように、ディメンションを移入したが、値は追加していないものとします。costs変数およびsales変数のすべての要素がレポートに表示されますが、値はいずれもNAです。

PRODUCTS
------------
TVs
Radios
Skis
Bikes
 
GEOG
------------
Boston
Springfield
New Orleans
Baton Rouge
Quebec City
Montreal
Toronto
Norfolk
 
             -------------------SALES-------------------
             -----------------PRODUCTS------------------
GEOG            TVs       Radios      Skis      Bikes
------------ ---------- ---------- ---------- ----------
Boston               NA         NA         NA         NA
Springfield          NA         NA         NA         NA
New Orleans          NA         NA         NA         NA
Baton Rouge          NA         NA         NA         NA
Quebec City          NA         NA         NA         NA
Montreal             NA         NA         NA         NA
Toronto              NA         NA         NA         NA
Norfolk              NA         NA         NA         NA
 
             -------------------COSTS-------------------
             -----------------PRODUCTS------------------
GEOG            TVs       Radios      Skis      Bikes
------------ ---------- ---------- ---------- ----------
Boston               NA         NA         NA         NA
Springfield          NA         NA         NA         NA
New Orleans          NA         NA         NA         NA
Baton Rouge          NA         NA         NA         NA
Quebec City          NA         NA         NA         NA
Montreal             NA         NA         NA         NA
Toronto              NA         NA         NA         NA
Norfolk              NA         NA         NA         NA
 

次のLIMITコマンドを発行して、Oracle OLAPからアクセスできる値が、geogディメンションの値のBostonおよびSpringfieldで索引付けされた値のみとなるように制限します。

LIMIT geog TO 'Boston' 'Springfield'
 

次に、geog、costsおよびsalesの新しいレポートを発行します。geogディメンションでは、BostonとSpringfieldの値のみが表示されます。同様に、costs変数とsales変数についても、BostonおよびSpringfieldで索引付けされた要素のみがレポートに表示されます。

GEOG
------------
Boston
Springfield
 
             -------------------SALES-------------------
             -----------------PRODUCTS------------------
GEOG            TVs       Radios      Skis      Bikes
------------ ---------- ---------- ---------- ----------
Boston               NA         NA         NA         NA
Springfield          NA         NA         NA         NA
 
             -------------------COSTS-------------------
             -----------------PRODUCTS------------------
GEOG            TVs       Radios      Skis      Bikes
------------ ---------- ---------- ---------- ----------
Boston               NA         NA         NA         NA
Springfield          NA         NA         NA         NA
 

costs変数とsales変数に値を代入するためにRANDOMファンクションを使用する2つの代入文を発行し、次にgeogディメンションのステータスをデフォルト・ステータスのALLに設定するLIMITコマンドを発行します。

 
sales = RANDOM (200)
costs = RANDOM (100)
LIMIT geog to ALL
 

次に、geog、costsおよびsalesの新しいレポートを発行します。geogディメンションのすべての値、およびcosts変数とsales変数のすべての要素が表示されます。ただし、非NA値が表示されるのは、BostonおよびSpringfieldで索引付けされたcosts変数とsales変数の要素のみです。

 
GEOG
------------
Boston
Springfield
New Orleans
Baton Rouge
Quebec City
Montreal
Toronto
Norfolk
 
             -------------------SALES-------------------
             -----------------PRODUCTS------------------
GEOG            TVs       Radios      Skis      Bikes
------------ ---------- ---------- ---------- ----------
Boston           199.97     133.82      10.07     148.17
Springfield      173.94      27.56      32.21      47.40
New Orleans          NA         NA         NA         NA
Baton Rouge          NA         NA         NA         NA
Quebec City          NA         NA         NA         NA
Montreal             NA         NA         NA         NA
Toronto              NA         NA         NA         NA
Norfolk              NA         NA         NA         NA
 
             -------------------COSTS-------------------
             -----------------PRODUCTS------------------
GEOG            TVs       Radios      Skis      Bikes
------------ ---------- ---------- ---------- ----------
Boston            43.52      25.32      68.68      10.38
Springfield        9.49      27.96      61.76      16.12
New Orleans          NA         NA         NA         NA
Baton Rouge          NA         NA         NA         NA
Quebec City          NA         NA         NA         NA
Montreal             NA         NA         NA         NA
Toronto              NA         NA         NA         NA
Norfolk              NA         NA         NA         NA

例10-21 ブール式を使用した制限

ブール式の値に基づいてディメンションまたは値セットを制限できます。この例では、TOTALファンクションの値をproduct別に取得し、定数と比較します。LIMIT文によって、すべての月および地区について合計した売上額が1200万を超えるすべての製品にステータスが設定されます。

LIMIT product TO TOTAL(sales product) GT 12000000

例10-22 計算式を使用した制限

ディメンションの制限のために同じ基準を頻繁に使用する場合、式を計算式として保存し、制限式として計算式の名前を使用できます。

DEFINE criterion FORMULA TOTAL(sales product) GT 12000000
LIMIT product TO criterion

例10-23 値セットを使用した制限

値セットにステータス・リストを保存し、それらの値を使用してステータスを制限できます。あるステータス・リストの生成に複数のLIMITコマンドが必要な場合、値セットを使用することで、同じリストを生成するたびにそれらのLIMITコマンドを繰り返す必要がなくなります。次の文では、districtを1996年のSportswear売上額が$1,000,000を超えた地区に制限します。ステータスは値セットsports.districtに保存されるため、1つのLIMIT文でdistrictを同じリストに制限できます。

DEFINE sports.district VALUESET district
LIMIT product TO 'Sportswear'
LIMIT month TO year 'Yr96'
LIMIT sports.district TO TOTAL(sales district) GT 1000000
LIMIT district TO sports.district

STATUS district文を発行すると、次の出力が生成されます。

The current status of DISTRICT is:
ATLANTA TO DENVER

例10-24 変数を使用した制限

ここでは、TOPおよびBASEDONキーワードを使用し、変数の値を基準値として使用して、ディメンションのステータスを制限します。ステータス・リストは、salesの値に基づいて降順でソートされます。

LIMIT product TO 'Sportswear'
LIMIT month TO 'Jul96'
LIMIT district TO TOP 2 BASEDON sales

次のREPORT文を使用します。

REPORT DOWN district sales

これによって、LIMITコマンドの結果を示す次のレポートが生成されます。

PRODUCT: SPORTSWEAR
               --SALES---
               --MONTH---
DISTRICT         Jul96
-------------- ----------
Dallas         220,416.81
Atlanta        211,666.14

例10-25 連結ベース・ディメンションを使用した結合ディメンションの制限

productという単純なディメンションとreg.dist.ccdimという連結ディメンションをベース・ディメンションとして持つprod.regdistという結合ディメンションが、アナリティック・ワークスペースに含まれているとします。結合ディメンションprod.regdistの値は、次のとおりです。

Tents   <region: East>
Tents   <region: West>
Canoes  <region: East>
Canoes  <region: West>
Tents   <district: Boston>
Tents   <district: Atlanta>
Tents   <district: Denver>
Canoes  <district: Atlanta>
Canoes  <district: Seattle>

連結ディメンションをベース・ディメンションとして持つ結合ディメンションのステータスを設定するには、2つの方法があります。

  • 連結ディメンション、およびそのコンポートネント・ディメンションの1つとその値を指定します。次のLIMIT文では、この方法によりprod.regdistのステータスが設定されます。

    LIMIT prod.regdist TO reg.proddist.ccdim district 'Atlanta'
    RPR W 20 prod.regdist
    

    この文によって生成される出力は、次のとおりです。

    --------------PROD.REGDIST---------------
          PRODUCT           REG.DIST.CCDIM
    -------------------- --------------------
    Tents                <district: Atlanta>
    Canoes               <district: Atlanta>
    
  • また、それ自体の値を指定することでも、結合のステータスを設定できます。次のLIMIT文では、この方法によりprod.regdistのステータスが設定されます。

    LIMIT prod.regdist TO <'Tents' '<region: East>'> <'Tents' '<district: Boston>'>
    RPR W 20 prod.regdist
    

    この文によって生成される出力は、次のとおりです。

    --------------PROD.REGDIST---------------
          PRODUCT           REG.DIST.CCDIM
    -------------------- --------------------
    Tents                <region: East>
    Tents                <district: Boston>

LIMITコマンド(LEVELRELを使用)

LIMITコマンドでLEVELRELを使用すると、階層ディメンションまたはディメンション・サロゲートの現行のレベルと同じレベルのディメンション値のみを使用して、ステータスを設定し、また値セットへ値を代入できます。

構文

LIMIT {dimension | valueset} [concat-component] limit-type-

     LEVELREL level-relation-clause [IFNONE label]

level-relation-clauseの構文は、指定するオブジェクトのディメンション性によって異なります。

  • 多次元のレベル・リレーションを指定するには、次の構文を使用する必要があります。

    RELATION level-relation-name [QUALIFY relation-dimension-name [inclusive-val-args...]...]

    (レベル・リレーションが1次元の場合もこの構文を使用できます。)

  • 1次元のレベル・リレーションを指定するには、次の簡素化された構文を使用できます。

     level-relation-name [valueset2]   

パラメータ

dimension

ステータスが設定されるディメンションまたはディメンション・サロゲートの名前。

valueset

値が代入される値セットの名前、またはLIMITファンクション

concat-component

制限の決定に使用する値の連結ディメンションのコンポーネントの名前。(この引数の詳細な説明は、LIMITコマンドを参照してください。)

limit-type

Oracle OLAPによる現行のステータス・リストの変更方法を指定するキーワード。(これらのキーワードのリストおよび説明は、LIMITコマンドを参照してください。)

LEVELREL

階層ディメンションのステータスをディメンションの現行の値と同じレベルにある階層ディメンションのすべての値に設定し、階層ディメンションを、ディメンションの現行の値と同じレベルにあり、かつ指定された値セット内にある階層ディメンションの値に制限します。

RELATION

level-relation-nameで指定したリレーションの値に基づいて制限を行うように指定します。 level-relation-nameが多次元リレーションの場合、このキーワードを指定します。

level-relation-name

制限する階層ディメンションのレベル・リレーションの名前を指定します。詳細は、levelrelリレーションを参照してください。

QUALIFY relation-dimension-name [inclusive-val-args]

Oracle OLAPが制限を行う際の基準の値を識別します。

  • relation-dimension-nameは、level-relation-nameで指定したリレーションのディメンションの名前です。

  • inclusive-val-argsは、制限を行う際の基準となるlevel-relation-nameの値を判別する際に使用するrelation-dimension-nameの値を指定します。LIMITコマンドのvaluelist句に対するinclusive-val-args引数の構文に記述されている任意のinclusive valuelist引数を指定できます。(構文の詳細は、LIMITコマンド(値を使用)を参照してください。)この引数を省略すると、制限を行う際にOracle OLAPによってディメンションの現行ステータスが使用されます。

valueset2

制限する階層ディメンションのレベル・ディメンションによってディメンション化されている、値セット・オブジェクトの名前を指定します。この引数を使用した結果は、ディメンションの現行位置のレベル値に対応する個々の値セットとなります。

また、LIMITファンクションを指定することもできます。

IFNONE label

要求されたステータスが、NULLステータスであるか、NULLステータスの(つまり、値のない)関連ディメンションに基づく場合、プログラムの実行をlabelに分岐することを指定します。(この句の詳細な説明は、LIMITコマンドを参照してください。)

例10-26 階層時間ディメンションの単一の期間への制限

timeという名前の階層TEXTディメンション、値としてMonthおよびYearを持つtimelevelsという名前のレベル・ディメンション、およびtimeによってディメンション化され、関連ディメンションとしてtimelevelsを持つtimelevelsrelという名前のリレーションを定義したとします(つまり、timelevelsrelは、timeディメンションの各値について、MonthまたはYearのいずれかの値を保持します)。すでにステータスにあるtimeの値を、Jan99と同じレベルにある値のみに制限する場合は、次のような文を発行します。

LIMIT time TO LEVELREL timelevelsrel

これは、次の文を発行するのと同等です。

LIMIT time TO RELATION timelevelsrel QUALIFY time CURRENT

LIMITコマンド(関連ディメンションを使用)

LIMITコマンドで関連ディメンションの制限句を使用すると、別の関連ディメンションの値を使用して、値セットへの値の代入や、ディメンションまたはディメンション・サロゲートのステータス設定を行うことができます。

構文

LIMIT {dimension | valueset} limit-type related-dim-clause [IFNONE label]

related-dim-clause の構文は、指定するオブジェクトのタイプによって異なります。

  • リレーションを指定する際の構文は次のとおりです。

    RELATION relation-name [QUALIFY relation-dimension-name [inclusive-val-args...]...]

  • 制限対象のディメンションに関連するディメンションを指定する際の構文は次のとおりです。

     related-dimension-name [related-dimension-valuelist]   

    (オブジェクトが1次元リレーションの場合もこの簡素化された構文を使用できます。)

パラメータ

dimension

ステータスが設定されるディメンションまたはディメンション・サロゲートの名前。

valueset

値が代入される値セットの名前、またはLIMITファンクション

concat-component

制限の決定に使用する値の連結ディメンションのコンポーネントの名前。(この引数の詳細な説明は、LIMITコマンドを参照してください。)

limit-type

Oracle OLAPによる現行のステータス・リストの変更方法を指定するキーワード。(これらのキーワードのリストおよび説明は、LIMITコマンドを参照してください。)

RELATION relation-name

relation-nameで指定したリレーションの値に基づいて制限を行うように指定します。 relation-nameが多次元リレーションの場合、このキーワードを指定します。また、制限されるディメンションとrelated-dimension-nameによって指定するディメンションの間に複数のリレーションが存在する場合、この句を使用して、制限を行う際に使用されるリレーションを識別できます。

QUALIFY relation-dimension-name [inclusive-val-args]

Oracle OLAPが制限を行う際の基準の値を識別します。各引数の意味は次のとおりです。

  • relation-dimension-nameは、relation-nameで指定したリレーションのディメンションの名前です。

  • inclusive-val-argsは、親値を判別する際に使用するrelation-dimension-nameの値を指定します。LIMITコマンドのvaluelist句に対するinclusive-val-args引数の構文に記述されている任意のinclusive valuelist引数を指定できます。構文の詳細は、LIMITコマンド(値を使用)を参照してください。この引数を省略すると、制限を行う際に関連ディメンションの現行のステータス・リストが使用されます。

related-dimension-name

制限するディメンションに関連する1次元のリレーションまたはディメンションの名前を指定します。また、related-dimension-nameとして、制限するディメンションのディメンション・サロゲート、または関連ディメンションのディメンション・サロゲートを指定することもできます。たとえば、dimsurrdim2のディメンション・サロゲートで、dim2dim1に関連付けられているとします。ディメンション・サロゲートdimsurrには、値Dsv1Dsv2Dsv3およびDsv4があります。次の文では、dimsurrの値を指定して、dim1を制限します。

LIMIT dim1 TO dimsurr dsv1 dsv3
related-dimension-valuelist

関連ディメンションの値、関連ディメンションのディメンション・サロゲートの値、またはLIMITコマンドに示されている構文で指定したディメンションの値。構文の詳細は、LIMITコマンド(値を使用)を参照してください。この引数がLIMIT文内に存在する場合、ステータスは、related-dimension値に関連する制限対象のディメンションの値を選択することで取得されます。valuelistを指定しない場合、related-dimensionの現行のステータス値が使用されます。

IFNONE label

要求されたステータスが、NULLステータスであるか、NULLステータスの(つまり、値のない)関連ディメンションに基づく場合、プログラムの実行をlabelに分岐することを指定します。(この句の詳細な説明は、LIMITコマンドを参照してください。)

使用上の注意

2段階の処理から構成される関連ディメンションへの制限

ディメンションまたは値セットを関連ディメンションに制限する際、結果のステータスは次の2段階の処理で決定されます。

  1. ディメンション値が、関連ディメンションの値の順序に配置されます。

  2. 関連ディメンションの値に対してディメンションの値が複数ある場合、それらの値はデフォルト・ステータスの順序で配置されます。

関連ディメンションへの制限におけるソートの抑制

LIMIT.SORTRELをNOに設定すると、ディメンションまたは値セットを関連ディメンションに制限する際に行われるソートを抑制できます。大きなディメンションを制限する場合、これによってパフォーマンスが大幅に向上します。

注意:

LIMIT.SORTRELをNOに設定すると、出力されるディメンションが論理的な順序で表示されない場合があります。

例10-27 関連ディメンションを使用した制限

ここでは、関連ディメンションを使用して、ディメンションのステータスを制限します。この文では、districtEast地域内のBostonおよびAtlantaに制限します。

LIMIT district TO region 'East'

この文では、division値のリストの最後に表示される部門の製品であるSportswearおよびFootwearproductを制限します。

LIMIT product TO division LAST 1

LIMIT(親リレーションを使用)

LIMITコマンドの制限句に親リレーションを使用すると、階層ディメンションまたはそのディメンション・サロゲートのステータスの設定や、値セットへの値の代入を、階層内のファミリ・リレーションに基づいて実行できます。

構文

LIMIT {dimension | valueset} [concat-component] limit-type-

     [family-keyword ] USING parent-relation-clause [IFNONE label]

ここで

  • family-keywordは次の構成のいずれかです。

    •      PARENTS
    •      CHILDREN
    •       ANCESTORS [DISTANCE generation ]
    •       DESCENDANTS [DISTANCE generation ]
    •       SIBLINGS
    • TOPANCESTORS
    • BOTTOMDESCENDANTS
    •       HIERARCHY [INVERTED] [NOORIGIN] [SKIP n] [DEPTH n] [RUN textexp]] 
  • parent-relation-clauseの構文は、指定するオブジェクトのディメンション性によって異なります。

    • 親リレーションが多次元の場合は、次の構文を使用します。

      RELATION parentrel [QUALIFY relation-dimension-name [inclusive-val-args... | CURRENT]...]

      (親リレーションが1次元の場合もこの構文を使用できます。)

    • 親リレーションが1次元の場合、次の簡素化された構文を使用できます。

       parentrel [inclusive-val-args | CURRENT] 

パラメータ

dimension

ステータスが設定されるディメンションまたはディメンション・サロゲートの名前。

valueset

値が代入される値セットの名前、またはLIMITファンクション

concat-component

制限の決定に使用する値の連結ディメンションのコンポーネントの名前。(この引数の詳細な説明は、LIMITコマンドを参照してください。)

limit-type

Oracle OLAPによる現行のステータス・リストの変更方法を指定するキーワード。(これらのキーワードのリストおよび説明は、LIMITコマンドを参照してください。)

PARENTS

valuelist内の各値の親を検索します。ディメンションでは、valuelistが存在しない場合、ステータスにある各値の親が検索されます。値セットでは、valuelistが存在しない場合、値セット内にある各値の親が検索されます。親の検索にはparent-relationが使用されます。

CHILDREN

valuelist内の各値の子を検索します。ディメンションでは、valuelistが存在しない場合、ステータスにある各値の子が検索されます。値セットでは、valuelistが存在しない場合、値セット内にある各値の子が検索されます。子の検索にはparent-relationが使用されます。

ANCESTORS [DISTANCE generation]

DISTANCE句を含めない場合、次のようになります。

  • valuelist内の各値の祖先(親、その親など)を検索します。ディメンションでは、valuelistが存在しない場合、ステータスにある各値の祖先が検索されます。

  • 値セットでは、valuelistが存在しない場合、値セット内にある各値の祖先が検索されます。つまり、祖先の検索とは、値の親、その親の親というように、親のない値に達するまで検索を行うことです。

DISTANCE句を含める場合、generationで指定した世代のメンバーである祖先に制限されます。

  • generationでは、現行の世代には0、親には1、親の親には2、親の親の親には3(以降同様)を指定します。

  • 負の値に対しては、子孫の世代(つまり、-1は子、-2は孫、以降同様)が返されます。

DESCENDANTS [DISTANCE generation]

DISTANCE句を含めない場合、次のようになります。

  • valuelist内の各値の子孫(子、孫など)を検索します。ディメンションでは、valuelistが存在しない場合、ステータスにある各値の子孫が検索されます。

  • 値セットでは、valuelistが存在しない場合、値セット内にある各値の子孫が検索されます。つまり、子孫の検索とは、値の子、その子の子というように、子のない値に達するまで検索を行うことです。

DISTANCE句を含める場合、generationで指定した世代のメンバーである子孫に制限されます。

  • generationでは、現行の世代には0、子には1、孫には2、孫の子には3(以降同様)を指定します。

  • 負の数に対しては、祖先の世代(つまり、-1は親、-2は親の親、以降同様)が返されます。

SIBLINGS

valuelistの値、それ自身を含む、valuelist内の各値のすべての兄弟オブジェクトを検索します。SIBLINGSキーワードを使用した1つのLIMIT文を発行するのは、PARENTSを指定したLIMIT文を発行してから、CHILDRENを指定したLIMIT文を発行するのと同じです。ディメンションでは、valuelistが存在しない場合、ステータスにある各値の兄弟オブジェクトが検索されます。値セットでは、valuelistが存在しない場合、値セット内にある各値の兄弟オブジェクトが検索されます。

TOPANCESTORS

(省略形はTOPANC)階層の最上位にあるメンバー、つまり、祖先を持たないメンバーを検索します。これは、次の2つのLIMITコマンドを発行するのと同等です。

   LIMIT dimension to ANCESTORS ....
   LIMIT dimension REMOVE DESCENDANTS....
BOTTOMDESCENDANTS

(省略形はBOTTOMDESC)階層の最下位にあるメンバー、つまり、子孫を持たないメンバーを検索します。

HIERARCHY

特定のparent-relationに基づいて、子孫(子、孫など)を検索します。違いは値の順序です。DESCENDANTSでは、値をレベルごとにグループ化し(すべての子、すべての孫など)、HIERARCHYでは、子の各グループをその親の次に配置します。HIERARCHYでは、ステータスにある元の値(つまり、LIMIT文が実行される前にステータスにあった値)が含まれます。

INVERTED

子を親の前にリストするように指定します。デフォルトでは、子は親の後にリストされます。

NOORIGIN

ステータスから元の値を除外します。デフォルトでは、元の値はステータスに含まれます。

SKIP

valuelist内の各値について、n 世代スキップします。ディメンションでは、valuelistが存在しない場合、ステータスにある各値についてn 世代スキップします。値セットでは、valuelistが存在しない場合、値セット内にある各値についてn 世代スキップします。このキーワードをDEPTHと組み合せて使用すると、ドリルダウン時に有効です(例10-29を参照)。

DEPTH

valuelistの各値からn世代下まで含めます。ディメンションでは、valuelistが存在しない場合、ステータスにある各値のn 世代下まで含まれます。値セットでは、valuelistが存在しない場合、値セット内にある各値のn 世代下まで含まれます。デフォルトでは、DEPTH値は99です。このキーワードをSKIPと組み合せて使用すると、値のドリルダウン時に有効です。

RUN

子のグループが構成されるたびに、テキスト式で表された文を実行します。たとえば、Oracle OLAP変数に格納されている情報に基づいて、子の各グループをソートできます。次の文では、子のグループが構成されると、売上数量に基づいて市場が昇順にソートされます。

LIMIT market TO HIERARCHY RUN 'SORT market a unit.m' USING -
  market.market

注意:

この例で、TOのかわりにKEEPまたはREMOVEをLIMIT文に使用すると、SORT文は無効になります。

USING 

親の値を決定する際に使用する値を指定します。

parentrel

ディメンションの親リレーションの名前を指定します。

ディメンション・サロゲートを制限するには、サロゲートの作成元のディメンションの親リレーションを使用します。

RELATION  

parent-relation-clauseの先頭を識別します。parentrelが多次元リレーションの場合は、このキーワードを使用します。

QUALIFY relation-dimension-name 

parentrelのディメンションの名前を指定します。この句の使用方法は、LIMITコマンドとLIMITファンクションのどちらをコーディングするかによって異なります(LIMITのループ動作(親リレーションを使用)を参照)。

inclusive-val-args

親の値を決定する際に使用する値を指定します。LIMITコマンドのvaluelist句に対するinclusive-val-args引数の構文に記述されている任意のinclusive valuelist引数を指定できます。構文の詳細は、LIMITコマンド(値を使用)を参照してください。

CURENT

ディメンションの現行値の子の値に制限するように指定します。(これは、dimension_name +0を指定した場合と同じになります。)

IFNONE label

要求されたステータスが、NULLステータスであるか、NULLステータスの(つまり、値のない)関連ディメンションに基づく場合、プログラムの実行をlabelに分岐することを指定します。(この句の詳細な説明は、LIMITコマンドを参照してください。)

使用上の注意

LIMITのループ動作(親リレーションを使用)

QUALIFY句を含めない場合、parentrel が多次元であるときに、このLIMITによってステータスに含まれる値セットは、LIMITコマンドとLIMITファンクションのどちらを発行しているかによって異なります。

  • LIMITコマンド。ステータスにある値のセットには、parentrelの関連ディメンションのステータスにある値すべてが含まれます。parentrelの関連ディメンションの現行値のみをステータスにある値のセットに含める場合は、parentrelの各関連ディメンションに対してQUALIFY related-dimension CURRENT句を指定します。

  • LIMITファンクション。ステータスにある値のセットには、parentrelの関連ディメンションの現行値のみが含まれます。parentrelの関連ディメンションのステータスにある値すべてをステータスにある値のセットに含める場合は、parentrelの各関連ディメンションに対してQUALIFY related-dimension related-dimension句を指定します。

例10-28 単純なドリルダウン

この例では、市場(market)ディメンションの地域(region)レベルから地区(district)のデータをドリルダウンします。まず、地区、地域および米国全体レベルでの合計を組み込んだ市場ディメンションを地域レベルのデータに制限します。このLIMITは、marketmarket.levelの間のリレーションであるリレーションmlv.marketを使用して行います。

REPORT mlv.market文を発行すると、mlv.marketの値を示す次の出力が生成されます。

MARKET         MLV.MARKET
-------------- ----------
Totus          Totus
East           Region
Boston         District
Atlanta        District
Central        Region
Chicago        District
Dallas         District
West           Region
Denver         District
Seattle        District

次のLIMIT文でMARKETの値を制限し、STATUS文で現在ステータスにある値を生成します。文の下にSTATUSの出力が示されています。

LIMIT market TO mlv.market 'Region'
STATUS market
 
The current status of MARKET is:
EAST, CENTRAL, WEST

地域レベルから地区レベルのデータまでドリルダウンするには、LIMITでCHILDRENキーワードを使用します。次の例では、market.marketという親リレーションを使用してドリルダウンを実行しています。このリレーションは、marketディメンションの各値に対して、その親の名前を保持しています。

DEFINE market.market RELATION market <market>
LD Self-relation for the Market Dimension

market.marketのレポートで生成される出力は、次のとおりです。

MARKET         MARKET.MARKET
-------------- -------------
Totus          NA
East           Totus
Boston         Central
Atlanta        East
Central        Totus
Chicago        Central
Dallas         Central
West           Totus
Denver         West
Seattle        West

LIMITでCHILDRENキーワードを使用し、marketEastCentralおよびWest地域の子に制限します。

LIMIT market TO mlv.market 'Region'
Limit market TO CHILDREN USING market.market

marketのレポートで生成される出力は、次のとおりです。

MARKET
-------------
Boston
Atlanta
Chicago
Dallas
Denver
Seattle

例10-29 SKIPとDEPTを使用したドリルダウン

次の文があるとします。

LIMIT market TO HIERARCHY DEPTH 2 SKIP 1 USING market.market 'Totus'

この文によって、Oracle OLAPでは、親子関係(market.market)を調べてTotus の子および孫(DEPTH 2)を検索し、最初の世代(SKIP 1)を破棄します。結果として、ステータスは次のようになります。

Totus
Boston
Atlanta
Chicago
Dallas
Denver
Seattle

Totusがステータスに含まれていることに注意してください。HIERARCHYを使用した場合、元の値はステータスに含まれます。

LIMIT NOCONVERTコマンド

LIMITコマンドでは、ディメンションおよびそのディメンション・サロゲートの現行のステータス・リストの設定や、値セットへの値の代入ができます。

LIMITコマンドでNOCONVERTキーワードを使用すると、ディメンションのステータスが別のディメンション内の値の位置番号に基づいて設定されます。

構文

LIMIT{dimension | valueset} [concat-component] limit-type -

     NOCONVERT [{unrelated-dimension|numeric-valueset}] -      [IFNONE label]

パラメータ

dimension

ステータスが設定されるディメンションまたはディメンション・サロゲートの名前。

valueset

値が代入される値セットの名前、またはLIMITファンクション

concat-component

制限の決定に使用する値の連結ディメンションのコンポーネントの名前。(この引数の詳細な説明は、LIMITコマンドを参照してください。)

limit-type

Oracle OLAPによる現行のステータス・リストの変更方法を指定するキーワード。(これらのキーワードのリストおよび説明は、LIMITコマンドを参照してください。)

NOCONVERT

ディメンションのステータスを、別のディメンションのステータス・リスト内にある指定した値の位置番号に基づいて設定します。

unrelated-dimension

制限するディメンションに関連しないディメンションの名前を指定します。この引数を使用することで、ディメンションまたは値セットのステータスを、関連しないディメンションのステータスにある各値の位置番号に基づいて設定するように指定できます。関連しないディメンションのステータスにある値に基づいたステータスの設定は、2つのディメンションが異なるアナリティック・ワークスペース内にある場合に特に有効です(たとえば、それぞれ別のアナリティック・ワークスペースにある2つの製品ディメンションの間に1対1の関係が存在する場合など)。

numeric-valueset

数値の値セットを指定します。この引数を使用すると、NOCONVERTによって、ステータスが値セットの数値に基づいて設定されます。数値は、ディメンションのデフォルト・ステータス内における値の位置を表します。

IFNONE label

(OLAP DMLプログラム内でのみ使用)要求されたステータスが、NULLステータスであるか、NULLステータスの関連ディメンション(つまり、値のない関連ディメンション)に基づく場合、プログラムの実行をlabelに分岐することを指定します いずれの場合も、プログラムの実行が分岐すると、NULLステータスは適用されません。(この句の詳細な説明は、LIMITコマンドを参照してください。)

LIMITコマンド(POSLISTを使用)

LIMITコマンドでは、ディメンションおよびそのディメンション・サロゲートの現行のステータス・リストの設定や、値セットへの値の代入ができます。

LIMITコマンドでPOSLISTキーワードを使用すると、ディメンションのステータスがそのディメンション内の値の位置に基づいて設定されます。

構文

LIMIT {dimension | valueset} [concat-component] limit-type -

     POSLIST poslist-exp [IFNONE label]

パラメータ

dimension

ステータスが設定されるディメンションまたはディメンション・サロゲートの名前。

valueset

値が代入される値セットの名前、またはLIMITファンクション

concat-component

制限の決定に使用する値の連結ディメンションのコンポーネントの名前。(この引数の詳細な説明は、LIMITコマンドを参照してください。)

limit-type

Oracle OLAPによる現行のステータス・リストの変更方法を指定する標準キーワード(LIMITコマンドを参照)。

POSLIST poslist-textexp

ディメンションのステータスを、ディメンション内の値の位置に基づいて設定します。poslist-textexpはテキスト式です。この式の各行は、制限するディメンションの位置番号を評価する数値です。

IFNONE label

要求されたステータスが、NULLステータスであるか、NULLステータスの(つまり、値のない)関連ディメンションに基づく場合、プログラムの実行をlabelに分岐することを指定します。(この句の詳細な説明は、LIMITコマンドを参照してください。)

LIMIT BASEDIMS

LIMIT BASEDIMSコマンドは、コンポジット、結合ディメンション、連結ディメンションまたはパーティション・テンプレートの1つ以上のベース・ディメンションの現行のステータス・リストの設定を、そのオブジェクトに対して選択された値に基づいて行うコマンドです。

LIMIT BASEDIMSは、スパースなオブジェクトのタプルに存在する各ディメンションについてディメンション値のステータスを生成する場合に使用します(一部の任意の入力ステータスでフィルタを適用する場合もあります)。また、このコマンドは、ベース・ディメンションの1つ以上の値セットに値を割り当てる場合にも使用できます。

ディメンションの現行のステータス・リストに存在する値は、「ステータスにある」と言われます。コンポジット、結合ディメンション、連結ディメンション、またはパーティション・テンプレートのベース・ディメンションのステータスは、そのベース・ディメンションの現行のステータスにより決まります。

関連項目:

ディメンション・ステータスに関する処理の詳細は、すべてのデータ・オブジェクトの値に対するOLAP DML文の適用およびLIMITコマンドを参照してください。

構文

LIMIT BASEDIMS {<dimlist>}TO object [ [KEEP] limit-clause ]

パラメータ

dimlist

Oracle OLAPでステータスを変更するベース・ディメンションおよび値を追加する値セットを識別するオブジェクトについてのスペース区切りリストです。dimlistには、次の値を指定できます。

  • base-dimension-name
  • objectのベース・ディメンションの名前。
  • relation-name
  • リレーションの名前。リレーションを指定すると、関連するディメンションのステータスが設定されます。
  • valueset-name
  • ベース・ディメンションの値セットの名前、またはLIMITファンクション。値セットの名前を指定すると、指定された値セットに値が1つ割り当てられます。

dimlistでは、最大限に拡張されたobjectのベース・ディメンションのリストが、デフォルトの値となります。

object

コンポジット、結合ディメンション、連結ディメンションまたはパーティション・テンプレート・オブジェクトの名前。

KEEP

オブジェクトのベース・ディメンションに対する現行のディメンション・ステータスに基づいて値を選択するように指定します。KEEPによってステータス内に残される値は、現行の値順序で維持されます。

limit-clause

ベース・ディメンションに対する現行のステータス・リストを変更する際に、objectの値を選択する方法を指定します。

limit-clauseの構文は、各種LIMITコマンドにおける、位置に関係しない任意のlimit-clause引数の構文(つまり、LIMITコマンドの「TO」などのlimit-type引数の後の構文)と同じです。これらの引数の構文については、LIMITコマンド(値を使用)LIMITコマンド(LEVELRELを使用)LIMIT(親リレーションを使用)LIMITコマンド(関連ディメンションを使用)LIMITコマンド(NOCONVERTを使用)およびLIMITコマンド(POSLISTを使用)を参照してください。

このオプション引数を指定しない場合、ベース・ディメンションのステータスは、ディメンションの現行のステータスに設定されます。

LISTBY

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

構文

LISTBY dimensions

パラメータ

dimensions

スペースで区切った1つ以上のディメンションまたはコンポジットのリスト。複数のディメンションをリストする場合、それらのディメンションはすべて同じワークスペース内のものである必要があります。LISTBYは、ここで指定するすべてのディメンションによってディメンション化されているオブジェクトのリストを返します。名前のないコンポジットを指定する場合は、次の形式を使用します。

LISTBY SPARSE dim1 dim2 ...

使用上の注意

コンポジットと結合ディメンション

LISTBYによって生成されるレポートには、指定したディメンションがベース・ディメンション・リストにある名前付きコンポジット、名前のないコンポジットまたは結合ディメンションが含まれます。

また、そのリストには、指定したディメンションをベース・ディメンションとする名前付きコンポジットまたは名前のないコンポジットを、そのディメンション・リスト内に含むオブジェクトも含まれます。

例10-30 LISTBYの使用

ここでは、LISTBYを使用して、productによってディメンション化されているか、またはproductに関連しているすべてのオブジェクトの名前をリストします。このLISTBY product 文によって生成される出力は、次のとおりです。

15 objects dimensioned by or related to PRODUCT
----------------------------------------------------------------
ADVERTISING          DIVISION.PRODUCT     EXPENSE
INDUSTRY.SALES       NAME.PRODUCT         NATIONAL.SALES
PRICE                PRODUCT.MEMO         PRODUCTSET
SALES                SALES.FORECAST       SALES.PLAN
SHARE                UNITS                UNITS.M

例10-31 複数のディメンションの指定

この例では、LISTBYを使用して、productおよびmarket両方によってディメンション化されているか、またはこの両方に関連しているすべてのオブジェクトの名前をリストします。

LISTBY product market
1 objects dimensioned by or related to PRODUCT, MARKET
----------------------------------------------------------
UNITS.M

LISTFILES

LISTFILESコマンドは、FILEQUERYファンクションで参照可能なすべてのオープン・ファイルをリストするコマンドです。このリストには、FILEOPEN、OUTFILEおよびLOGコマンドで開いたすべてのファイルが含まれます。

構文

LISTFILES

例10-32 オープン・ファイルのリスト

次の例では、LISTFILESを使用してFILEQUERYファンクションで参照可能なオープン・ファイルを確認する方法を示します。

DEFINE fil.unit VARIABLE INTEGER
fil.unit = FILEOPEN('report' WRITE)
LISTFILES

これらの文によって生成される出力は次のとおりです。

10 w  D:\WINNT35\SYSTEM32\report

LISTNAMES

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

構文

LISTNAMES [AW workspace|'*'] [objtype-list|ALL] -      [SORTED|UNSORTED] [LIKE 'pattern']

パラメータ

AW workspace
AW '*'

リストする対象のオブジェクトがあるアタッチしたワークスペースの名前を指定します。ワークスペース名を指定しない場合、LISTNAMESは現行のワークスペースのオブジェクトをリストします。アナリティック・ワークスペース名のかわりに'*'(アスタリスク)を引数として使用すると、アタッチした各ワークスペースのレポートが個別に生成されます。

objtype-list
ALL

名前をリストする1つ以上のオブジェクトの型(AGGMAP、COMPOSITE、DIMENSION、FORMULA、MODEL、OPTION、PROGRAM、RELATION、VALUESET、VARIABLEおよびWORKSHEET)を指定します。どのオブジェクト型でも、DIMENSIONSなどのように、末尾にSを付加できます。これらのオブジェクト型の順序は任意に指定できます。ALL(デフォルト)を指定すると、これらすべての型のオブジェクトの名前がリストされます。

SORTED
UNSORTED

SORTED(デフォルト、省略形はSORT)を指定すると、オブジェクト名がアルファベット順にソートされます。UNSORTED(省略形はUNSORT)を指定すると、オブジェクト名はアルファベット順にソートされません。

LIKE 'pattern'

アナリティック・ワークスペースの定義の名前と指定したテキスト・パターンを比較して、一致する名前をリストします。対応する文字が一致すると、定義名はテキスト・パターンに類似していると判断されます。リテラルな一致に加えて、LIKEでは文字列の複数の文字に一致するワイルドカード文字を使用できます。パターン内のアンダースコア(_)文字は、任意の1文字に一致します。パターン内のパーセント(%)記号は、任意の数(ゼロ個も含む)の文字に一致します。

使用上の注意

NAMEディメンション

NAMEは、アナリティック・ワークスペース内のオブジェクトのリストの編成に使用される特殊なディメンションです。この値は、現行のワークスペースに定義されているオブジェクトの名前です。

NAMEディメンションの値は明示的に変更できません。この値を変更するには、DEFINE、DELETE、MOVEまたはRENAMEのいずれかの文を実行します。また、現行のワークスペース以外のアナリティック・ワークスペースのNAMEディメンションを指定するために修飾オブジェクト名を使用することはできません。

関連項目:

LISTNAMESプログラム

例10-33 ディメンションのリスト表示

アナリティック・ワークスペースのすべてのディメンションをリスト表示するとします。最初に、LIMITコマンドおよびOBJファンクションを使用して、NAMEディメンションのステータスを制限します。次に、STATUS文を使用して、ディメンションのリストを生成します。OBJ(TYPE)によって返される値は常に大文字なので、それに合せるためにLIMIT文に'dimension'ではなく'DIMENSION'を使用する必要があります。次の文により

LIMIT NAME TO OBJ(TYPE) EQ 'DIMENSION'
STATUS NAME

によって、次の出力が生成されます。

The current status of NAME is:
PRODUCT, DISTRICT, DIVISION, LINE, REGION, MARKETLEVEL, MARKET,
MONTH, YEAR, QUARTER

例10-34 リレーションのリスト表示

アナリティック・ワークスペースのすべてのリレーションの定義を参照するとします。LIMITコマンドおよびOBJファンクションを使用して、その名前を選択します。次に、DESCRIBEコマンドを使用して、その定義のリストを生成します。次の文により

LIMIT NAME TO OBJ(TYPE) EQ 'RELATION'
DESCRIBE

によって、次の出力が生成されます。

DEFINE REGION.DISTRICT RELATION REGION <DISTRICT>
LD REGION for each DISTRICT
 
DEFINE DIVISION.PRODUCT RELATION DIVISION <PRODUCT>
LD DIVISION for each PRODUCT
 
DEFINE MLV.MARKET RELATION MARKETLEVEL <MARKET>
 
DEFINE MARKET.MARKET RELATION MARKET <MARKET>
LD Self-relation for the Market Dimension 

例10-35 DEMOワークスペース・オブジェクトのリスト

この例では、現行のワークスペースのディメンション、変数およびリレーションをリストします。次の文

LISTNAMES dimension variable relation

DEMOワークスペースに関する次の出力が生成されます。

10 DIMENSIONs      18 VARIABLEs       4 RELATIONs
----------------   ----------------   ----------------
DISTRICT           ACTUAL             DIVISION.PRODUCT
DIVISION           ADVERTISING        MARKET.MARKET
LINE               BUDGET             MLV.MARKET
MARKET             DEMOVER            REGION.DISTRICT
MARKETLEVEL        EXPENSE
MONTH              FCST
PRODUCT            INDUSTRY.SALES
QUARTER            NAME.LINE
REGION             NAME.PRODUCT
YEAR               NATIONAL.SALES
                   PRICE
                   PRODUCT.MEMO
                   SALES
                   SALES.FORECAST
                   SALES.PLAN
                   SHARE
                   UNITS
                   UNITS.M 

LOAD

LOADコマンドは、プログラム、計算式またはモデルの各定義をメモリーにロードします。通常、起動プログラムで使用され、セッションで最初にプログラムを使用する際の時間が短縮されます。

構文

LOAD object. . .

パラメータ

object. . .

プログラム、計算式またはモデルの名前。

使用上の注意

最初に使用する時点でロードされる定義

プログラム、計算式およびモデル以外のアナリティック・ワークスペースのオブジェクトは、アナリティック・ワークスペースをアタッチする時点で、メモリーにロードされます。プログラム、モデルおよび計算式は、最初に使用する時点またはLOADコマンドを使用して要求した時点でメモリーにロードします。ロードにはさほど時間がかからないが多少気になる場合、システムを微調整するアプリケーション・ビルダーでオブジェクトを起動プログラムに事前ロードすると、アプリケーションをセッションの最初から高速で稼動できます。

多量のオブジェクトのロードによる影響

メモリーにロードするオブジェクトが多すぎると、Oracle OLAPで長い文を処理する際に、メモリー不足が起こる可能性があります。LOADを使用する場合は必要最低限にし、効率が最大限になるようにオブジェクトを選択してください。

プログラムのコンパイルの必要性

LOADでは、コンパイルされていないプログラムを自動ではコンパイルしません。最善のパフォーマンスを得るには、プログラムは常にコンパイルし、ワークスペースを更新してコンパイル済コードを保存します。これによって、AUTOGOプログラムなどで別のセッションにプログラムをロードした際に、プログラムをすぐに実行できます。コンパイルの詳細は、COMPILEコマンドを参照してください。

例10-36 2つのプログラムのロード

次の文によって、choose.months およびsales.rptの2つのプログラムがロードされます。

LOAD choose.months sales.rpt

例10-37 アナリティック・ワークスペース内のすべてのプログラムのロード

次の文によって、アナリティック・ワークスペース内のすべてのプログラムがロードされます。

LIMIT NAME TO OBJ(TYPE) EQ 'program'
LOAD &VALUES(NAME)

LOGコマンド

LOGコマンドは、ディスク・ファイルへのセッションの記録を開始または停止するコマンドです。入力および出力するすべての行が記録されます。

注意:

LOGコマンドを、同じ名前の算術ファンクションと混同しないでください。

構文

LOG EOF | TRACEFILE | SAVE | {[APPEND] file-name}

パラメータ

EOF

セッションの記録を停止し、開いているすべてのログ記録ファイルを閉じます。

TRACEFILE

TRACEFILEUNITオプションによって識別されるOracleトレース・ファイルにセッション情報が送信されることを指定します。

SAVE

Oracle OLAPによってログ・ファイルが強制的に更新されます。入力行および出力行は、常に生成された時点でディスクに書き込まれるとは限りません。かわりに、それらの行は一時的に格納され、定期的にディスクに書き込まれます。LOG SAVEを指定すると、実際には、LOG EOFおよびLOG APPEND file-nameコマンドが発行され、ログ・ファイルを閉じて再度開くことで、適切なすべての行がディスクに確実に書き込まれます。追加の入力行および出力行はファイルに追加されます。

APPEND

セッションの記録を既存のディスク・ファイルの末尾に追加することを指定します。この引数を省略すると、ファイルの現在の内容は新しい出力によって置き換えられます。

file-name

セッション情報が書き込まれるファイルの名前を表すテキスト式。そのファイルがカレント・ディレクトリにない場合、ファイルの名前にディレクトリ・オブジェクトの名前を含める必要があります。

注意:

ディレクトリ・オブジェクトはデータベースで定義され、ディレクトリおよびディレクトリ内のファイルへのアクセスを制御します。CDA文を使用して、カレント・ディレクトリ・オブジェクトを特定および指定できます。使用するデータベース・ユーザー名で読取りおよび書込み可能なファイルがあるディレクトリ・オブジェクトへのアクセス権については、Oracle DBAに問い合せてください。

使用上の注意

ログ・ファイルを自動で閉じる場合

LOG file-nameを使用してディスク・ファイルへの記録を開始すると、その時点で開いていたすべてのログ記録ファイルを閉じます。この閉じる動作は、新しいファイルが実際には開いていない場合にも実行されます(LOG文に無効なfile-nameを指定した場合と同様です)。

例10-38 ログ・ファイルの保持

session.logというファイルにセッションを記録するには、次のような文を使用します。

LOG 'session.log' 

MAINTAIN

MAINTAINコマンドは、ディメンションの値、コンポジットの値およびパーティション・テンプレート・オブジェクトの値を入力し、メンテナンスするコマンドです。

注意:

MAINTAIN文は、Maintainトリガーを持つサロゲート・ディメンションにも発行できます。この場合、Oracle OLAPでは、Maintainトリガー・プログラムのみが実行され、それ以外のアクションは行われません。詳細は、トリガー・プログラムを参照してください。Maintainトリガーのないサロゲート・ディメンションに対してMAINTAIN文を発行すると、エラーが返されます。

構文

MAINTAIN object {ADD|DELETE|RENAME|MOVE|MERGE} args

MAINTAINコマンドで使用できるキーワードは、オブジェクトごとに次のように異なります。

  • MAINTAIN dimension {ADD|DELETE|RENAME|MOVE|MERGE} args

    使用できるキーワードは、メンテナンスするディメンションの型によって、次のように異なります。

    • 非連結ディメンションでは、ADD、DELETE、RENAME、MOVEまたはMERGEキーワードを使用して、非連結ディメンション値を追加、削除、名前の変更、移動またはマージできます。また、ADDキーワードを使用して、一時計算メンバーをディメンションに追加することもできます。

    • 連結ディメンションで使用できるのは、連結ディメンション値を移動するMOVEキーワードのみです。

  • MAINTAIN composite {ADD|DELETE|MERGE} args

  • MAINTAIN partition-template {ADD|DELETE|MOVE} args

具体的な構文はキーワードによって異なります。したがって、MAINTAINコマンドの各キーワードについては、次のように個別に説明します。

MAINTAINコマンド全般に関する情報は、このトピックの使用上の注意を参照してください。

使用上の注意

MAINTAINを実行した際のトリガー・プログラムの実行

TRIGGERコマンドを使用すると、MAINTAIN文の実行を、OLAP DMLプログラムを自動的に実行するイベントにすることができます。詳細は、トリガー・プログラムを参照してください。

ステータスの自動リセット

現行のステータスがALLでないディメンションまたはコンポジットをADD、DELETE、MERGEまたはMOVEキーワードでメンテナンスすると、MAINTAINコマンドによって、メンテナンスを実行する前にステータスが自動でALLにリセットされます。ただし、現行のステータスがALLでないディメンションをRENAMEキーワードでメンテナンスする場合には、ディメンションのステータスはMAINTAINコマンドによって変更されません

メンテナンス権限

PERMIT MAINTAIN文によってディメンションのメンテナンス権限が拒否される場合は、ディメンションに対するメンテナンスは実行できません。ディメンションの読取り権限が制限されていると、そのディメンションのメンテナンス権限を指定しても、メンテナンス権限は常に暗黙的に拒否されます。(PERMITコマンドを参照してください。)

マルチライタ・モードのアナリティック・ワークスペースにおけるディメンションのメンテナンス

マルチライタ・モードでアタッチしたアナリティック・ワークスペース内のディメンションをメンテナンスする際は、次の点に注意してください。

  • ディメンションのいずれかがすでに取得および変更された場合は、変数を更新できません。

  • ディメンション値を追加してからディメンションを元に戻すと、そのディメンションによってディメンション化された変数の領域割当てが最適ではなくなることがあるためお薦めしません。

  • 取得済変数がメンテナンス済の取得したディメンションによってディメンション化されている場合、そのディメンションが更新または解放されるまで変数を更新できません。

  • メンテナンスのためにコンポジットを取得する必要はありません。コンポジットのディメンションには、Oracle OLAPによって自動で同時にディメンションのメンテナンスが実行されます。

マルチライタ・モードでアタッチしたアナリティック・ワークスペース内のディメンションをメンテナンスするには、まずACQUIRE文を使用してディメンションを取得する必要があります。

たとえば、ユーザーAとユーザーBが、actualsbudgetの両方についてそれぞれwhat-if計算を実行する必要があるとします。what-if計算の実行後、ユーザーAはactualsを、ユーザーBはbudgetを変更する必要があります。最後に、ユーザーAとユーザーBはどちらも、新しいtimeディメンション値を追加し、その新しいディメンション値に対応するデータをactualsまたはbudgetに追加する必要があります。

ユーザーAが次のOLAP DML文を発行します。

AW ATTACH myworkspace MULTI
...make modifications 
ACQUIRE actuals
...make more modifications
ACQUIRE time
MAINTAIN time ADD 'Y2002'
actuals (time 'Y2002', ...) = ...
UPDATE MULTI actuals, time
COMMIT
RELEASE actuals, time
AW DETACH myworkspace

ユーザーBが次のOLAP DML文を発行します。

AW ATTACH myworkspace MULTI
...make modifications 
ACQUIRE budget
...make more modifications
ACQUIRE time--> failed
ACQUIRE RESYNC time WAIT
MAINTAIN time ADD 'Y2003'
budget (time 'Y2003', ...) = ...
UPDATE MULTI budget, time
COMMIT
RELEASE budget, time
AW DETACH myworkspace

MAINTAINとディメンション・サロゲート

ディメンション・サロゲートでは、MAINTAIN文を使用できません。MAINTAINは、ディメンションへの値の追加や、ディメンションからの値の削除でのみ使用できます。ただし、ディメンション値を追加または削除すると、Oracle OLAPは、自動でそのディメンションのサロゲートに位置を追加またはサロゲートから位置を削除します。ディメンションに位置を追加すると、そのディメンションのサロゲートの対応する位置にNA値が追加されます。

連結ディメンションのメンテナンス

連結ディメンションには、そのコンポーネントのディメンションの値が含まれます。連結ディメンションの値は、直接MAINTAIN文で追加、マージまたは削除されません。かわりに、連結のコンポーネントのディメンションに対し値を追加、マージまたは削除すると、連結ディメンションに値が自動で追加またはディメンションから値が削除されます。ただし、MAINTAINコマンドでMOVEキーワードを指定し、連結ディメンションの値の順序を変更することは可能です。

MAINTAIN ADD

MAINTAINコマンドでADDキーワードを使用すると、非連結ディメンション、コンポジットまたはパーティションに新しいTEXT値、ID値およびINTEGER値を追加したり、ディメンションに新しい一時計算メンバーを追加したりできます。

注意:

TEXT値、ID値およびINTEGER値に対するMAINTAIN ADD文は、Maintainトリガーを持つサロゲート・ディメンションにも発行できます。この場合、Oracle OLAPでは、Maintainトリガー・プログラムが各値に対して1回ずつ実行され、それ以外のアクションは行われません。詳細は、トリガー・プログラムを参照してください。Maintainトリガーのないサロゲート・ディメンションに対してMAINTAIN文を発行すると、エラーが返されます。

構文

ADDキーワードを使用するMAINTAINコマンドの構文は、メンテナンスするオブジェクトの型、および追加するメンバーが永続的か一時的かによって異なります。

そのため、MAINTAIN ADDについては、次のように個別に説明します。

TEXT値、ID値およびINTEGER値に対するMAINTAIN ADD

MAINTAINコマンドでADDキーワードを使用すると、非連結ディメンションまたはコンポジットに新しいTEXT値、ID値またはINTEGER値を追加できます。

注意:

MAINTAIN ADD文は、Maintainトリガーを持つサロゲート・ディメンションにも発行できます。この場合、Oracle OLAPでは、Maintainトリガー・プログラムがvaluelistの各値に対して1回ずつ実行され、それ以外のアクションは行われません。詳細は、トリガー・プログラムを参照してください。Maintainトリガーのないサロゲート・ディメンションに対してMAINTAIN文を発行すると、エラーが返されます。

構文

MAINTAIN composite|dimension ADD valuelist [FIRST|LAST|BEFORE position|AFTER position]

パラメータ

dimension

アタッチしたアナリティック・ワークスペースで定義されている非連結ディメンション。

composite

コンポジット。コンポジットが名前付きコンポジットの場合、アタッチしたアナリティック・ワークスペースで定義されている必要があります。コンポジットが名前のないコンポジットの場合は、アタッチしたアナリティック・ワークスペースでオブジェクトの定義に使用されている必要があります。名前のないコンポジットを参照するには、SPARSEキーワードを使用します(SPARSE <market product>など)。

ADD valuelist

ディメンションまたはコンポジットにvaluelistの値を追加することを指定します。

  • この引数を使用してTEXT型またはID型のコンポジットまたはディメンションに値を追加する場合、valuelistはテキスト・リテラル、TEXT式、ID式のいずれかになります。複数行のテキスト式の場合は、各要素(行)は個別の値として処理されます。nullディメンション値(空の一重引用符)または空白のみの値は、後でその値を参照できないので、追加しないでください。

  • dimensionがINTEGERの場合、valuelistは5や100などのINTEGERになります。

FIRST
LAST

ディメンション値を追加する論理位置を指定します。FIRSTは、新しい値を既存値の前に挿入することを示します。LASTは、新しい値を現行の値の後に追加することを示します。LASTがデフォルトです。INTEGERディメンションに一定量のINTEGER値を追加すると、それらのINTEGER値は(仕様に応じて)既存のINTEGER値の前または後に追加され、それら一連のすべてのINTEGER値が自動で数字順にソートされます。

指定した値は、文のキーワードの直前にある値のみではなく、キーワードFIRSTまたはLASTの前に指定したすべての値がその位置に配置されます。

BEFORE position
AFTER position

値を前または後に追加する基準の位置を指定します。positionには、既存のディメンション値、既存のディメンション値を値とする文字式、またはディメンション値の位置を表すINTEGER式を指定できます。INTEGERディメンションに一定量のINTEGER値を追加すると、それらのINTEGER値は指定したINTEGER位置の前または後に追加され、それら一連のすべてのINTEGER値が自動で数字順にソートされます。

指定した値は、文のキーワードの直前にある値のみではなく、キーワードBEFOREまたはAFTERの前に指定したすべての値がその位置に配置されます。

使用上の注意

MAINTAIN ADD BEFOREまたはAFTER positionを使用する場合のパフォーマンス

MAINTAIN ADD BEFORE文またはMAINTAIN MOVE AFTER文を使用する場合のコスト・パフォーマンスは、追加される値の数ではなく、ディメンション内の値の数によって異なります。したがって、これらの文を多く連ねて発行するかわりに、次のようにします。

  1. 単純なMAINTAIN ADD文を使用して値を追加します。

  2. ディメンション・ステータスのステータスを目的の値に設定します。

  3. 単独のMAINTAIN MOVE dimension value文を発行して、追加した値を並べ替えます。

INTEGERディメンションへの値の追加

MAINTAINを使用してINTEGERディメンションの値を追加すると、INTEGER値の通常の順序(1、2、3...)になるように値の位置番号が変更されます。

結合ディメンションとコンポジット

結合ディメンションまたはコンポジットの各値は、そのディメンション・リストの各ディメンション(および存在する場合はコンポジット)からの値の組合せです。結合ディメンションまたはコンポジットに値を追加するには、各値の組合せを山カッコで囲んで指定します。指定した組合せの値は、結合ディメンションまたはコンポジットの定義にあるディメンションおよびコンポジットと同じ順序である必要があります。また、組合せの各ディメンション値は、対応するベース・ディメンションに値としてすでに存在している必要があります。ただし、組合せにコンポジット値が存在しない場合、Oracle OLAPによって、その値は適切なコンポジットに自動で追加されます。

例10-39 TEXTディメンションへの値の追加

次の文では、cityディメンションのディメンション値の最後にOmahaおよびSeattleが追加されます。

MAINTAIN city ADD 'Omaha' 'Seattle'

次の文では、cityリストの最初にAtlantaが追加され、Omahaの後にPeoriaが挿入されます。

MAINTAIN city ADD 'Atlanta' FIRST, 'Peoria' AFTER 'Omaha'

ここでは、TEXT変数textvarの値を、cityの5番目のディメンション値の前に挿入します。ディメンション値を大文字と小文字を区別する表記にしているため、値Columbustextvarに代入する際は、大文字と小文字を使用した表記とすることに注意してください。

textvar = 'Columbus'
MAINTAIN city ADD textvar BEFORE 5

例10-40 結合ディメンションへの値の追加

次の文は、結合ディメンションに値を追加する例です。

DEFINE proddist DIMENSION <product, district>
MAINTAIN proddist ADD <'Tents' 'Boston'> <'Footwear' 'Denver'>

ベース・ディメンションの値をテキスト変数に代入し、山カッコ内の変数の名前を使用することもできます。

prodname = 'Canoes'
distname = 'Seattle'
MAINTAIN proddist ADD <prodname, distname>
DAY値、WEEK値、MONTH値、QUARTER値およびYEAR値に対するMAINTAIN ADD

MAINTAINコマンドでADDキーワードを使用して、DAY、WEEK、MONTH、QUARTERおよびYEAR型のディメンションに新しい値を追加できます。

構文

MAINTAIN dimension ADD {valuelist|{n PERIODS FIRST}|{n PERIODS LAST}}

パラメータ

dimension

アタッチしたアナリティック・ワークスペースで定義されている非連結ディメンション。

ADD valuelist

ディメンションにvaluelistの値を追加することを指定します。dimensionがDAY、WEEK、MONTH、QUARTER、YEAR型の場合、valuelistはテキスト定数、TEXT式、ID式、DATE式のいずれかになります。値がTEXTの場合、ディメンションのVNF(値名書式)で指定されている書式(ディメンションにVNFがない場合は、メンテナンスするディメンションの型に対するデフォルト書式)または日付値の有効な入力形式で指定します。値をTEXT式として指定する場合は、各要素または各行は個別の値として処理されます。

値がVNFの書式またはディメンションの型に対するデフォルト書式で指定されている場合、各値は追加する期間を明示的に示します。たとえば、monthディメンションのVNFが'<MTXT><YY>'だとします。この場合、値JAN99は1999年の1月を表します。

DAY、WEEK、MONTH、QUARTER、YEAR型のディメンションの値を日付として指定する際は、メンテナンスするディメンションの型に適した日付コンポーネントのみを指定する必要があります。DAYまたはWEEKディメンションでは、日、月および年の各コンポーネントを指定する必要があります。MONTHまたはQUARTERディメンションでは、月および年のみを指定します(1998年6月の場合は'JUN98'または'0698'など)。YEARディメンションでは、年のみを指定します(1998年の場合は'98'など)。日付の有効な入力形式の詳細は、DATEORDERオプションを参照してください。

完全な日付を表すDATE式またはTEXT値を指定してディメンション値を追加する場合は、追加する期間内にある任意の日付を指定できます。たとえば、1999年の1月を追加するには、'01JAN99'から'31JAN99までのどの日付でも指定できます。指定された値があいまいな場合、Oracle OLAPでは、DATEORDERオプションを使用して解決します。

値が指定されていないDAY、WEEK、MONTH、QUARTER、YEAR型のディメンションに値を追加する際は、ディメンションに追加する最初の値および最後の値のみを指定します。Oracle OLAPによって、その期間内を埋める適切な値が自動で代入されます。

DAY、WEEK、MONTH、QUARTER、YEAR型のディメンションにすでに値がある場合は、既存のリストの先頭または末尾にのみ値を追加できます。値を追加する際は、追加する最初の値または最後の値のみを指定します。Oracle OLAPによって、既存のリストと指定した値の間の期間を埋める適切な値が自動で代入されます。

n PERIODS FIRST
n PERIODS LAST

ディメンション値の先頭または末尾に追加する期間の数を指定します。

例10-41 QUARTER型のディメンションへの値の追加

この例では、 qtrという名前の新しいQUARTERディメンションを定義し、1998年および1999年の四半期のディメンション値を追加します。最初と最後のディメンション値のみを追加します。その間の値はOracle OLAPによって自動で代入されます。最初と最後の四半期を追加するには、それらの四半期内の任意の日付を指定します。

DEFINE qtr DIMENSION QUARTER
MAINTAIN qtr ADD '01jan98' '31dec99'
MAINTAIN ADD SESSION

MAINTAINコマンドでADD SESSIONキーワードを使用すると、ディメンションに一時計算メンバーを追加し、指定したオブジェクトにそのメンバーを適用したり、指定したオブジェクトに事前定義されている計算メンバーを適用できます。あるセッションで作成された計算メンバーとその定義は、そのセッション後に削除されるため、他のセッションでは継続されません。

構文

MAINTAIN dimension ADD SESSION member_name [= calculation] -       [STEP DIMENSION (stepdim...)][apply-to]

ここで

  • calculationは次のいずれかです。

    • model-equation
    • AGGREGATION (dimension-members....)
  • apply-toは、次のいずれかの句を使用して、カスタム集計を追加する際の基礎を指定します。

    • APPLY TO AGGMAP aggmaps
    • APPLY FOR VARIABLE variables
    • APPLY WITH RELATION relations

パラメータ

dimension

アタッチしたアナリティック・ワークスペースで定義されているディメンション。dimensionには、一意でない連結ディメンション、または一意および一意でない連結ディメンションのベース・ディメンション以外のすべての型のディメンションを指定できます。

ADD SESSION

ADD SESSIONは、一時計算メンバーのメンテナンスを示します。

member-name

一時計算メンバーの名前を指定します。

=

新しい計算メンバーを定義することを示します。

model-equation

カスタム・メンバー値を計算するための動的モデルとして使用する計算を指定するテキスト式。(モデル方程式の詳細は、SETコマンドを参照してください。)

AGGREGATION

指定したディメンション・メンバーを使用するカスタム集計として、一時計算メンバーを追加することを示します。この句は、dimensionでディメンション化した変数の集計仕様であるaggmapオブジェクトのRELATION文を変更します。したがって、AGGREGATION句を含むMAINTAIN ADD SESSION文には、APPLY WITH RELATION句も含まれている必要があります。

dimension-members

カスタム集計で使用する1つ以上のディメンション値を指定するテキスト式。リテラルで複数のディメンション・メンバーを指定する場合は、値をカンマで区切ります。

STEP DIMENSIONS

計算が時系列のファンクションであることを示します。

stepdim

時系列ファンクションの計算を行うディメンションを指定するテキスト式。リテラルで複数のディメンション名を指定する場合は、名前をカンマで区切ります。

APPLY TO AGGMAP

指定したaggmapオブジェクトで使用されるディメンションにのみ、一時計算メンバーを追加することを示します。

aggmaps

一時計算メンバーを追加する先の1つ以上のaggmapオブジェクトの名前を指定するテキスト式。リテラルで複数のaggmapオブジェクトを指定する場合は、名前をカンマで区切ります。一時計算メンバーは、指定したaggmapオブジェクトのそれぞれに追加されます。

APPLY FOR VARIABLE

指定したvariablesのデフォルトaggmapオブジェクトで使用されるディメンションにのみ、一時計算メンバーを追加することを示します。

variables

一時計算メンバーを追加する先の1つ以上の変数名を指定するテキスト式。リテラルで複数の変数名を指定する場合は、名前をカンマで区切ります。一時計算メンバーは、指定した変数のそれぞれのデフォルトaggmapオブジェクトに追加されます。

注意:

指定した変数にデフォルトのaggmapがない場合、この句を使用するとエラーが発生します。変数にデフォルトのaggmapを指定するには、AGGMAP SETまたは$AGGMAPを使用します。

APPLY WITH RELATION

指定したrelationのRELATION文を含む集計仕様で使用されるディメンションに、一時計算メンバーが追加されることを示します。

relation

AGGMAP文にRELATION文があるリレーションの名前を指定するテキスト式。

使用上の注意

一時計算メンバーについての情報の検索

MAINTAIN文で一時計算メンバーを追加した後、AGGMAPINFOを使用すると、追加した一時計算メンバー、メンバーの計算に使用される方程式、カスタム・メンバーを計算する方程式の右側で使用されるディメンション・メンバーをそれぞれ確認できます。

例10-42 集計値を使用した計算ディメンション・メンバーの作成

アナリティック・ワークスペースに、次の定義と永続値を持つletterというディメンションおよびmy_quantityという変数があるとします。

DEFINE letter DIMENSION TEXT
DEFINE my_quantity VARIABLE DECIMAL <letter>

LETTER                  MY_QUANTITY
-------------- ------------------------------
A                                       10.00
B                                      100.00

次の手順で、letterディメンションに一時ディメンション・メンバーを定義し、これらのメンバーのmy_quantityのデータを集計できます。

  1. 実行する集計を決定し、必要な補助オブジェクトを定義および移入します。

    1. letterディメンションに空の親子関係を作成します。

      DEFINE letter.parentrel RELATION letter <letter>
      
      LETTER                LETTER.PARENTREL
      -------------- ------------------------------
      A              NA
      B              NA
      
    2. letter ディメンションと関連付けられている値を計算するために使用する簡単なモデルを定義します。

      DEFINE my_model MODEL
      MODEL 
        DIMENSION letter
       END
      
    3. letterディメンションと関連付けられているmy_quantity値を計算するために使用する簡単なaggmapを定義し、そのaggmapをコンパイルします。

      DEFINE my_aggmap AGGMAP
      AGGMAP 
         RELATION letter.parentrel PRECOMPUTE(NA)
         MODEL my_model PRECOMPUTE(NA)
        END
      
      COMPILE my_aggmap
      
    4. 変数を定義し、カスタム集計の定義を含めます。この新しい変数は、デフォルトのaggmapとしてmy_aggmapを持つことを除き、my_quantityと同一です。

      DEFINE my_quantity_definition VARIABLE DECIMAL <letter>
      
      CONSIDER my_quantity_definition
      PROPERTY '$AGGMAP' 'my_aggmap'
      
      REPORT my_quantity_definition
      
      LETTER             MY_QUANTITY_DEFINITION
      -------------- ------------------------------
      A                                          NA
      B                                          NA
      
  2. letterディメンションに一時メンバーを追加し、それらのメンバーに対する変数値の計算方法を指定します。

    MAINTAIN letter ADD SESSION 'C' = 'A' * 'B'
    MAINTAIN letter ADD SESSION 'D' = AGGREGATION('A', 'B') -
        APPLY TO AGGMAP my_aggmap
    MAINTAIN letter ADD SESSION 'E' = 'C' + 'D' -
        APPLY WITH RELATION letter.parentrel
    MAINTAIN letter ADD SESSION 'F' = 10 * 'E' -
        APPLY FOR VARIABLE my_quantity_definition
    

    letterディメンションのレポートに、新しいディメンション・メンバーが表示されます。

    LETTER
    --------------
    A
    B
    C
    D
    E
    F
    
  3. my_aggmapというaggmapオブジェクトを使用してmy_quantityを集計します。

    REPORT AGGREGATE(my_quantity USING my_aggmap)
    
                    AGGREGATE(MY_QUANTITY USING
    LETTER                   MY_AGGMAP)
    -------------- ------------------------------
    A                                       10.00
    B                                      100.00
    C                                    1,000.00
    D                                      110.00
    E                                    1,110.00
    F                                   11,100.00
    

ここで、UPDATE文とCOMMIT文を発行して、アナリティック・ワークスペースを更新およびコミットするとします。次に、アナリティック・ワークスペースをデタッチし、セッションを終了します。

その後、新しいセッションを開始し、同じアナリティック・ワークスペースをアタッチします。アナリティック・ワークスペースの説明を確認すると、UPDATEを発行した時点でアナリティック・ワークスペースにあったオブジェクトがすべてそのまま維持されていることがわかります。

DEFINE LETTER DIMENSION TEXT

DEFINE LETTER.PARENTREL RELATION LETTER <LETTER>

DEFINE MY_QUANTITY VARIABLE DECIMAL <LETTER>

DEFINE MY_MODEL MODEL
MODEL
DIMENSION letter
END

DEFINE MY_AGGMAP AGGMAP
AGGMAP
RELATION letter.parentrel PRECOMPUTE(NA)
MODEL my_model PRECOMPUTE(NA)
END

DEFINE MY_QUANTITY_DEFINITION VARIABLE DECIMAL <LETTER>

しかし、letterディメンションおよびmy_quantity変数についてのレポートを見ると、前のセッションで追加した一時ディメンション・メンバーと、それらのメンバーと関連するmy_quantity変数の値は存在していません。

LETTER
--------------
A
B

REPORT letter.parentrel

LETTER                LETTER.PARENTREL
-------------- ------------------------------
A              NA
B              NA

REPORT my_quantity

LETTER                  MY_QUANTITY
-------------- ------------------------------
A                                       10.00
B                                      100.00

LETTER             MY_QUANTITY_DEFINITION
-------------- ------------------------------
A                                          NA
B                                          NA

REPORT AGGREGATE(my_quantity USING my_aggmap)

                AGGREGATE(MY_QUANTITY USING
LETTER                   MY_AGGMAP)
-------------- ------------------------------
A                                       10.00
B                                      100.00
MAINTAIN ADD TO PARTITION

MAINTAIN ADD TO PARTITION文は、事前移入されたディメンション値またはコンポジット値を、事前定義されたパーティション・テンプレート・オブジェクトのパーティションに追加する文です。

ヒント:

パーティション変数がすでに移入されている場合は、MAINTAIN MOVE TO PARTITIONを使用してパーティション値をメンテナンスします。

構文

MAINTAIN partition-template ADD TO PARTITION partition valuelist

パラメータ

partition-template

事前定義されたパーティション・テンプレート・オブジェクトの名前を示すテキスト式。

ADD TO PARTITION

値をパーティションに追加することを指定します。

partition

partition-templateで指定したパーティション・テンプレートにある事前定義されたパーティションの名前を示すテキスト式。

valuelist

追加する値を指定するテキスト・リテラル、TEXT式またはID式。TEXT式の場合、各要素(行)は個別の値として処理されます。式の値は、入力したとおりに追加されます。

連結ディメンションの場合、連結ディメンションの値、もしくはコンポーネント・ディメンションの名前とそのディメンションの値または位置を指定できます。valueの値として、ディメンション・サロゲートの値を使用できます。

INTEGERディメンションのパーティション化はできないことに注意してください。

TO

値の範囲を示します。

パーティションへの値の追加の例は、例10-48を参照してください。

MAINTAIN DELETE

MAINTAINコマンドでDELETEキーワードを使用すると、非連結ディメンションおよびコンポジットからメンバーを削除できます。または、変数をディメンション化するパーティション・テンプレートのパーティションに定義されているディメンション値またはコンポジット値を変更するために、事前にパーティション化した変数のデータをパーティションから削除します。

注意:

MAINTAIN DELETE文は、Maintainトリガーを持つサロゲート・ディメンションにも発行できます。この場合、Oracle OLAPでは、Maintainトリガー・プログラムのみが実行され、それ以外のアクションは行われません。詳細は、トリガー・プログラムを参照してください。Maintainトリガーのないサロゲート・ディメンションに対してMAINTAIN文を発行すると、エラーが返されます。

構文

MAINTAINコマンドのDELETEキーワードを使用してメンバーを削除する際の構文は、メンバーを削除するオブジェクトのタイプによって異なります。そのため、MAINTAIN DELETEについては、次のように個別に説明します。

ディメンションのMAINTAIN DELETE

MAINTAINコマンドでDELETEキーワードを使用すると、非連結ディメンションからディメンション・メンバーを削除できます。

注意:

MAINTAIN DELETE文は、Maintainトリガーを持つサロゲート・ディメンションにも発行できます。この場合、Oracle OLAPでは、Maintainトリガー・プログラムのみが実行され、それ以外のアクションは行われません。詳細は、トリガー・プログラムを参照してください。Maintainトリガーのないサロゲート・ディメンションに対してMAINTAIN文を発行すると、エラーが返されます。

構文

MAINTAIN dimension DELETE limit-clause

パラメータ

dimension

値が削除されるアタッチしたアナリティック・ワークスペースで定義されている非連結ディメンション。

注意:

MAINTAIN DELETEコマンドのdimension引数として、ディメンション・サロゲートは使用できません。ただし、limit-clauseパラメータ内で値としてディメンション・サロゲートを使用することは可能です。

limit-clause

ディメンションから削除する値を指定します。

limit-clauseの構文は、各種LIMITコマンドにおけるlimit-clause引数の構文(つまり、LIMITコマンドの「TO」などのlimit-type引数の後の構文)と同じです。これらの引数の構文については、LIMITコマンド(値を使用)LIMITコマンド(LEVELRELを使用)LIMIT(親リレーションを使用)LIMITコマンド(関連ディメンションを使用)LIMITコマンド(NOCONVERTを使用)およびLIMITコマンド(POSLISTを使用)を参照してください。

使用上の注意

ディメンションからの一時計算メンバーの削除

MAINTAIN DELETE文を使用して一時計算メンバーを削除すると、Oracle OLAPによって次の処理が実行されます。

  1. ディメンションからメンバーが削除されます。

  2. 対応する計算を含むすべてのaggmapオブジェクトから計算が削除されます。

INTEGERディメンションの値の削除

MAINTAINを使用してINTEGERディメンションの値を削除すると、INTEGER値の通常の順序(1、2、3...)になるように値の位置番号が変更されます。

例10-43 値によるディメンション値の削除

次の文では、cityの値からOmahaおよびNewarkを削除します。

MAINTAIN city DELETE 'Omaha' 'Newark'

例10-44 最初の5つのディメンション値の削除

この例では、INTEGER変数intvarを使用して、ディメンション cityから最初の5都市を削除します。

intvar = 5
MAINTAIN city DELETE FIRST intvar

例10-45 ブール式に基づくディメンション値の削除

ここでは、cityから、人口が75,000人より少ないすべての都市を削除します。各都市の人口のデータが含まれている、変数population.cを使用します。

MAINTAIN city DELETE population.c LT 75000

例10-46 サロゲートを使用して値を指定したディメンション値の削除

prodidNUMBERディメンションで、prodtypeprodidTEXTディメンション・サロゲートであるとします。また、prodidの値が、1740および56であるとします。prodtypeの値は、Two-Person TentThree-person TentおよびFour-person Tentです。次の文で、prodidおよびそのサロゲートから値を削除します。

MAINTAIN prodid DELETE prodid(prodtype 'Three-Person Tent')

例10-47 関連するMONTH値の削除

この例では、関連ディメンションquarterを使用して、ディメンションmonthの値を削除します。現行のステータス内にある月で、quarterの値に関連するすべての月を削除します。

LIMIT quarter TO FIRST 1

MAINTAIN month DELETE quarter

コンポジットのMAINTAIN DELETE

MAINTAINコマンドでDELETEキーワードを使用すると、コンポジットからディメンション・メンバーを削除できます。

構文

MAINTAIN composite DELETE comp-arg

ここで、comp-argは次のいずれか1つです。

  • valuelist
  • ALL
  • base-dim [valuelist]
  • boolean-expression
  • {TOP | BOTTOM} BASEDON exp
  • {TOP | BOTTOM} n-percent PERCENTOF expression
  • LONGLIST

パラメータ

composite

値を削除するコンポジット。コンポジットが名前付きコンポジットの場合、アタッチしたアナリティック・ワークスペースで定義されている必要があります。コンポジットが名前のないコンポジットの場合は、アタッチしたアナリティック・ワークスペースでオブジェクトの定義に使用されている必要があります。

名前のないコンポジットを参照するには、SPARSEキーワードを使用します(SPARSE <market product>など)。

valuelist

コンポジットから削除する1つ以上の値を指定します。valuelistは、テキスト定数またはテキスト式です。

ALL

すべてのコンポジット値を削除しますが、コンポジット自体の定義は削除しません

base-dim [valuelist]

リストしたコンポジットのベース・ディメンション値を含む値を削除します。引数valuelistには、単一の値、値のリスト、または値の範囲(TOを使用して値範囲を指定)を指定できます。値の範囲の指定には、位置番号は使用できません。valuelistを指定しない場合、Oracle OLAPでは、現行のステータスにあるbase-dim値を含むすべての値が削除されます。

boolean-expression

ブール式がTRUEのすべてのコンポジット値を削除します。boolean-expressionは、値を削除するdimensionまたはcompositeによってディメンション化されている必要があります。また、他にもディメンションがある場合は、それらのステータスがそれぞれ1つの値に制限されている必要があります。

TOP n BASEDON exp
BOTTOM n BASEDON exp

expの最上位(TOP)または最下位(BOTTOM)に基づいて、上位または下位n個の値を削除します。式は、値を削除するcompositeによってディメンション化されている必要があります。また、他にもディメンションがある場合は、それらのステータスがそれぞれ1つの値に制限されている必要があります。

BOTTOM n-percent PERCENTOF expression
TOP n-percent PERCENTOF expression

ある基準に基づいて最上位または最下位の値を検索し、値を削除します。この構成では、値は式に対する占有率に基づいてソートされ、削除されます。

LONGLIST

削除する対象の個別の値の長いリスト(2,000値まで)を示します。値が300より少ない場合、LONGLISTは必要ありません。

MAINTAIN DELETE FROM PARTITION

MAINTAIN DELETE FROM PARTITIONコマンドは、変数をディメンション化するパーティション・テンプレートのパーティションに定義されているディメンション値またはコンポジット値を変更するために、事前にパーティション化した変数のデータをパーティションから削除するコマンドです。

ヒント:

パーティション変数がすでに移入されている場合は、MAINTAIN MOVE TO PARTITIONを使用してパーティション値をメンテナンスします。

構文

MAINTAIN partition-template DELETE FROM PARTITION partition { dim-arg| comp-arg}

パラメータ

partition-template

事前定義されたパーティション・テンプレート・オブジェクトの名前を示すテキスト式。

partition

partition-templateで指定したパーティション・テンプレートにある事前定義されたパーティションの名前を示すテキスト式。

DELETE FROM PARTITION

パーティションおよびそのパーティションを含むパーティション・テンプレートを使用してディメンション化したパーティション変数から削除する値を指定します。

dim-args

パーティション変数の値を削除して、パーティションの値を再定義する際に使用するディメンション値を指定します。ディメンションのMAINTAIN DELETEで使用する dim-arg引数に指定する構成を使用できます。

comp--args

パーティション変数の値を削除して、パーティションの値を再定義する際に使用するコンポジット値を指定します。コンポジットのMAINTAIN DELETEで使用するcomp-arg引数に指定する構成を使用できます。

例10-48 パーティション値の追加と削除

アナリティック・ワークスペースに次のオブジェクトが定義されているとします。

DEFINE time DIMENSION TEXT
DEFINE time_parentrel RELATION time <time>
DEFINE product DIMENSION TEXT
DEFINE partition_sales_by_year PARTITION TEMPLATE <time product> -
   PARTITION BY LIST (time) -
    (PARTITION time_2004 VALUES ('2004', 'Dec2004', 'Jan2004', '31Dec2004', - 
          '01Dec2004', '31Jan2004', '01Jan2004') <TIME PRODUCT> -
     PARTITION time_2003 VALUES ('2003', 'Dec2003', 'Jan2003', '31Dec2003', -
         '01Dec2003', '31Jan2003', '01Jan2003') <TIME PRODUCT> -
     PARTITION time_2002 VALUES ('2002', 'Dec2002', 'Jan2002', '31Dec2002', -
         '01Dec2002', '31Jan2002', '01Jan2002') <TIME PRODUCT>)

sales値がある年のすべての時刻値でディメンションされている値をパーティション内に含めるのではなく、各日付値およびサマリーの時刻値(月および年)ごとのパーティションが必要だとします。この新しいパーティション・スキーマが反映されるようにpartition_sales_by_year を変更するには、次の文を発行します。

"Create the new partition
CHGDFN partition_sales_by_year DEFINE -
         (PARTITION partition_month_years VALUES () <time product>)
"Delete the values for months and years from the partitions for years
MAINTAIN partition_sales_by_year DELETE FROM PARTITION time_2004 '2004'- 
        'Dec2004' 'Jan2004'
MAINTAIN partition_sales_by_year DELETE FROM PARTITION time_2003 '2003'-
        'Dec2003''Jan2003'
MAINTAIN partition_sales_by_year DELETE FROM PARTITION time_2002 '2002'-
       'Dec2002' 'Jan2002'
"Add the month and year values to the new partition for summary values
MAINTAIN partition_sales_by_year ADD TO PARTITION partition_month_years '2004'-
      'Dec2004' 'Jan2004' '2003' 'Dec2003''Jan2003' '2002' 'Dec2002' 'Jan2002'

これによって、partition_sales_by_year パーティション・テンプレート・オブジェクトの定義は次のようになります。

DEFINE PARTITION_SALES_BY_YEAR PARTITION TEMPLATE <TIME PRODUCT> -
   PARTITION BY LIST (TIME) -
    (PARTITION TIME_2004 VALUES ('31Dec2004', '01Dec2004', '31Jan2004', -
       '01Jan2004') <TIME PRODUCT> -
     PARTITION TIME_2003 VALUES ('31Dec2003', '01Dec2003', '31Jan2003', -
       '01Jan2003') <TIME PRODUCT> -
     PARTITION TIME_2002 VALUES ('31Dec2002', '01Dec2002', '31Jan2002', -
       '01Jan2002') <TIME PRODUCT> -
     PARTITION PARTITION_MONTH_YEARS VALUES ('2004', 'Dec2004', 'Jan2004', -
       '2003', 'Dec2003', 'Jan2003', '2002', 'Dec2002', 'Jan2002')-
         <TIME PRODUCT>)

MAINTAIN MERGE

MAINTAINコマンドでMERGEキーワードを使用すると、別のリスト上のすべてディメンション値またはコンポジット値を、非連結ディメンションまたはコンポジットに簡単かつ確実にまとめることができます。MAINTAINコマンドでMERGEキーワードを使用すると、自動でリストから新しい値のみが追加され、重複する値は無視されます。大量のディメンション値を入力する際、この方法で入力すると、時間を大幅に節約できます。

MERGEは、DAY、WEEK、MONTH、QUARTERおよびYEAR型のディメンションを含む、あらゆるデータ型のディメンションで使用できます。ただし、Oracle OLAPでは、DAY、WEEK、MONTH、QUARTERおよびYEAR型のディメンションの値の追加はADDキーワードでも簡単にできるため、これらのディメンションでは、MERGEキーワードはTEXTまたはID型のディメンションでの場合ほど有用でない場合もあります。

ディメンションに値をマージすると同時に、そのディメンションに関連するリレーションを更新することもできます。

注意:

MAINTAIN MERGE文は、Maintainトリガーを持つサロゲート・ディメンションにも発行できます。この場合、Oracle OLAPでは、Maintainトリガー・プログラムがexpの各値に対して1回ずつ実行され、それ以外のアクションは行われません。詳細は、トリガー・プログラムを参照してください。Maintainトリガーのないサロゲート・ディメンションに対してMAINTAIN文を発行すると、エラーが返されます。

構文

MAINTAIN dimension|composite MERGE exp [RELATE relation]

dimension

値を入力または変更するアタッチしたアナリティック・ワークスペースで定義されている非連結ディメンション。

composite

値を追加、削除またはマージするコンポジット。コンポジットが名前付きコンポジットの場合、アタッチしたアナリティック・ワークスペースで定義されている必要があります。コンポジットが名前のないコンポジットの場合は、アタッチしたアナリティック・ワークスペースでオブジェクトの定義に使用されている必要があります。名前のないコンポジットを参照するには、SPARSEキーワードを使用します(SPARSE <market product>など)。

exp

dimensionとマージする値の式を指定しますが、たとえば、ディメンション値を含むディメンション化されたテキスト変数の名前や、ディメンション値の複数行のリストを値とする単一セルのテキスト変数の名前などです。MAINTAIN MERGEでは、exp のNAは無視されます。dimensionがINTEGERディメンションの場合は、expにはディメンションに必要な値の数を指定します。実際の合計数がそれより小さいと、MAINTAIN MERGEによって、指定した合計に達するまで値が追加されます。たとえば、INTEGERディメンションに位置が10ある場合、MERGE 5では操作は何も行われませんが、MERGE 15では値が5つ追加されます。

RELATE relation

expから新しい値をdimensionにマージする際に更新するリレーションを指定します。expのディメンションのうち1つ以上のディメンションが、relationの定義で定義されている必要があります。expが単一セル値の場合は、RELATE句は使用できません。

例10-49 コンポジットでのMERGEキーワードの使用

productディメンションの最初の3つの値とdistrictディメンションの最初の5つの値のすべての組合せで構成されるコンポジットを定義するとします。次の文を使用して、15個の値すべてを効率よくまとめることができます。

DEFINE comp_proddist COMPOSITE <product district>
LIMIT product TO FIRST 3
LIMIT district TO FIRST 5
MAINTAIN comp_proddist MERGE <product district>

この方法は、結合ディメンションでも利用できます。

MAINTAIN MOVE

MOVEキーワードを使用したMAINTAINコマンドの結果は、操作するオブジェクトによって異なります。

  • ディメンションをメンテナンスする場合、MAINTAIN MOVEによって、非連結ディメンションまたはTEXT型、ID型、INTEGER型のディメンションの1つ以上の値の位置が変更されるか、事前移入したディメンション値またはコンポジット値がパーティションに追加されます。

    注意:

    ディメンション値のMAINTAIN MOVE文は、Maintainトリガーを持つサロゲート・ディメンションにも発行できます。この場合、Oracle OLAPでは、Maintainトリガー・プログラムのみが実行され、それ以外のアクションは行われません。詳細は、トリガー・プログラムを参照してください。Maintainトリガーのないサロゲート・ディメンションに対してMAINTAIN文を発行すると、エラーが返されます。

  • パーティションをメンテナンスする場合は、MAINTAIN MOVEによって、変数をディメンション化するパーティション・テンプレートのパーティションに定義されているディメンション値またはコンポジット値を変更するために、事前にパーティション化した変数のデータがあるパーティションから別のパーティションに移動されます。

構文

MOVEキーワードを使用するMAINTAINコマンドの構文は、メンテナンスするオブジェクトのタイプによって異なります。

そのため、MAINTAIN MOVEについては、次のように個別に説明します。

ディメンション値のMAINTAIN MOVE

単純なMAINTAIN MOVE文で、非連結ディメンションまたはTEXT型、ID型、INTEGER型のディメンションの1つ以上の値の位置を変更できます。MAINTAINコマンドのMOVEキーワードは、コンポジットまたはDAY、WEEK、MONTH、QUARTER、YEAR型のディメンションでは使用できません。

注意:

MAINTAIN MOVE文は、Maintainトリガーを持つサロゲート・ディメンションにも発行できます。この場合、Oracle OLAPでは、Maintainトリガー・プログラムのみが実行され、それ以外のアクションは行われません。詳細は、トリガー・プログラムを参照してください。Maintainトリガーのないサロゲート・ディメンションに対してMAINTAIN文を発行すると、エラーが返されます。

構文

MAINTAIN dimension MOVE limit-clause

パラメータ

dimension

値を入力または変更するアタッチしたアナリティック・ワークスペースで定義されている非連結ディメンション。TEXT型、ID型またはINTEGER型のディメンションを指定する必要があります。DAY、WEEK、MONTH、QUARTER、YEAR型のディメンションは指定できません。

limit-clause

移動する値を指定します。

limit-clauseの構文は、各種LIMITコマンドにおけるlimit-clause引数の構文(つまり、LIMITコマンドの「TO」などのlimit-type引数の後の構文)と同じです。これらの引数の構文については、LIMITコマンド(値を使用)LIMITコマンド(LEVELRELを使用)LIMIT(親リレーションを使用)LIMITコマンド(関連ディメンションを使用)LIMITコマンド(NOCONVERTを使用)およびLIMITコマンド(POSLISTを使用)を参照してください。

使用上の注意

MAINTAIN MOVEのパフォーマンスに影響を与える要因

MAINTAIN MOVEコマンドを発行する場合のコスト・パフォーマンスは、移動される値の数ではなく、ディメンションの長さによって異なります。したがって、大きなディメンション内の値を移動する場合は、複数のMAINTAIN MOVE文を連ねて発行するかわりに、ディメンション・ステータスを目的の値に設定してから単独のMAINTAIN MOVEコマンドを発行してください。

ディメンション内の値の並べなおしまたはソート

MAINTAIN MOVE文を使用してディメンションの値を並べなおしたりソートしたりする場合、ステータスにあるディメンションの値すべてを使用するように指定するには、VALUESコマンドではなく、LIMIT(値を使用)コマンドlimit-clause引数のSTATUSキーワードを使用します。

例10-50 特定の位置へのディメンション値の移動

次の文によって、都市Houstonの位置が5番目の値の後に移動されます。

MAINTAIN city MOVE 'Houston' AFTER 5

例10-51 ステータス・リストの末尾へのディメンション値の移動

この例では、TEXT変数textvarを使用してSeattleを都市のリストの最後に移動します。

textvar = 'Seattle'
MAINTAIN city MOVE textvar LAST

例10-52 連結ディメンションの値の移動

次の文では、reg.dist.ccdimという連結ディメンションの値<district: 'Denver'>を、連結ディメンション値<region: 'West'>の後に移動します。

MAINTAIN reg.dist.ccdim MOVE <district: 'Denver'> AFTER <region: 'West'>

次の文では、連結ディメンション値<district: 'Denver'>を、コンポーネントのdistrictディメンションの最初の値に対応する位置の後に移動します。districtのステータスにある最初の値がAtlantaの場合、<district: 'Denver'>は、連結ディメンションの値<district: 'Atlanta'>の後に移動されます。

MAINTAIN reg.dist.ccdim MOVE <district: 'Denver'> AFTER <district: 1>

次の文では、連結ディメンション値<district: 'Dallas'>を連結ディメンションの3番目の値の後に移動します。

MAINTAIN reg.dist.ccdim MOVE <district: 'Dallas'> AFTER 3
MAINTAIN MOVE TO PARTITION

MAINTAIN MOVE TO PARTITION文は、追加機能と移動機能の両方を併せ持ちます。MAINTAIN MOVE TO PARTITION文を使用すると、次のことを実行できます。

  • MAINTAIN ADD TO PARTITIONと同様に、事前移入したディメンション値またはコンポジット値をパーティションに追加します。

  • 変数をディメンション化するパーティション・テンプレートのパーティションに対して定義されたディメンション値またはコンポジット値を変更し、同時に、それらのディメンションおよびコンポジットによってディメンション化されている事前にパーティション化した変数のデータを、あるパーティションから別のパーティションへ移動します。

構文

MAINTAIN partition-template MOVE TO PARTITION partition value [TO value]

パラメータ

partition-template

事前定義されたパーティション・テンプレート・オブジェクトの名前を示すテキスト式。

MOVE TO PARTITION

パーティションに追加される値、またはあるパーティションから別のパーティションに移動する値を指定します。

partition

partition-templateで指定したパーティション・テンプレートにある事前定義されたパーティションの名前を示すテキスト式。

value

事前移入したディメンションまたはコンポジットの1つ以上の値を指定します。これらの値には、次のものを指定できます。

  • リテラル値。

  • ディメンション値を値とする式

  • NUMBERディメンション以外のディメンションの場合、ディメンション値の位置を表す値のINTEGER

  • 値セット、またはLIMITファンクション

連結ディメンションの場合、連結ディメンションの値、もしくはコンポーネント・ディメンションの名前とそのディメンションの値または位置を指定できます。valueの値として、ディメンション・サロゲートの値を使用できます。

TO

値の範囲を示します。

例10-53 値セットを使用したパーティションの値の指定

各パーティションに実際のディメンション値を指定しない、次のような定義を使用して、パーティション・テンプレート・オブジェクトを定義したとします。

DEFINE PARTITION_SALES_BY_YEAR PARTITION TEMPLATE <TIME PRODUCT> -
   PARTITION BY LIST (TIME) -
    (PARTITION TIME_2004 VALUES () <TIME PRODUCT> -
     PARTITION TIME_2003 VALUES () <TIME PRODUCT> -
     PARTITION TIME_2002 VALUES () <TIME PRODUCT>)

値セットを使用して各パーティションの値を指定するには、次の手順に従います。

  1. 各年の値の値セットを定義します。

    DEFINE vs_2004 VALUESET time
    LIMIT vs_2004 to '01Dec2004' '31Dec2004' '01Jan2004''31Jan2004' -
         'Jan2004' 'Dec2004' '2004'
    DEFINE vs_2003 VALUESET time
    LIMIT vs_2003 to '01Dec2003' '31Dec2003' '01Jan2003''31Jan2003' -
         'Jan2003' 'Dec2003' '2003'
    DEFINE vs_2002 VALUESET time
    LIMIT vs_2002 to '01Dec2002' '31Dec2002' '01Jan2002''31Jan2002' -
         'Jan2002' 'Dec2002' '2002'
    
  2. MAINTAIN MOVE文を使用して、パーティション・テンプレートのパーティションの値を指定します。

    MAINTAIN partition_sales_by_year MOVE TO PARTITION time_2004 vs_2004
    MAINTAIN partition_sales_by_year MOVE TO PARTITION time_2003 vs_2003
    MAINTAIN partition_sales_by_year MOVE TO PARTITION time_2002 vs_2002
    

DESCRIBE文を発行してpartition_sales_by_yearパーティション・テンプレートの説明を見ると、各パーティション定義に適切なtimeの値が含まれていることがわかります。

DEFINE PARTITION_SALES_BY_YEAR PARTITION TEMPLATE <TIME PRODUCT> - 
    PARTITION BY LIST (TIME) -
    (PARTITION TIME_2004 VALUES -
('2004','Dec2004','Jan2004', 31Dec2004',01Dec2004','31Jan2004','01Jan2004')-
     PARTITION TIME_2003 VALUES -
('2003','Dec2003','Jan2003', 31Dec2003',01Dec2003','31Jan2003','01Jan2003')-
      PARTITION TIME_2002 VALUES -
                     ('2002','Dec2002','Jan2002', 31Dec2002',01Dec2002','31Jan2002','01Jan2002'))

MAINTAIN RENAME

MAINTAINコマンドでRENAMEキーワードを使用すると、1つ以上のディメンション値のスペルを変更できます。RENAMEキーワードは、コンポジットまたはINTEGER、DAY、WEEK、MONTH、QUARTER、YEAR型のディメンションでは使用できません。

注意:

MAINTAIN RENAME文は、Maintainトリガーを持つサロゲート・ディメンションにも発行できます。この場合、Oracle OLAPでは、Maintainトリガー・プログラムのみが実行され、それ以外のアクションは行われません。詳細は、トリガー・プログラムを参照してください。Maintainトリガーのないサロゲート・ディメンションに対してMAINTAIN文を発行すると、エラーが返されます。

構文

MAINTAIN dimension RENAME {value new-value}...

パラメータ

dimension

値の名前の変更対象になるアタッチしたアナリティック・ワークスペースにすでに定義されているTEXT型またはID型の非連結ディメンション。INTEGER、DAY、WEEK、MONTH、QUARTER、YEAR型のディメンションは指定できません。

value

名前を変更する既存のディメンション値を指定します。ディメンション値、ディメンション値を値とする文字式、またはディメンション値の位置を表すINTEGER式を指定できます。

new-value

ディメンション値の新しいスペルを示すテキスト定数、TEXT式またはID式。

例10-54 TEXTディメンションの値の名前変更

次の文では、都市ChicおよびBostのスペルをChicagoおよびBostonに変更します。

MAINTAIN city RENAME 'Chic' 'Chicago' 'Bost' 'Boston'

この例では、TEXT変数textvarを使用して、2番目の都市をAtlantaに変更します。

textvar = 'Atlanta'
MAINTAIN city RENAME 2 textvar

MODEL

MODELコマンドは、新規または既存のモデル・オブジェクトにまったく新しい仕様を入力するコマンドです。モデルに既存の仕様がある場合、その仕様は上書きされます。MODELを使用して、モデル・オブジェクトにモデル仕様を割り当てるには、定義は最新のもの、または現行のセッション中に検討されたものにする必要があります。そうでない場合は、最初にCONSIDER文を使用し、現行の定義にする必要があります。

MODEL文の代替文はEDIT MODEL文であり、OLAP Worksheet内でのみ使用できます。EDIT MODEL文を実行すると、modelオブジェクトの仕様を追加、削除または変更できる編集ウィンドウが開きます。

モデル・オブジェクトへの仕様の追加は、データをモデリングする際の一処理です。モデルの詳細は、OLAP DMLモデル・オブジェクトを参照してください。

構文

MODEL specification

パラメータ

specification

次のOLAP DML文を1つ以上含む複数行のテキスト式。

モデルの最大行数は、4,000行です。各文は、複数行のテキスト式で構成されています。コマンドライン・レベルでALLOCMAP文をコード化する際は、改行デリミタ(\n)で文を区切るか、JOINLINESを使用します。

モデルの仕様設計の詳細は、モデルの仕様を参照してください。

使用上の注意

モデルの仕様

モデルの仕様は、次のOLAP DML文で構成されます。

  1. 次のうちの1つ。

    • モデルに含める別のモデルの名前を指定するINCLUDE文(1文のみ)。詳細は、モデルのネストを参照してください。

    • モデルにおけるDIMENSION文作成のガイドラインに従ってコーディングした1つ以上のDIMENSION(モデル内)文。

      注意:

      モデルにINCLUDE文が含まれる場合、DIMENSION文を含めることはできません。ただし、INCLUDE文で参照されているモデルまたは階層のルート・モデルには、親モデルで必要なDIMENSION文が含まれている必要があります。

  2. 1つ以上のSETコマンドまたはモデルでの方程式のルールに従って記述した方程式。

    関連項目:

    Oracle OLAPによるモデルの方程式の処理方法については、ディメンション・ステータスおよびモデル方程式を参照してください

  3. モデルの仕様の終わりを示す最後のEND文。(OLAP Worksheetの編集ウィンドウで仕様をコーディングする場合は不要です。)

モデルの最大行数は、32,000行です。

集計仕様におけるMODEL文

aggmapで、特別なMODEL文を使用して、事前定義したモデルを実行できます。(詳細は、AGGMAPコマンドのMODEL(集計内)文を参照してください。)

変数のデータの計算方法

モデル・オブジェクトおよびaggmapオブジェクトは、どちらもディメンション・メンバー間の関係に基づいて変数のデータ値を計算します。ディメンション・メンバー間に親子関係が存在し(つまり、ディメンションに階層構造があり)、すべての集計値を同じ方法で計算できる場合は、集計仕様でRELATION文を使用して値を計算できます。しかし、ディメンションが階層ではなく、値の計算に異なる方程式を必要とする場合は、モデルを定義する必要があります。MODEL(集計内)を使用して集計仕様でモデルを実行するか、モデルの実行に示されている構文を使用してコマンドラインでモデルを実行できます。

モデルの仕様の削除

モデルの定義を削除せずに、モデルの仕様を削除できます。CONSIDER文で、モデルを現行の定義として指定します。その後、MODEL文を発行し、モデルの仕様にENDを入力します。

例10-55 プログラムに指定されたモデル

次の例では、myprogというプログラムに単純なモデルを作成(または上書き)します。プログラムの最初の行で、モデルを定義または現行の定義として指定します。2番目の行には、モデルの行を指定するMODEL文が含まれています。

このモデルは、予算の明細項目を計算します。モデル方程式は、lineディメンションを基礎としています。

DEFINE myprog PROGRAM
PROGRAM
IF NOT EXISTS('myModel')
  THEN DEFINE myModel
  ELSE CONSIDER myModel
MODEL JOINLINES(-
  'DIMENSION line month' -
  'Opr.Income = Gross.Margin - Marketing' -
  'Gross.Margin = Revenue - Cogs' -
  'Revenue = LAG(Revenue, 1, month) * 1.02' -
  'Cogs = LAG(Cogs, 1, MONTH) * 1.01' -
  'Marketing = LAG(Opr.Income, 1, month) * 0.20' -
  'END')
END

例10-56 入力ファイルを基にしたモデル

この例は、前の例と同じ単純なモデルのテキストを示すものですが、ここでは、モデルはbudget.txtというASCIIディスク・ファイルに格納されています。

DEFINE income.budget MODEL
MODEL
DIMENSION line month
Opr.Income = Gross.Margin - Marketing
Gross.Margin = Revenue - Cogs
Revenue = LAG(Revenue, 1, month) * 1.02
Cogs = LAG(Cogs, 1, month) * 1.01
Marketing = LAG(Opr.Income, 1, month) * 0.20
END

income.budgetモデルをアナリティック・ワークスペースに含めるには、次の文を実行します。このとき、myinpfilesはディレクトリ・オブジェクトです。

INFILE 'myinpfiles/budget.txt'

例10-57 モデルの作成

損益計算書の明細項目を計算するincome.calcというモデルを定義するとします。

define income.calc model
ld Calculate line items in income statement

モデルを定義した後、MODEL文またはOLAP Worksheetエディタを使用して、モデルの仕様を入力します。モデルの仕様には、DIMENSIONコマンド、代入文およびコメントを含めることができます。すべてのDIMENSIONコマンドは、最初の方程式の前に配置する必要があります。この例では、次のモデル内に示されている行を指定します。

DEFINE INCOME.CALC MODEL
LD Calculate line items in income statement
MODEL
DIMENSION line
net.income = opr.income ‐ taxes
opr.income = gross.margin ‐ (marketing + selling + r.d)
gross.margin = revenue ‐ cogs
END

モデルに方程式を記述する際は、任意の順序で配置できます。COMPILE文を発行するかモデルを実行することによりモデルをコンパイルする時点で、モデル方程式の解決順序が決定されます。1つの方程式の計算結果が別の方程式への入力データとして使用される場合、方程式は要求される順序で解決されます。

income.calcモデルを実行して、actualをソリューション変数として使用するには、次の文を実行します。

income.calc actual

ソリューション変数にモデル方程式が基礎とするディメンション以外のディメンションがある場合は、それらの各ディメンションの現行のステータス・リストに対して自動でループ処理が実行されます。たとえば、actualは、monthdivisionおよびlineによってディメンション化されているとします。divisionALLに制限され、monthOCT96からDEC96までに制限されている場合、各部門のステータスにある3か月についてincome.calcモデルが解決されます。

例10-58 シナリオ・モデルの作成

たとえば、各部門の楽観的な収入額、悲観的な収入額および最良予測の収入額に基づいて収益額を計算するとします。次の例で、このシナリオ・モデルを作成する手順を説明します。

シナリオ・ディメンションscenarioをコールして、計算するシナリオの値を指定します。

次のコマンドで、scenarioに値optimisticpessimisticおよびbestguessを指定します。

DEFINE scenario DIMENSION TEXT
LD Names of scenarios
MAINTAIN scenario ADD optimistic pessimistic bestguess

次のコマンドで、scenarioディメンションとは別に、他の3つのディメンション(monthlineおよびdivision)でディメンション化されるplanという変数を作成します。

DEFINE plan DECIMAL <month line division scenario>
LD Scenarios for financials

たとえば、収入や売上原価などの入力データをplan変数に入力する必要があるとします。

最良予測のデータの場合、budget変数のデータを使用できます。lineディメンションを入力明細項目に制限し、budgetデータをplan変数にコピーします。

LIMIT scenario TO 'BESTGUESS'
LIMIT line TO 'REVENUE' 'COGS' 'MARKETING' 'SELLING' 'R.D'
plan = budget

楽観的なデータと悲観的なデータは、最良予測のデータに基づいて設定する場合があります。たとえば、楽観的なデータを最良予測のデータより15%高く設定し、悲観的なデータを最良予測のデータより12%低く設定するなどです。この場合、lineを入力明細項目に制限したまま、次のコマンドを実行します。

plan(scenario 'OPTIMISTIC') = 1.15 * plan(scenario 'BESTGUESS')
plan(scenario 'PESSIMISTIC') = .88 * plan(scenario 'BESTGUESS')

最後に、入力データに基づいて結果を計算するモデルを記述してシナリオ・モデルを作成します。モデルには、この章の前述の項で示したbudget.calcモデルの計算と非常に似ている計算が含まれる可能性があります。

各シナリオには、同じ方程式を使用することも、異なる方程式を使用することもできます。たとえば、売上原価を計算する場合、各シナリオの計算で異なる定数要素を使用するとします。各シナリオで異なる定数要素を使用するには、scenarioでディメンション化した変数を定義し、変数に適切な値を指定します。変数の名前がcogsvalであるとすると、モデルにcogs明細項目を計算するための次の方程式を含めることができます。

cogs = cogsval * revenue

scenarioでディメンション化した変数を使用することで、シナリオ・モデルの柔軟性を大幅に向上できます。

同様に、各部門ごとに異なる定数要素を使用することもあります。この場合、divisionでディメンション化した変数を定義し、各ディメンションの値を保持できます。たとえば、部門によって人件費が異なる場合、cogsvaldivisionscenarioでディメンション化します。

モデルを実行する際、ソリューション変数としてplanを指定します。たとえば、scenario.calcというモデルの場合、次の文でモデルを解決します。

scenario.calc plan

planの各ディメンションの現行のステータス・リストに対して自動でループ処理が実行されます。したがって、scenario.calcモデルの実行時にscenarioディメンションがALLに制限されている場合、optimisticpessimisticbestguessの3つのシナリオすべてに対してモデルが解決されます。

DIMENSION (モデル内)

モデルの先頭のDIMENSION文は、モデルがデータを代入する1つ以上のディメンションの名前、またはディメンションベースの方程式で参照する1つ以上のディメンションの名前を指定します。ディメンションベースの方程式は、1つ以上のディメンション値によって表されるターゲットに計算の結果を代入します。

構文

DIMENSION dimension1 [, dimensionN]

パラメータ

dimension

モデル方程式が基礎とする、コンポジットのベース・ディメンションを含む1つ以上のディメンション。サロゲートの作成元のディメンションのかわりに、ディメンション・サロゲートの名前を指定できます。その後、ディメンションの値のかわりにサロゲートの値を使用できます。

使用上の注意

モデルのディメンションベースの方程式

方程式(SET)がデータをディメンション値に代入するか計算でディメンション値を参照する場合、その方程式はディメンションベースの方程式と呼ばれます。ディメンションベースの方程式は、ディメンション自体を参照する必要はなく、ディメンションののみを参照することに注意してください。したがって、モデルにディメンションベースの方程式が含まれる場合、モデルの先頭のDIMENSION文でこれらの各ディメンションの名前を指定する必要があり、これによってOracle OLAPでは、この指定によって、各ディメンション値がどのディメンションに属しているかを判定できます。サロゲートの作成元のディメンションのかわりに、ディメンション・サロゲートの名前を指定できます。その後、ディメンションの値のかわりにサロゲートの値を使用できます。

また、モデルにディメンションベースの方程式が含まれている場合、モデルを実行する際にソリューション変数の名前を指定する必要があります。ソリューション変数は、モデルのデータのソースであるとともにターゲットでもあります。ディメンションベースの方程式で使用する入力データはソリューション変数が保持しており、また、計算結果はOracle OLAPによってソリューション変数の指定された値に格納されます。ソリューション変数は、通常、モデル方程式が基礎とするすべてのディメンションによってディメンション化されています。たとえば、財務アプリケーションにおいて、モデルがlineディメンションを基礎とし、ソリューション変数actualがそのディメンションの1つとしてlineを持つ場合などです。

ディメンションベースの方程式によって、モデリングには柔軟性があります。モデルを解決するまでモデリング変数を指定する必要がないため、同じモデルを異なるソリューション変数で実行できます。たとえば、同じモデルを、実績額(actual)の変数、最良ケース予算額の変数および最悪ケース予算額の変数で実行することもできます。

ディメンションベースの方程式が、計算で使用するデータのソースまたは結果を代入するターゲットとしてディメンション値を参照する場合は、ディメンションをDIMENSION文に指定する必要があります。次の例では、Gross.MarginRevenueおよびCogslineディメンションの値であり、そのため、DIMENSION文にlineが指定されています。

DIMENSION line
Gross.Margin = Revenue - Cogs

ディメンションがファンクション引数の場合

ディメンションが、データソースとしてディメンション値を使用するファンクションに対する引数の場合は、そのディメンションもDIMENSION文に指定する必要があります。次の例では、monthをDIMENSION文に指定する必要があります。

DIMENSION line, month
Revenue = lag(Revenue, 1, month) * 1.05

前述のモデルの作成者は、lineおよびmonthによってディメンション化されたソリューション変数の使用を想定しています。そのため、モデルの実行時に、指定した時間ディメンション(month)をディメンションの1つとして持つソリューション変数について、LAGファンクションが操作を行います。ただし、モデル・コンパイラではソリューション変数の時間ディメンションを予想できないため、DIMENSION文でそれを指定する必要があります。DIMENSION文にmonthを含めない場合、モデルのコンパイルを試行した際にエラーが発生します。

時系列のデータを操作するファンクション(MOVINGTOTALまたはLAGなど)では、ディメンションがDAY、WEEK、MONTH、QUARTER、YEAR型の場合、dimension引数はオプションです。たとえば、前述の例では、LAGファンクションの指定でmonthを省略できます。ただし、その場合でも、DIMENSION文には適切な時間ディメンションを指定する必要があります。

ソリューション変数

ディメンションベースの方程式を含むモデルを実行する場合、モデルのデータのソースであり、ターゲットでもある、ソリューション変数を指定します。通常、ソリューション変数は、モデルで使用するDIMENSIONコマンドにリストされたすべてのディメンションによってディメンション化されています。または、ソリューション変数がコンポジットでディメンション化されている場合は、DIMENSIONコマンドによってコンポジットのベース・ディメンションがリストされます。DIMENSIONコマンドはモデルで明示的に指定するか、含まれるモデルから継承できます。INCLUDEとの非互換性を参照してください。

コンポジットでの処理

ディメンション・リストにあるコンポジットのソリューション変数を使用してモデルを実行する必要がある場合は、DIMENSION文にコンポジットのベース・ディメンションを指定します。モデル方程式は、結果をベース・ディメンションの値に代入します。コンポジットで必要になる新しい値は、Oracle OLAPによって自動で作成されます。

複数のDIMENSIONコマンド

ディメンションベースの方程式で参照または使用されている各ディメンションについて、それぞれ別個のDIMENSION文を指定するか、単一のDIMENSION文にすべてのディメンションを指定できます。

コマンドの位置

すべてのDIMENSIONコマンドは、モデルの先頭で指定し、方程式より前の位置に指定する必要があります。

INCLUDEとの非互換性

モデルにINCLUDE文が含まれる場合、DIMENSIONコマンドを含めることはできません。INCLUDE文は、現行のモデルに別のモデルを含めることを指定する文です。この場合、現行のモデルは、含められたモデルからそのDIMENSIONコマンド(存在する場合)を継承します。モデルを含める際の詳細は、MODELコマンドのINCLUDE文を参照してください。

継承されたDIMENSIONコマンドは、明示的なDIMENSIONコマンドに対し規定されているすべての要件を満たす必要があります。モデルにおけるDIMENSION文作成のガイドラインを参照してください。

ディメンションの順序

モデルでDIMENSIONコマンドに複数のディメンションを指定する場合、ディメンションをリストする順序は重要です。

  • モデル方程式にディメンション値である可能性がある名前が含まれている場合、Oracle OLAPでは、モデルの明示的なDIMENSIONコマンドまたは継承されたDIMENSIONコマンドに出現するディメンションを、ディメンションがリストされている順序で検索し、その名前が、リストされているディメンションのディメンション値と一致するかどうかを確認します。検索は、一致する値が検出された時点で終了します。したがって、リストされている2つ以上のディメンションに同じ名前のディメンション値がある場合、Oracle OLAPでは、その値は、DIMENSION文で最初にリストされているディメンションに属するものと判断されます。名前が、リストされているディメンションの値と一致しない場合は、Oracle OLAPは、アタッチしたワークスペースの変数全体で検索します。

  • モデル方程式が結果をターゲット・ディメンションの値に代入する際、Oracle OLAPによって、DIMENSIONコマンドにリストされている他の(ターゲット以外の)ディメンションの値をループ処理するコードが作成されます。DIMENSIONコマンドに最初にリストされているターゲット以外のディメンションは、最も変化の遅いディメンションとして扱われます。たとえば、DIMENSION文にリストされているターゲット以外の最初のディメンションがMONTHであり、2番目のディメンションがDIVISIONであるとすると、まず、最初の月のすべての部門がループされ、その後、2番目の月のすべての部門がループされるというように続きます。

モデルにおけるDIMENSION文作成のガイドライン

DIMENSION文を作成する場合、次の点に注意してください。

  • DIMENSION文には、モデル方程式が基礎とするすべてのディメンションの名前をリストする必要があります。次の例では、gross.marginrevenueおよびcogslineディメンションの値であり、そのため、DIMENSION文にlineが指定されています。

    DIMENSION line
    gross.margin = revenue - cogs
    
  • DIMENSION文には、ディメンション値を参照するファンクションの引数であるディメンションもリストする必要があります。次の例では、monthDIMENSIONコマンドに指定する必要があります。

    DIMENSION line, month
    revenue = LAG(revenue, 1, month) * 1.05
    
  • モデル方程式が結果をディメンション値に代入する際、DIMENSION文にリストされているターゲット以外のディメンションの値をループするコードが作成されます。DIMENSION文に最初にリストされているターゲット以外のディメンションは、最も変化の遅いディメンションとして扱われます。

  • 次のガイドラインに従ってDIMENSION文のディメンションおよびソリューション変数のディメンションを指定すると、モデルは最も効率よく実行されます。

    • モデルのターゲット・ディメンションは、DIMENSION文では最初のディメンションとしてリストし、ソリューション変数のディメンションでは最後のディメンションとしてリストします。

    • DIMENSION文では、ターゲット以外のディメンションは、ソリューション変数の定義に指定されている順序とは逆の順序でリストします。したがって、モデルおよびソリューション変数で、最も変化の早いディメンションと最も変化の遅いディメンションが同じ順序となります。

  • ソリューション変数にモデル方程式で使用または参照されないディメンションがある場合は、それらのディメンションはDIMENSION文には含めません。

  • アナリティック・ワークスペースにディメンション値と同じ名前を持つ変数が含まれるか、同じディメンション値が異なる2つのディメンションに存在する場合は、モデル方程式にあいまいさが生じる可能性があります。モデル方程式では変数とディメンション値は同じ方法で使用できるため、名前は変数の名前であることもあり、アナリティック・ワークスペース内のディメンションの値であることもあります。

  • DIMENSION文は、代入文の各名前参照が変数またはディメンション値のいずれであるかを判定するために使用されます。名前参照の解決方法の説明は、モデルのコンパイルを参照してください。

    関連項目:

    次の事項に関する情報は、OLAP DMLモデル・オブジェクト、SETおよびMODELを参照してください。

    • モデルへの文の入力

    • ディメンションの値の参照方法

    • 文からコードが作成される方法の説明

    • ソリューション変数がDIMENSIONコマンドにリストされているよりも多いまたは少ないディメンションを持つ場合の、Oracle OLAPの対処方法の説明

例10-59 予算予測のための単純なモデル

次の文では、損益計算書の項目についての予算額を予測する単純なモデルを定義します。

DEFINE income.budget MODEL
LD Model for estimating budget line items
MODEL
dimension line, month
Revenue = 1.05 * LAG(Revenue 1 month)
Gross.Margin = Revenue - Cogs
Opr.Income = Gross.Margin - (Marketing + Selling + R.D)
Net.Income = Opr.Income - Taxes
END

モデル方程式はlineディメンションを基礎とするため、DIMENSION文にはlineが指定されています。ディメンションmonthは、REVENUE値に対し操作を行うLAGファンクション内の時間ディメンションであるため、DIMENSION文にはmonthも指定されています。

モデルを実行すると、monthディメンションの現行のステータスにある値がループ処理されます。

INCLUDE

INCLUDE文は、あるモデルを別のモデルに含める文です。INCLUDE文はモデル内でのみ使用できます。

INCLUDEを使用すると、複数のモデルで共通する方程式を配置して、別個のモデルにモジュール・モデルを作成し、必要に応じてそのモデルを他のモデルに含めることができます。さらに、INCLUDE文によりwhat-if分析が容易になります。実験的なモデルでは、ベース・モデルから方程式を流用し、それを選択的に新しい方程式に置き換えることが可能です。

構文

INCLUDE model

パラメータ

model

現行のモデルに含めるモデルの名前。現行のモデルは親モデルと呼ばれます。含めるモデルはベース・モデルと呼ばれます。

使用上の注意

モデルにおけるINCLUDE文コード化のガイドライン

モデルでINCLUDE文を使用するには、次のガイドラインに従ってください。

  • モデルに指定できるINCLUDE文は1つのみです。

  • INCLUDE文は、モデルのいずれの方程式よりも前の位置に指定する必要があります。

  • モデルにINCLUDE文が含まれる場合、DIMENSION文を含めることはできません。

モデルのネスト方法

INCLUDE文をベース・モデルで使用することにより、モデルをネストできます。たとえば、モデルmyModel1がモデルmyModel2を含み、モデルmyModel2がモデルmyModel3を含むことが可能です。ネストしたモデルは階層形式になります。この例では、myModel1が一番上の階層になり、myModel3がルートになります。ベース・モデルは、階層内でそれより上位にあるモデルを含むことができません。前述の例では、myModel2myModel1を含むことができず、myModel3myModel1またはmyModel2を含むことができません。

方程式間の依存関係

INCLUDE文を含むモデルをコンパイルする場合、コンパイラは、方程式を順序付けたりブロックに構成したりする際に、含まれているすべてのモデルにある方程式間の依存関係を考慮します。したがって、MODEL.COMPRPTプログラムを実行してコンパイルの結果を確認する、または親モデルの実行前にMODTRACEオプションをYESに設定すると、含まれているモデルの階層の異なるレベルの方程式が散在している場合があります。例10-61を参照してください。

含まれているモデルの方程式間に依存関係が見つからない場合、コンパイラはルート・モデルの方程式を最初に実行し、親モデル内の方程式を最後に実行します。

親モデルのコンパイル

親モデルをコンパイルすると、コンパイル済コードがまだ存在していない場合、コンパイラによって、含まれている階層でその親モデルの下にあるすべてのベース・モデルがコンパイルされます。特定のモデルでエラーが検出されると、そのモデルおよび階層でそれより上にあるモデルはコンパイルされません。階層のルート・モデルにエラーがあると、上位のモデルはルート・モデルからDIMENSION文を継承できません。この場合、エラーの実際の発生箇所がルート・モデルでも、コンパイラは親モデルにおけるエラーとしてレポートすることがあります。たとえば、アタッチしたアナリティック・ワークスペースにターゲット・ディメンション値が存在しないとして、コンパイラによってレポートされる可能性があります。一方、コンパイラが親モデル内でエラーを検出し、そこに含まれているモデル内にはエラーが見つからない場合、親モデルがコンパイルされなくても、含まれているモデルはコンパイルされます。

方程式のマスク

what-if分析をサポートするために、モデルの方程式で前の方程式をマスクできます。以前の方程式は、同じモデルまたはそれに含まれているモデルにあります。マスクされた方程式は実行されません。モデルのコンパイル後にMODEL.COMPRPTプログラムを実行すると、マスクされた方程式は、コンパイルしたモデルについてのレポートには表示されません。

ある方程式が、前の方程式のターゲットでもある変数またはディメンション値に値を代入する場合、マスクを実行できます。マスクのルールは次のとおりです。

  • 前の方程式のターゲットが、後の方程式のターゲットと同じように限定されている場合、前の方程式はマスクされ、後の方程式が実行されます。次の例では、完全に同じように限定されたターゲットを持つ2つの方程式が示されています。

    Equation from a base model:      BUDGET(LINE REVENUE) = 5000
    Equation from the parent model:  BUDGET(LINE REVENUE) = 3500

    この例では、ベース・モデルの方程式はマスクされ、親モデルの方程式が実行されます。

  • 前の方程式のターゲットが後の方程式のターゲットよりもさらに限定されている場合、前の方程式はマスクされます。後の方程式が実行されます。

    より限定されたターゲットとは、より少ないディメンション値に影響を与えるターゲットです。ベース・モデルおよび親モデルに次のような方程式があるとします。

    Equation from a base model:      BUDGET(LINE REVENUE) = 2500
    Equation from the parent model:  BUDGET = 4000

    ベース・モデルの方程式は、LINEディメンションのREVENUE値に対してのみ値を代入するため、より限定されています。親モデルの方程式は、LINEディメンションのすべての値にデータを代入します。この例では、ベース・モデルの方程式はマスクされ、親モデルの方程式が実行されます。

  • 前の方程式のターゲットが後の方程式のターゲットよりも限定されていない場合、マスクは行われません。方程式は両方とも実行されます。

    ベース・モデルおよび親モデルに次のような方程式があるとします。

    Equation from a base model:      BUDGET = LAG(ACTUAL, 1, MONTH)
    Equation from the parent model:  BUDGET(LINE REVENUE) = 6500
    Equation from the parent model:  BUDGET(LINE COGS) = 4000

    ベース・モデルの方程式は、LINEディメンションのすべての値にデータを代入します。親モデルの方程式は、それぞれLINEディメンションの単一の値に対してのみ値を代入するため、より限定されています。この例では、ベース・モデルの方程式が最初に実行され、その後、親モデルの方程式が実行されます。

    この機能によって、多数の値を1つの方程式で代入し、後続の方程式で個々の値の置換やテストが可能になります。

  • 前の方程式のターゲットが後の方程式のターゲットとは異なって限定されている場合、マスクは行われません。方程式は両方とも実行されます。次の例では、方程式はどちらも実行されます。

    Equation from a base model:      BUDGET(LINE REVENUE) = 5000
    Equation from the parent model:  BUDGET(LINE COGS) = 4500

例10-60 モデルを含むモデル

この例は、base.linesというベース・モデルを含むincome.planという親モデルを示しています。

DEFINE income.plan MODEL
MODEL
INCLUDE base.lines
revenue = LAG(revenue, 1, month) * 1.02
cogs = LAG(cogs, 1, month) * 1.01
taxes = 0.3 * opr.income
END
 
DEFINE BASE.LINES MODEL
MODEL
DIMENSION line month
net.income = opr.income - taxes
opr.income = gross.margin - marketing
gross.margin = revenue - cogs
END

例10-61 コンパイル・レポートの生成

次の文を使用して、親モデルをコンパイルし、コンパイル・レポートを生成します。

COMPILE income.plan
MODEL.COMPRPT income.plan

これらの文によって生成される出力は次のとおりです。

MODEL INCOME.PLAN <LINE MONTH>
                      BLOCK 1 (SIMPLE)
INCOME.PLAN     2:    revenue = lag(revenue, 1, month) * 1.02
INCOME.PLAN     3:    cogs = lag(cogs, 1, month) * 1.01
BASE.LINES      4:    gross.margin = revenue - cogs
BASE.LINES      3:    opr.income = gross.margin - marketing
INCOME.PLAN     4:    taxes = 0.3 * opr.income
BASE.LINES      2:    net.income = opr.income - taxes
                      END BLOCK 1

MODEL.COMPRPT

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

構文

MODEL.COMPRPT

例10-62 income.budgetモデルのコンパイル・レポート

MODEL.COMPRPTプログラムは、プログラム引数として指定したモデルのブロック構成と各ブロックの方程式の順序を示すコンパイル・レポートを生成します。各方程式は、モデルの名前とそのモデル内での文番号で識別されます。

次の文で、モデルをコンパイルし、MODEL.COMPRPTを起動します。

COMPILE income.budget
MODEL.COMPRPT income.budget

MODEL.COMPRPT文によって生成されるコンパイル・レポートは次のとおりです。

MODEL INCOME.BUDGET <LINE MONTH>
                   BLOCK 1 (SIMPLE)
INCOME.BUDGET  4:  revenue = lag(revenue, 1, month) * 1.02
INCOME.BUDGET  5:  cogs = lag(cogs, 1, month) * 1.01
INCOME.BUDGET  3:  gross.margin = revenue - cogs
                    BLOCK 2 (STEP-FORWARD <MONTH>)
INCOME.BUDGET  6:   marketing = lag(opr.income, 1, month) * 0.20
INCOME.BUDGET  2:   opr.income = gross.margin - marketing
                    END BLOCK 2
                   END BLOCK 1

例10-63 income.estモデルのコンパイル・レポート

次の文を使用して、MODEL.COMPRPTプログラムを実行し、income.estというモデルのコンパイル・レポートを作成します。

MODEL.COMPRPT income.est

この文によって生成されるコンパイル・レポートは次のとおりです。

MODEL INCOME.EST <LINE MONTH>
              BLOCK 1 (STEP-FORWARD <MONTH>)
INCOME.EST 5: revenue = lag(revenue,1,month)+2*lag(marketing,1,month)
INCOME.EST 4: gross.margin = revenue - cogs
               BLOCK 2 (SIMULTANEOUS)
INCOME.EST 2:  net.income = opr.income - taxes
INCOME.EST 3:  opr.income = gross.margin - marketing - selling - r.d
INCOME.EST 6:  marketing = .15 * net.income
INCOME.EST 7:  taxes = .3 * opr.income
               END BLOCK 2
              END BLOCK 1

MODEL.DEPRT

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

構文

MODEL.DEPRT

例10-64 依存関係レポートの生成

MODEL.DEPRPTプログラムは、各モデル方程式に対する代入ターゲットおよびデータソースである変数とディメンション値がリストされた依存関係レポートを生成します。各方程式に対する代入ターゲットとそれぞれのデータソースが、個別の行にリストされます。ターゲットまたはデータソースがディメンション値の場合は、その行に角カッコで囲まれたアスタリスク([*])が付きます。

ターゲットまたはデータソースが修飾子に依存する場合は、レポートで修飾子のディメンションが特定され、依存のタイプが示されます。依存のタイプは、次のいずれかです。

  • LAG: 以前のディメンション値への一方向の依存

  • LEAD: 以後のディメンション値への一方向の依存

  • BOTH: 以前および以後の両方の値への双方向の依存

  • VARIABLE: モデルを実行したときの変数値に基づいて、以前または以後のいずれかの値への依存

  • QDR: 修飾データ参照

income.budgetモデルの依存関係レポートを生成する必要があるとします。次の文とレポートは生成のプロセスを示しています。

MODEL.DEPRPT income.budget

MODEL INCOME.BUDGET <LINE MONTH>
2    [*](LINE OPR.INCOME):
       [*](LINE GROSS.MARGIN)
       [*](LINE MARKETING)
3    [*](LINE GROSS.MARGIN):
       [*](LINE REVENUE)
       [*](LINE COGS)
4    [*](LINE REVENUE):
       [*](LINE REVENUE)(LAG <MONTH>)
5    [*](LINE COGS):
       [*](LINE COGS)(LAG <MONTH>)
6    [*](LINE MARKETING):
       [*](LINE OPR.INCOME)(LAG <MONTH>)

文4、5および6のデータソースには、monthディメンションに対するLAGの依存関係があります。

MODEL.XEQRPT

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

構文

MODEL.XEQRPT

使用上の注意

MODEL.XEQRPTの実行

MODEL.XEQRPTを実行する前に、次の操作を行う必要があります。

  1. MODERRORオプションをSTOPまたはCONTINUEに設定します。

  2. モデルを実行します。

エラーのためにモデルの実行が停止した場合は、MODEL.XEQRPTプログラムを実行します。

MODEL.XEQRPTへのMODERRORの影響

MODEL.XEQRPTから返される結果は、MODERRORオプションの設定によって次のように異なります。

  • MODERRORがSTOPに設定されており、エラーが原因でモデルの実行が停止した場合、MODEL.XEQRPTプログラムを実行すると、モデルの実行についてのレポートを生成できます。レポートには、解決に失敗したブロックが示され、連立ブロックの解決に使用されたモデル・オプションの値が表示されます。

  • MODERRORがCONTINUEに設定されており、モデルの1つのブロックが連立ブロックで、そのブロックが発散するかまたは収束に失敗した場合、Oracle OLAPによって、モデルの残りのブロックが実行されます。

    さらに、モデルのディメンションではないソリューション変数の追加のディメンションのステータスにある残りの値に対しても、Oracle OLAPによってモデルが実行されます。この場合、モデルの実行の終了後にMODEL.XEQRPTプログラムを実行すると、この追加のディメンションの最後の値の解決に関するレポートが生成されます。

    モデルが追加のディメンションの最後の値に対して実行されたときに、モデルの連立ブロックが収束した場合は、それ以前に別のディメンション値に対するモデルの実行が失敗していても、MODEL.XEQRPTは、ブロックが解決されたとしてレポートします。エラーが発生したディメンション値についてのMODEL.XEQRPTを参照するには、MODERRORをSTOPに設定し、モデルを再実行します。

例10-65 income.estモデルについての実行レポートの生成

income.estモデルを実行した後、MODEL.XEQRPTプログラムを使用すると、モデルの実行に関するレポートを生成できます。

次の文で、MODEL.XEQRPTプログラムを実行し、モデルの実行レポートを生成します。

MODEL.XEQRPT income.est

この文によって生成される実行レポートは次のとおりです。

MODEL INCOME.EST <LINE MONTH>
Solution status:     SOLVED
Model options in use: 
   MODSIMULTYPE:     AITKENS
   MODMAXITERS:      50
   MODTOLERANCE:     3
   MODOVERFLOW:      3
   MODGAMMA:         1
BLOCK 1 (STEP-FORWARD <MONTH>)
  Solution status:   SOLVED
BLOCK 2 (SIMULTANEOUS)
  Solution status:   SOLVED
  Iterations:        15

レポートには、連立ブロックの解決に使用されたモデル・オプションの値と、各ブロックの解決の成否が示されます。

MONITOR

MONITORコマンドは、指定されたプログラムの各行のパフォーマンス・コストを記録します。MONITORから有効な情報を得るには、現行セッションがOracle OLAPで実行されている唯一のセッションである必要があります。さらに、ホスト・コンピュータ上で起動されるプロセスの数が増えるにつれて、MONITORの実行結果の精度は低下します。

最初にMONITOR文を使用して監視対象のプログラムを指定し、次にプログラムを実行してMONITORを再度使用し結果を取得します。プログラムの特定の行が繰り返し実行されると、そのプログラム行を対象とするモニター・リストの1行に、実行に要した全累積コストがMONITORによって記録されます。

1行のコードの実行時間が長い場合、パフォーマンス・コストが高いとみなされます。TRACKPRG文で比較的コストが高いプログラムを特定し、MONITORを使用してそのプログラム内で所要時間の長い行を特定します。必要な場合は、TRACKPRGとMONITORを同時に使用できます。

構文

MONITOR ON [programs]  | OFF | INIT | FILE [[APPEND] file-name] | RESET

ここで、programsは、次のいずれかです。

  • ALL [awlist]
  • program-name

パラメータ

ON

Oracle OLAPがタイミング・データをモニター・リストに1行ずつ収集できるように、実行される指定プログラムの検索を開始します。(監視がすでにオンになっている場合は、中断せずに現行の監視を継続し、監視がオフになっている場合は間隔を置いて再開します。)

programsに値を指定しなかった場合は、最後に実行されたMONITOR ON文で指定したプログラム(または複数のプログラム)がデフォルトになります。現行セッションに該当する文がなかった場合、データは収集されず、エラーも発生しません。

ALL

1つ以上のアナリティック・ワークスペースにあるすべてのプログラムを監視対象として指定します。

awlist

監視するプログラムがある1つ以上のアナリティック・ワークスペースの名前(必要に応じてカンマで区切る)。この引数を省略した場合、アタッチされているすべてのアナリティック・ワークスペースにあるすべてのプログラムがOracle OLAPによって監視されます。

program-name

監視対象の特定のプログラムの名前。

OFF

プログラムの監視を停止し、現在モニター・リストにあるすべてのタイミング・データを固定します。これによりすぐに、またはセッションの後半で、リストを現行の出力ファイルまたはテキスト・ファイルに送信できます。

RESET

(監視がオンの場合にのみ有効)現在監視の対象となっているプログラムに関する情報、および現行モニター・リストに割り当てられているOracle OLAPメモリーを保持します。ただし、リストに現在格納されているタイミング・データは破棄されます。また、RESETにより、MONITORは同じプログラムが再び実行されるのを待機します。同じプログラムを実行すると、前と同じメモリー割当てのその同じプログラムに関して新しいタイミング・データが新しいモニター・リストに自動的に収集されます。

INIT

(監視がオンの場合にのみ有効)監視の環境を初期化します。初期化では、現行モニター・リストに関連付けられているプログラム名とタイミング・データが破棄され、そのリストのために前に使用されていたOracle OLAPメモリーが解放されます。これにより、メモリーを他の目的や、新しいモニター・リストへの新しいデータの収集に使用できます。

FILE

現行モニター・リストにあるタイミング・データをファイルに送ることを指定します。

APPEND

タイミング・データを既存のファイルに追加することを指定します。この引数を省略すると、ファイルの現在の内容は新しい出力によって置き換えられます。

file-name

出力を受け取るファイルの名前を表すテキスト式。そのファイルがカレント・ディレクトリにない場合、ファイルの名前にディレクトリ・オブジェクトの名前を含める必要があります。file-nameを指定すると、データは指定のテキスト・ファイルに送られます。モニター・リストはFILEの影響を受けないため、同じリストを異なる宛先に繰り返し送ることができます。file-nameを省略すると、現行モニター・リストにあるタイミング・データが現行の出力ファイルに送られます。

注意:

ディレクトリ・オブジェクトはデータベースで定義され、ディレクトリおよびディレクトリ内のファイルへのアクセスを制御します。CDA文を使用して、カレント・ディレクトリ・オブジェクトを特定および指定できます。使用するデータベース・ユーザー名で読取りおよび書込み可能なファイルがあるディレクトリ・オブジェクトへのアクセス権については、Oracle DBAに問い合せてください。

使用上の注意

モニター・リスト

モニター・リスト内の各エントリ(つまり、行)は、実行回数にかかわらず、プログラムの1行を対象にします。各エントリは次の4つのセクションに分けられます。

  • すべての実行時間の合計時間(ミリ秒単位。最も近い10ミリ秒に丸める): 列1から11

  • 実行回数: 列12から18

  • 行番号: 列19から23

  • 行の本文: 列24以降

次にMONITOR出力のサンプルを示します。参考のために列番号を付けます。

12345678901234567890123456789012345678901234567890
 
60              1    1 push name 
30              1    2 trap on GETOUT noprint 
51              1    3 limit name to obj(type) eq 'DIMENSION'
0               1    4 for name 
0               0    5    do 
450             6    6    limit &name to ALL ifnone BYPASS 
0               0    7 BYPASS: 
0               0    8    doend 
0               0    9 GETOUT: 
0               1   10 pop name 

次に示すのは、この出力を得るために使用したプログラムの完全な詳細です。出力では、LIMITコマンドの行は長すぎるために切り捨てられています。

DEFINE allstat PROGRAM
LD Program to set the status of all dimensions in the analytic workspace to ALL
PROGRAM
PUSH NAME
TRAP ON getout NOPRINT
LIMIT NAME TO OBJ(TYPE) EQ 'Dimension' IFNONE getout
FOR NAME
   DO
   LIMIT &NAME TO ALL IFNONE bypass
bypass:
   DOEND
getout:
POP NAME
END

アナリティック・ワークスペースのアタッチ、デタッチおよび再アタッチ

アタッチ、デタッチおよび再アタッチされたアナリティック・ワークスペースでOracle OLAPがプログラムを実行すると、新しいデータ・ブロックが収集されます。

ステートメント行の切捨て

プログラム行は、長すぎるとMONITOR出力から切り捨てられます。継続行は出力に表示されません。

レポートの生成

MONITORファイルのタイミング・データからOracle OLAPレポートを生成する場合は、FILEREAD文を使用してデータをOracle OLAP変数に読み取るプログラムを作成してから、Oracle OLAPレポート生成機能を使用してレポートを生成できます。TRACKREPORTプログラムをモデルとして使用できます。ただし、TRACKREPORTプログラムは、MONITOR出力ではなくTRACKPRG出力に対するレポートの生成のために作成されています。

複数の行の一括化

プログラム内の特定の行または行のグループの実行時間を測定する場合は、プログラムにMONITOR ON文およびMONITOR OFF文を挿入して目的の行のみを囲みます。

ネストしたプログラムでのMONITORの使用

ネストしたプログラムが単独で実行されないようにする場合は、そのプログラムの名前をMONITOR ON文に指定してからこの文をコールするプログラムを実行します。MONITORによって収集されるタイミング・データは、(ネストした)指定のプログラムのみを対象とします。指定のプログラムが複数回コールされると、MONITORは、プログラム行ごとにその行が実行された全回数に要した秒数を累計し、その行の実行回数を示します。

複数回コールされるネストしたプログラムの特定の回の実行時間を測定する場合は、コール側のプログラムにMONITOR ON文およびMONITOR OFF文を挿入して目的の1回のコールを囲みます。

非常に小さなプログラムでのMONITORの使用

非常に小さいプログラムは、結果を正確に再現できないことがあります。CPUが処理を中断して他のタスクを実行すると、実行時間の合計に占めるその時間の割合が大きくなるからです。

MONITORの測定単位

MONITORコマンドおよびTRACKPRGコマンドでは、実行時間を記録する単位としてミリ秒を使用します。実行時間には、I/Oの所要時間および次の文の待機時間は含まれません。

例10-66 MONITORによるタイミング・データの収集

この例では、MONITORを使用して、prog1の各コード行の実行に関するタイミング・データを収集し、そのデータをテキスト・ファイルに送ります。次に、MONITOR ON文を使用してprog1タイミング・データを破棄してprog2に関するデータの収集を開始します。prog2のデータを2番目のファイルに送ったら、MONITOR INITを使用して現行モニター・リストを破棄し、このために使用していたメモリーを解放します。

MONITOR ON prog1
prog1
MONITOR FILE prog1.mon
MONITOR ON prog2
prog2
MONITOR OFF
MONITOR FILE prog2.mon
MONITOR INIT

MOVE

MOVEコマンドは、アナリティック・ワークスペースのNAMEディメンションの新しい位置にオブジェクト名を移動するコマンドです。ワークスペース上でのMOVEコマンドによる効果は、表面的な再編成です。つまり、ワークスペース記憶域内での物理的な変更は行われません。多くの場合、ワークスペース・オブジェクトを再編成することによって、DESCRIBEからの出力を読み取りやすくします。

構文

MOVE name... {FIRST|LAST|{BEFORE|AFTER} name2} [AW workspace]

パラメータ

name...

移動する1つ以上のオブジェクトの名前。名前は個別に指定するか、次のいずれかの形式を使用して名前のグループを指定します。

  • name TO name
  • FIRST 
  • LAST n
  • boolean-expression (dimensioned by NAME)

修飾オブジェクト名を指定して、オブジェクトが存在するアタッチされたワークスペースを指定できます。別の方法として、AW引数を使用してワークスペースを指定することもできます。両方を一緒には使用できません。

修飾オブジェクト名またはAW引数を使用してアナリティック・ワークスペースを指定しない場合、Oracle OLAPは現行のワークスペースでオブジェクトを検索します。

FIRST
LAST

name引数で指定されるオブジェクトの移動先となるNAMEディメンションの論理位置。FIRSTを指定すると、オブジェクトはNAMEディメンションの先頭に移動します。LAST(デフォルト)を指定すると、オブジェクトはNAMEディメンションの末尾に移動します。

BEFORE name2
AFTER name2

name引数で指定されるオブジェクトの移動先となる特定オブジェクト(name2)の前後の位置。

AW workspace

オブジェクトの移動先のアタッチされたワークスペースの名前。修飾オブジェクト名またはAW引数を使用してアナリティック・ワークスペースを指定しない場合、オブジェクトは現行のワークスペース内に移動します。

使用上の注意

オブジェクトのアルファベット順の整列

NAMEディメンションに対して機能する次の文を使用すると、ワークスペース・オブジェクトをアルファベット順に整列できます。

SORT NAME A NAME
MOVE CHARLIST(NAME) FIRST

例10-67 リレーションの移動

この例は、リレーションdesc.productproductの後に移動する方法を示します。OLAP DML文

SHOW CHARLIST(NAME)

によって、次のリストが生成されます(注釈が追加されています)。

product           <--- Position of product
district
division
line
region
marketlevel
market
month
year
quarter
desc.product      <--- Old position of desc.product
region.district
division.product
...

次の文により

MOVE desc.product AFTER product
SHOW CHARLIST(NAME)

ワークスペースの順序が変更され、次のリストが生成されます(注釈が追加されています)。

product           <--- Position of product
desc.product      <--- New position of desc.product
district
division
line
region
marketlevel
market
month
year
quarter
region.district
division.product
...

OUTFILE

OUTFILEコマンドによって、文のテキスト出力をファイルにリダイレクトできます。

構文

OUTFILE {EOF | TRACEFILE | [APPEND] file-name [NOCACHE] [NLS_CHARSET charset-exp]}

パラメータ

EOF

現行の出力ファイルは閉じられ、出力がデフォルトの出力ファイルにリダイレクトされます。

TRACEFILE

出力をOracleのトレース・ファイルに送信するよう指定します。トレース・ファイルはTRACEFILEUNITオプションにより識別されます。

APPEND

出力を既存のディスク・ファイルの末尾に追加することを指定します。この引数を省略すると、ファイルの現在の内容は新しい出力によって置き換えられます。

file-name

出力が書き込まれるファイルの名前を表すテキスト式。そのファイルがカレント・ディレクトリにない場合、ファイルの名前にディレクトリ・オブジェクトの名前を含める必要があります。

注意:

ディレクトリ・オブジェクトはデータベースで定義され、ディレクトリおよびディレクトリ内のファイルへのアクセスを制御します。CDA文を使用して、カレント・ディレクトリ・オブジェクトを特定および指定できます。使用するデータベース・ユーザー名で読取りおよび書込み可能なファイルがあるディレクトリ・オブジェクトへのアクセス権については、Oracle DBAに問い合せてください。

NOCACHE

行が生成されるたびにOracle OLAPが出力ファイルに行を書き込むことを指定します。このキーワードを指定しなかった場合、Oracle OLAPでは、ファイルのI/Oアクティビティを軽減するため、テキストの保存およびファイルへの書込みが定期的に実行されます。NOCACHEキーワードを指定するとパフォーマンスが大幅に低下しますが、各行が出力ファイルに即座に記録されます。この引数はfile-nameの後に指定する必要があります。

NLS_CHARSET charset-exp

file-nameによって指定されるファイルにテキスト・データを書き込む際にOracle OLAPが使用するキャラクタ・セットを指定しますが、これによって、Oracle OLAPはデータをそのキャラクタ・セットに正確に変換できます。この引数はfile-nameの後に指定する必要があります。この引数を省略すると、Oracle OLAPはNLS_LANGオプションに記録されているデータベース・キャラクタ・セットでデータをファイルに書き込みます。

使用上の注意

PERMIT_READまたはPERMIT_WRITEプログラムのファイル出力

PERMIT_READプログラムまたはPERMIT_WRITEプログラムの内容は、ファイル出力時に空になります。これらのプログラムの内容を正常にアナリティック・ワークスペースにコピーしたりアナリティック・ワークスペースからコピーするには、OUTFILEを使用する前にプログラムの名前を変更し、INFILEを使用してプログラムをアナリティック・ワークスペースにコピーした後に、再度PERMIT_READまたはPERMIT_WRITEという名前を付けます。

現行の出力ファイル識別子

OUTFILE文は実行されるたびに、最初の手順として現行の出力ファイルを閉じます。OUTFILEによってディスク上の新しいファイルが開かれると、このファイルにはファイル・ユニット番号として不定のINTEGERが自動的に割り当てられます。現行ファイル・ユニット番号は、OUTFILEUNITオプションで保持されます。

出力ファイルへの追加

出力をあるファイルに送信後、2番目のファイルに送信すると、最初のファイルは開いたままにはなりません。最初のファイルへの出力の送信を再開するには、別のOUTFILE文を実行してAPPEND file-name句を指定する必要があります。

出力ファイルの自動クローズ

OUTFILE file-nameを使用して出力をディスク・ファイルへ送ると、現在開いている出力ファイルはすべて閉じられます。この閉じる動作は、新しいファイルが実際には開いていない場合にも実行されます(OUTFILE文に無効なfile-nameを指定した場合と同様です)。

ページング・オプションとリダイレクトされる出力

ページング・オプションは、各ページのテキスト出力の編成を制御します。このオプションには、BMARGIN、LINENUM、LINELEFT、PAGESIZE、PAGENUM、PAGEPRG、PAGING、TMARGINおよびLSIZEがあります。これらのページング・オプションは、出力ファイルごとに個別の値を持ちます。ディスク・ファイルへの出力を制御するためにページング・オプションを設定した場合、OUTFILE文を再度使用して出力をリダイレクトするまで、その新しい値が有効です。コマンドを再度使用すると、ページング・オプションはデフォルト値に戻ります。したがって、ディスク・ファイルに対してページング・オプションを特定の値にする場合、通常、OUTFILE文を実行してからそのオプションを設定します。

現行の出力ファイルとデフォルトの出力ファイル

現行の出力ファイルとは、REPORTやDESCRIBEなど、テキストを生成する文の出力先となるファイルです。OUTFILE文を使用せずに出力をファイルに送ると、Oracle OLAPはデフォルトの出力ファイルを使用します。

例10-68 レポートの出力ファイルへの送信

この例では、REPORT文の出力を出力ファイルに送信します。

OUTFILE 'budget.rpt'
REPORT budget
OUTFILE EOF 

例10-69 出力のファイルへの送信

year.end.salesという名前のプログラムがあり、このプログラムが作成するレポートをファイルに保存するとします。次のコマンドを入力してレポートをファイルに書き込みます。この例では、userfilesがディレクトリ・オブジェクトであり、yearend.txtがファイル名です。

OUTFILE 'userfiles/yearend.txt'
year.end.sales
OUTFILE EOF

これにより、ファイルにyear.end.salesレポートが格納されます。OUTFILEのAPPENDキーワードを使用すると、同じファイルにレポートを追加できます。year.end.expensesという名前の別のプログラムがあるとします。次のコマンドを使用して、このプログラムのレポートをファイルに追加します。APPENDを指定しないでOUTFILE文を実行すると、このexpensesレポートが上書きされます。

OUTFILE APPEND 'userfiles/yearend.txt'
year.end.expenses
OUTFILE EOF

PAGE

PAGEプログラムは、PAGINGの設定がYESである場合、出力に改ページを挿入するプログラムです。PAGEに対するオプションの引数は、ページの残りの行数を条件とする改ページを指定します。

PAGEプログラムは、レポート・プログラムで一般的に使用されます。これは、PAGINGがYESに設定されている場合にのみ有効で、REPORTやLISTNAMESなどの文の出力に対してのみ適用されます。

構文

PAGE [n]

パラメータ

n

現行ページの残りの行数がnより少ない場合にのみ改ページが発生することを示す正のINTEGER式。残りの行数がn以上の場合、改ページは発生しません。例10-70を参照してください。

使用上の注意

ページの先頭

PAGE文が実行されるときにすでにページの先頭が表示されている場合、改ページは発生しません。

ヘッダーの生成

PAGEプログラムからは、追加の出力が新しいページに生成されることが通知されますが、追加の出力が存在しないかぎり、新しいページにヘッダーは生成されません。追加の出力が存在する場合は、現在のPAGEPRGプログラムによって定義されるヘッダーが生成され、出力の生成が開始されます。

例10-70 まとまった行の保持

12行のデータがあり、改ページによって中断されると読み取りづらくなるため、中断されないようにするとします。12行のデータを生成する複数の文の直前にPAGE 12という文を使用します。12行のデータの前に改ページが発生するのは、ページの残りの行数が12行未満の場合のみです。その時点で12行以上残っている場合、出力は同じページ上で続行されます。

例10-71 改ページの挿入

レポート・プログラムの次の抜粋は、districtのループが開始されるたびに改ページが挿入されます。これにより、地区ごとのレポートがページの先頭から開始されます (レポート・プログラムでは、report.headというヘッダー・プログラムを使用して、カスタマイズされたヘッダーを作成します。カスタマイズされたヘッダー・プログラムについては、PAGEPRGオプションを参照)。

PUSH PAGING PAGEPRG
PAGING = YES
PAGEPRG = 'report.head'
FOR district
   DO
   PAGE
   ROW district
   BLANK
   FOR month
      ROW WIDTH 8 month sales sales.plan
   DOEND
PAGE
POP PAGING PAGEPRG

PARSE

指定したグループの式を解析するには、PARSEコマンドを使用します。引数の解析が可能な場合、引数の中の式の数、式のテキスト、オブジェクト型、データ型、式のディメンションの数と名前がPARSEによって確認されます。この情報はOracle OLAPの内部に格納され、INFOファンクションを使用すると取得できます。

PARSE文は、式をプログラムへの引数として使用する場合に特に役立ちます。

構文

PARSE text-expression

パラメータ

text-expression

解析される1つ以上の比較的小さな式が含まれるテキスト式。プログラム引数を処理する場合、プログラムのすべての引数が含まれるテキスト式としてARGSファンクションを指定できます。

使用上の注意

PARSE文によって生成される情報の取得

PARSE文によって生成される情報を取得する方法の詳細は、INFO (PARSE)ファンクションを参照してください。

例10-72 プログラムへの引数の解析

単純なレポート・プログラムで、レポートされるデータをプログラムへの引数として指定するとします。式およびデータ変数の名前を指定できるようにします。

引数をそれぞれ異なる列幅で表示するには、引数を個別に処理する必要があります。ARGSファンクションは、引数の一括処理のみが可能です。このため、PARSEおよびINFOを使用して引数を解析し、引数ごとに列を個別に生成します。サンプル・プログラムは、次のとおりです。

DEFINE report1 PROGRAM
PROGRAM
PUSH month product district DECIMALS
DECIMALS = 0
LIMIT month TO FIRST 2
LIMIT product TO ALL
LIMIT district TO 'Chicago'
PARSE ARGS
REPORT ACROSS month WIDTH 8 <&INFO(PARSE FORMULA 1) -
   WIDTH 13 &INFO(PARSE FORMULA 2)>
POP month product district DECIMALS
END

プログラムを実行する場合、複数の変数の名前(salesなど)または複数の式( sales-expenseなど)、あるいはそれぞれの1つを引数として指定できます。次のREPORT文によって、その後に示すレポートが生成されます。

report1 sales sales-expense
 
DISTRICT: CHICAGO
             --------------------MONTH--------------------
             --------JAN95--------- --------FEB95---------
PRODUCT       SALES   SALES-EXPENSE  SALES   SALES-EXPENSE
------------ -------- ------------- -------- -------------
Tents          29,099         1,595   29,010         1,505
Canoes         45,278           292   50,596           477
Racquets       54,270         1,400   58,158         1,863
Sportswear     72,123         7,719   80,072         9,333
Footwear       90,288         8,117   96,539        13,847

PERMIT

PERMITコマンドを使用すると、ワークスペース・オブジェクト、およびディメンションやディメンション化されたオブジェクトの特定の値について、読取り専用アクセス権および読取り/書込みアクセス権を付与または拒否できます。さらにPERMITによって、ディメンションのメンテナンス権限の付与または拒否、ワークスペース・オブジェクトに対する権限の変更が可能です。

通常、あるディメンションに対して設定したアクセス権は、そのディメンションのみでなく、そのディメンションによってディメンション化されるオブジェクトに対しても適用されます(ディメンション権限と他のオブジェクトに対する権限の相互作用を参照)。他のオブジェクトに対して設定したアクセス権は、その特定のオブジェクトについてのみ適用されます。権限の変更がどの時点で有効になるかは、様々な条件に応じて決まります(権限の変更が有効となるケースを参照)

ヒント:

PERMITコマンドは、直近に定義または検討されたオブジェクトに対して権限を割り当てます。オブジェクトの定義が現行の定義と異なる場合、そのオブジェクトに対して最初にCONSIDER文を使用してからPERMITコマンドを発行します。

構文

PERMIT {READ|WRITE|MNT|PERMIT} [WHEN permission-condition...]

パラメータ

READ

権限条件に応じて、オブジェクトのすべての値を読み取る権限、またはディメンションやディメンション化されたオブジェクトの特定の値のみを読み取る権限を付与または制限します。

ディメンションに対する読取り権限を制限すると、そのディメンションに対するメンテナンス権限も制限されるので注意してください。また、オブジェクトの読取り権限を付与すると、明示的なPERMIT WRITE文で書込み権限を拒否しないかぎり、読取り可能な値に対する書込み権限も許可されます。

WRITE

権限条件に応じて、オブジェクトの任意の値を変更する権限、またはディメンション化されたオブジェクトの特定の値のみを変更する権限を付与または制限します。

オブジェクトに対する書込み権限を制限しても、そのオブジェクトが完全に利用できないというわけではありません。たとえば、計算仕様(aggmapオブジェクト、プログラム、モデル、計算式など)に対する書込み権限を制限した場合、その計算仕様の内容は編集できなくなりますが、そのオブジェクトを実行することは可能です。

Oracle OLAPでは、ディメンション化されたオブジェクト内の読み取りできない値に対する書込み権限を付与することに制約はありません。ディメンション化されたオブジェクトに対するPERMIT READ文とPERMIT WRITE文の両方があり、書込みの権限条件を満たす値のいくつかが読取りの権限条件を満たす値のサブセットに含まれない場合、これらの値は変更できますが読み取ることはできません。

ヒント:

ディメンションによってディメンション化されたオブジェクトに対する書込みアクセスを許可する場合を除き、ディメンションに対する書込み権限を設定しても意味がありません。ディメンションに値を追加する権限を付与または制限するには、かわりに、そのディメンションに対するPERMIT MNT文を発行します。

MNT

権限条件に応じて、ディメンションをメンテナンスする権限を付与または制限します。

読取り権限を制限したディメンションのメンテナンス権限を付与することはできません。ディメンションの読取り権限が制限されている場合、そのディメンションのメンテナンス権限は自動的に拒否されます。

PERMIT

権限条件に応じて、オブジェクトに対する読取り、書込み、メンテナンスまたは許可権限を変更するためにPERMITコマンドを使用する権限を付与または制限します。

オブジェクトの許可権限を明示的に拒否しないかぎり、そのオブジェクトに対して他にどの権限が設定されていても、そのオブジェクトの許可権限は許可されます。

WHEN permission-condition...

WHEN句を省略してPERMIT READ文、PERMIT WRITE文またはPERMIT MNT文を実行すると、オブジェクトに対して完全な読取り、書込みまたはメンテナンス権限が回復されます。

WHEN句を指定する場合、読取り、書込み、メンテナンスまたは許可権限を付与する条件は、1つ以上のブール式で構成されます。これは、オブジェクトにディメンション性があるかどうかや設定する権限の種類によって、また、読取り権限と書き込み権限の場合はオブジェクトにディメンション性があるかどうかによって決まります。

  • ディメンション性を持たないオブジェクトに適用する許可権限、メンテナンス権限または読取り/書込み権限を指定する場合、またはディメンション化されたオブジェクトのすべての値に読取りまたは書込み権限を適用する場合は、1つの値に評価されるブール式として権限条件を指定します。(ディメンション性のないオブジェクトに対する権限を指定するために、ディメンション化されたブール式を指定したり、許可権限やメンテナンス権限を指定すると、ステータスにある最初の値がPERMITによって使用されます。)

    ヒント:

    PERMIT PERMIT文に対する権限条件としてブール値(たとえばYESまたはNO)を指定するのは避けてください。そのかわりに、権限条件をブール変数、ブール値の結果を返すファンクション、または比較演算子で計算するブール値として指定します。このようにすると、許可権限が拒否された場合、ブール値を設定してPERMITRESET文を実行することにより、この許可権限をリストアできます。オブジェクトをロックしたためにその権限を変更できない場合、該当するワークスペースのワークスペース権限プログラムでオブジェクトの許可権限を指定し、ワークスペースをデタッチしてから再アタッチします。

  • 個々のディメンション値またはディメンション化オブジェクトのスライスに適用する読取り権限または書き込み権限を指定する場合は、関連する各ディメンションに対し権限条件を1つ指定します。この場合、WHEN句には次の構文が含まれ、それぞれのディメンション化された権限条件は、オブジェクトのディメンションによってディメンション化されたブール式で構成されます。

    • WHEN dimensioned_permission_condition1
    •    [BY dimensioned_permission_condition2
    • [UNION dimensioned_permission_condition2A]...

    UNION句を使用すると、多次元変数のいくつかの対称サブキューブの結合に効率的にアクセスできます。

    ディメンション化された権限条件を表すブール式に、オブジェクト・ディメンションの他に追加のディメンションが存在する場合、PERMITは、使用するブール値の列を判別するためにステータスにある最初の値を受け取る点に注意してください。ディメンションごとのYES値の共通部分(条件の論理AND)は、権限の適用先オブジェクト内の値のサブセットです。ディメンション化された権限条件では表現できないオブジェクト・ディメンションが存在する場合、これらのディメンション値のすべてがYESであるとみなされます。

使用上の注意

オブジェクトの権限を変更する前の重要な注意事項

オブジェクトの権限を変更するときは、次の重要な注意点を念頭に置いて行ってください。

  • オブジェクトに対するPERMITコマンドを発行するには、そのオブジェクトに対する許可権限を持っている必要があります

  • DBAユーザーをロック・アウトしないでください。DBAユーザーはワークスペース内のすべてのオブジェクトにアクセスできる必要があります。

  • INTEGERディメンションに対してPERMIT文を発行すると、望ましくない動作が生じることがあります。INTEGERデータ型のディメンションには、その番号の位置で識別できる値があります。PERMITは、INTEGERの通常の順序(1、2、3、...)が保持されるようにINTEGERディメンションの番号を付け替えます。INTEGERディメンションに対するデフォルトのアクセス権を変更するためPERMITを使用する必要がある場合は、データ型がINTEGERでないディメンションとして再定義してください。

権限の変更が有効となるケース

PERMIT_READプログラムおよびPERMIT_WRITEプログラム内で権限が評価されるのは、PERMIT文またはPERMITRESET文を明示的に発行してからターゲット・オブジェクトを参照したときのみです。

注意:

PERMITRESETは、アナリティック・ワークスペース権限プログラムの実行直後にAW ATTACHによって自動的に実行されます。PERMITRESETの実行により、ワークスペースはすべての権限が実装されてアタッチされます。

アナリティック・ワークスペースがアタッチされてPERMIT_READプログラムまたはPERMIT_WRITEプログラムが実行されると、PERMIT文で指定した権限変更は次の場合に有効になります。

  • PERMITRESET文が実行された場合。

  • いずれかのオブジェクト(ディメンションを除く)を対象とし、権限条件が単一のブール変数で構成される場合、そのブール変数に対する変更は権限に即座に反映されます。(この場合、PERMITRESETを実行する必要はありません。)

  • その他の状況では、PERMITRESET文を発行しない場合、権限はオブジェクトを次回参照するときに評価されます。

    注意:

    OBJファンクションはこのルールの例外です。OBJではオブジェクトがメモリーにロードされないので、オブジェクトの権限に対して前回のロード時以降に加えられた変更は反映されません。新しい権限基準に基づいた情報がOBJから返されるようにするには、OBJ文の前にLOAD文を実行します。

オブジェクトに対する唯一のPERMIT文がPERMIT WRITE文の場合

オブジェクトに対する唯一のPERMIT文がPERMIT WRITEの場合、そのオブジェクトにはデフォルトで読取り権限が付与されます。デフォルトの読取り権限は、PERMIT WRITE文の権限条件の値とは関係なく付与されます。したがって、単一セルの権限条件を持つPERMIT_WRITEの評価結果がNOであっても、ディメンション化されたオブジェクトのすべての値、またはディメンション化されないオブジェクトに対する読取り専用アクセスは可能です。

オブジェクトに対する唯一のPERMIT文が、ディメンション化された権限条件を持つPERMIT WRITEの場合、この文によって、読取り/書込みアクセスが指定される値、および読取り専用アクセスが指定される値があります。例10-73を参照してください。

ディメンション権限と他のオブジェクトに対する権限の相互作用

ディメンション化されたすべてのデータは、そのディメンションの読取り権限に影響されます。読取り権限条件を満たすディメンション値によって、ディメンションのデフォルトのステータスが決まります。読取り権限のないディメンション値に対応するディメンション化されたオブジェクトの値にはアクセスできません。

ただし、ディメンションに関連付けられている書込み権限をそのディメンションによってディメンション化された他のオブジェクトに適用するには、そのディメンション化オブジェクトに関連付けられているPERMIT文が1つ以上存在する必要があります。

  • ディメンション化オブジェクトにディメンションの書込み権限を継承させたいが、そのオブジェクト自体の権限は設定したくない場合は(ディメンション権限と相互作用する可能性があるため)、評価結果がYESとなる単一セルの権限条件を指定したPERMIT READを使用します。

  • ディメンション化オブジェクトにディメンションの書込み権限を継承させると同時にそのオブジェクト自体の権限も設定する場合は、ディメンションの権限とオブジェクトの権限がどのように影響し合うかを理解した上でオブジェクトの権限を設定してください。

ディメンション権限と、そのディメンションによってディメンション化された大部分のオブジェクトの権限は、次のように相互作用します。

  • ディメンションのアクセス権が、ディメンションに定義されているすべてのディメンション・サロゲートに適用されます。ディメンション・サロゲートでは、PERMIT文を使用できません。

  • ディメンションと関連付けられている読取り権限または書込み権限が存在するが、そのディメンションによってディメンション化されたオブジェクトに関連付けられている権限の制限はない場合、ディメンション化されたオブジェクトの権限は、ディメンションの権限と同じになります。

  • ディメンションとディメンション化されたオブジェクトの両方に関連付けられている読取り権限が存在する場合、ディメンション内にある読取り権限を持つ値およびオブジェクト内にある読取り権限を持つ値との共通部分を取ることにより、オブジェクト内にある読取り権限を持つ値が決定されます。

  • ディメンションとディメンション化されたオブジェクトの両方に関連付けられている書込み権限が存在する場合、ディメンション内にある読取り権限を持つ値、ディメンション内にある書込み権限を持つ値、およびオブジェクト内にある書込み権限を持つ値の共通部分を取ることにより、オブジェクト内にある書込み権限を持つ値が決定されます。

ただし、リレーションと値セットについてはこれは当てはまりません。リレーションまたは値セットのディメンションに対して制限付きの書込み権限が設定されていても、そのディメンションによってディメンション化されるリレーションおよび値セットには影響しません。

権限の判別

DESCRIBE文を使用してオブジェクトを記述する場合、LDのように、オブジェクトに関連付けられている権限が表示されます。唯一の例外は、オブジェクトの許可権限を拒否される場合です。この場合は、オブジェクトを記述しても権限は表示されません。

スコーピング・ツールとしてのPERMITのLIMITに対するメリット

アプリケーション・プログラム内のスコーピング・ツールとして、PERMITにはLIMITコマンドよりも有利な点がいくつかあります。ブール式に従ってディメンション化されたオブジェクトのスコープを制限するには、LIMITおよびLIMITKEEPという2つのLIMIT文を使用する必要があります。同じ処理を実行するために必要なPERMIT文は1つのみです。さらに、アプリケーションのユーザーはアプリケーション・プログラム内のPERMITコマンドで設定された制限付きスコープを変更できません。アプリケーション・プログラム内のLIMITコマンドによって設定されたスコープは、アプリケーションのユーザーが多くのLIMITコマンドを実行するのみで簡単に変更できます。

権限違反の処理

PERMITERRORオプションを使用すると、PERMITコマンドによって設定された変数への権限に違反した場合のOracle OLAPによる処理方法を制御できます。PERMITERRORのデフォルト値はYESで、権限が拒否されている値にユーザーがアクセスしようとするとOracle OLAPによってエラーが通知されることを意味します。PERMITERRORをNOに設定すると、エラー条件が通知されることなくアクセスが拒否されるため、この設定は、ディメンションを許可される値にあらかじめ制限することなく、部分的な権限を持つディメンション化された変数のレポートを作成する場合に役立ちます。PERMITERRORの設定がNOである場合、読取り権限のない値はレポートにNA値として表示されます。

例10-73 変数の権限

monthproductおよびdistrictによってディメンション化される変数salesに対して、次のレポートに示すように、3つの変数の形式のディメンション化された3つの権限条件があるとします。

MONTH.BOOL<MONTH>  PROD.BOOL<PRODUCT>  DISTRICT.BOOL<DISTRICT>
-----------------  ------------------  -----------------------
Jan95    NO        Tents     YES       Boston     NO
Feb95    YES       Canoes    YES       Atlanta    NO
Mar95    NO        Racquets   NO       Chicago    YES
...      ...       ...        ...      ...        ...

この例で示すYESの値が権限条件に存在するYESの値としてはすべてである場合、次のPERMIT文は、95年2月にシカゴで販売したテントおよびカヌーのsalesデータに対する読取り/書込み権限を付与します。salesに対してPERMIT READ文を指定しなかった場合、Oracle OLAPは他のすべてのsalesの値に対して読取り専用権限を付与します。

PERMIT WRITE WHEN district.bool BY prod.bool BY month.bool

完全な書込み権限にリストアするには、次のPERMIT文を実行します。

PERMIT WRITE

salesに対する制限付き書込み権限が存在しない場合、次のPERMIT文は、95年2月にシカゴで販売したテントとカヌーの販売データに対する読取り/書込み権限を付与し、他の販売データの値をすべて非表示にします。

PERMIT READ WHEN district.bool BY prod.bool BY month.bool

例10-74 ディメンション化された権限条件

productディメンションへのアクセスを制限するには、productによってディメンション化された権限条件が必要です。ただし、権限条件に2番目のディメンション、たとえばauthorityが存在する場合、PERMITは、authorityのステータスにある最初の値に基づいてproductに関するBOOLEAN値を選択します。authorityディメンションの読取り権限を1つの値に制限すると、PERMITは、その値を使用してproductに対する権限条件のBOOLEAN値を判別します。REPORTコマンドによって、その後に出力が生成されます。

DEFINE authority DIMENSION TEXT
MAINTAIN authority ADD OTHER DBA
DEFINE prod_authority VARIABLE BOOLEAN <product authority>
...
" Assign values to the variable
...
REPORT prod_authority
 
              -----------------PROD_AUTHORITY------------------
              --------------------PRODUCT----------------------
AUTHORITY     Tents   Canoes   Racquets   Sportswear   Footwear
---------     -----   ------   --------   ----------   --------
Other            NO       NO        YES          YES        YES
Dba             YES      YES        YES          YES        YES

CONSIDER product
PERMIT READ WHEN prod_authority
PERMITERROR = NO
RPEPORT product
 
PRODUCT
-------------
Racquets
Sportswear
Footwear

CONSIDER authority
PERMIT READ WHEN AUTHORITY EQ 'dba'
PERMITRESET
Report product
 
PRODUCT
-------------
Tents
Canoes
Racquets
Sportswear
Footwear

例10-75 ユーザー定義のブール・ファンクション

次の例のusercheckは、変数thisuserの現行値をユーザーIDのリストと照合するユーザー定義のブール・ファンクションです。thisuserの現行値がリストに存在しない場合、usercheckNOを返します。sales変数に適用される次のPERMIT文は、usercheckの戻り値がNOである場合、salesのすべての値に対する読取り専用権限を付与します。usercheckの戻り値がYESである場合、salesのすべての値に対する読取り/書込み権限を付与します。

PERMIT WRITE WHEN usercheck(thisuser)

price変数に適用される次のPERMIT文は、usercheckの戻り値がYESである場合、priceのすべての値に対する完全な権限を付与します。戻り値がNOである場合、price変数に対するすべての権限を拒否します。

PERMIT READ WHEN usercheck(thisuser)

例10-76 個々のセル

特定の販売数量データ、たとえば、1997年3月のボストンのラケットの販売数量にアクセスできないようにする場合、ブール変数を作成し、これをPERMIT文で次の文に示すように使用します。

DEFINE sales.bool VARIABLE BOOLEAN <month product district>
sales.bool = yes
LIMIT month TO 'Mar97'
LIMIT product TO 'Racquets'
LIMIT district TO 'Boston'
sales.bool = no
CONSIDER sales
PERMIT READ WHEN sales.bool

例10-77 個々のディメンション値

districtディメンションに適用される次のPERMITコマンドは、BostonおよびAtlantaを除くすべてのディメンション値にアクセスできなくします。このコマンドにより、Bostonに関連するすべてのデータに対する読取り/書込み権限が付与され、Atlantaに関連するすべてのデータに対する読取り専用権限が付与されます。また、ファンクションusercheck(例10-75を参照)によって許可されるユーザーIDを持たないユーザーがdistrictの権限を変更できないようにします。

PERMIT READ WHEN district EQ 'Boston' OR district EQ 'Atlanta'
PERMIT WRITE WHEN district EQ 'Boston'
PERMIT PERMIT WHEN usercheck(thisuser) 

PERMITRESET

PERMITRESETコマンドは、権限条件の値を再評価するコマンドです。権限条件は、オブジェクトに関連付けられたPERMITコマンドによって使用される基準を指定する、1つ以上のブール式で構成されます。

権限条件は、ディメンション化される場合、権限のターゲットになるディメンション化されたオブジェクトのPERMITの値を示します。単一セルの権限条件では、特定のユーザーがオブジェクトにアクセスできるかどうかなどのブール基準を示すことができます。

あるオブジェクトについて既存のPERMITコマンドを維持するが、PERMITコマンドと関連付けられている権限条件を再評価する場合、PERMITRESET文を発行します。そのオブジェクトの権限は、オブジェクトをOLAP DML文で次回使用するときに、権限条件の新しい値が基準になります。

関連項目:

起動プログラムPERMITコマンドおよびPERMITERRORオプション

構文

PERMITRESET  [object_name]  [READ|WRITE]

パラメータ

object_name

権限条件を再評価するオブジェクトの名前を指定します。オブジェクト名を指定しないと、すべてのオブジェクトの権限条件が再評価されます。

READ

権限条件の再評価を、PERMIT READコマンドのみについて、または指定したオブジェクトのPERMIT READ文について実行します。

WRITE

権限条件の再評価を、PERMIT WRITEコマンドのみについて、または指定したオブジェクトのPERMIT WRITE文について実行します。

例10-78 権限のリセット

次の例では、ユーザー定義のブール・ファンクションusercheckによって変数thisuserの現行値が確認され、その値が100より大きい場合にのみYESが返されます。変数uservarへのアクセスは、thisuser100より大きい場合にのみ許可されます。ただし、uservarの権限をリセットせずにthisuserの値を100以下に変更した場合でも、アクセスが許可されます。

次の文

DESCRIBE uservar

によって、次の出力が生成されます。

DEFINE USERVAR VARIABLE INTEGER
PERMIT READ WHEN usercheck(thisuser)

次の文

SHOW uservar

によって、次の出力が生成されます。

5

次の文

DESCRIBE usercheck

によって、次の出力が生成されます。

DEFINE USERCHECK PROGRAM BOOLEAN
PROGRAM
  ARG thisuser INT
  TRAP ON errorexit NOPRINT
  IF thisuser GT 100
          THEN RETURN YES
  ELSE RETURN NO
  errorexit:
       RETURN NO
END

次の文

DESCRIBE thisuser

によって、次の出力が生成されます。

DEFINE THISUSER VARIABLE INTEGER

次の文

SHOW thisuser

によって、次の出力が生成されます。

101

次の文により

thisuser = 100
SHOW uservar

によって、次の出力が生成されます。

5

次の文により

PERMITRESET luservar READ
SHOW uservar 

によって、次のエラーが生成されます。

ERROR: You do not have permission to read this value of USERVAR

POP

POPコマンドは、直前のPUSH文で保存したディメンションのステータス(NAMEディメンションを含む)、値セットのステータス、オプションの値または単一セル変数の値をリストアするコマンドです。

一般にPUSHおよびPOPは、プログラムの実行時にのみ適用されるオプションおよびディメンション・ステータスを変更するときに、プログラム内で使用されます。その後、オプションおよびステータスはプログラムの実行前と同じになります。

関連項目:

POPLEVELPUSHPUSHLEVELおよびCONTEXTコマンド

構文

POP name1 [nameN]

パラメータ

name

保存値をリストアする、直前のPUSH文で指定されたディメンション、値セット、変数またはオプションの名前。

POPの使用例は、例10-84を参照してください。

POPLEVEL

POPLEVELコマンド(省略形はPPL)は、前回のPOPLEVEL文以降に実行された、同じマーカーを指定するPUSHコマンドによって保存されたすべての値をリストアするコマンドです。

POPLEVELを使用して保存値をリストアするには、先にPUSHLEVELを使用して一連のPUSHコマンドの始点をマークしておく必要があります。一連のコマンドの終点は、POPLEVELによってマークされます。POPLEVELは、プログラム内でのみ使用できます

構文

POPLEVEL marker-expression [DISCARD]

パラメータ

marker-expression

マーカーとして使用するテキスト値。この値は、ポップする一連の保存値の始点をマークするために対応するPUSHLEVEL文で使用されている値と一致する必要があります。

DISCARD

POPLEVEL文の発行時に、同じレベルでプッシュされた値が破棄されることを指定します。DISCARDを指定しなかった場合、プッシュされたオブジェクトをリセットするために、プッシュされた値が使用されます。

使用上の注意

POP LEVEL文の可能な使用方法

POPLEVEL文の使用法として考えられるのは、次の2つです。

  • 範囲をいっそう広げているか狭めている一連のLIMITコマンドの後。それぞれ対応するPUSHが組み合せて指定されている場合。

  • きわめて長く複雑な単独のPUSH文の後、またはプログラム全体に記述されている一連の短いPUSH文の後で、編集に手間がかかる可能性のある場合。PUSHLEVELおよびPOPLEVELを使用すると、長く複雑なPUSH文の引数を編集でき、対応する長く複雑なPOP文を編集する必要もありません。

POPLEVELを使用するサンプル・プログラムは、PUSHLEVELコマンドの例を参照してください。

PROGRAM

PROGRAMコマンドは、新規または既存のプログラムにまったく新しい内容を入力するコマンドです。プログラムに複数行のコードがすでに存在する場合、これらは上書きされます。

PROGRAMを使用して、プログラム・オブジェクトの内容を入力するには、プログラム・オブジェクトの定義は最新のもの、または現行のセッション中に検討されたものにする必要があります。そうでない場合は、最初にCONSIDER文を使用し、現行の定義にする必要があります。

PROGRAM文の代替文はEDIT PROGRAM文であり、OLAP Worksheet内でのみ使用できます。EDIT PROGRAM文を実行すると、programオブジェクトの仕様を追加、削除または変更できる編集ウィンドウが開きます。

関連項目:

OLAP DMLプログラムの記述、コンパイルおよびデバッグの詳細は、「OLAP DMLプログラム」を参照してください。

構文

PROGRAM [contents]

パラメータ

contents

プログラムの行を構成するOLAP DML文を表すテキスト式。プログラム内には、ほとんどのOLAP DML文を使用できます。OLAP DMLプログラムの記述、コンパイルおよびデバッグの詳細は、「OLAP DMLプログラム」を参照してください。

プログラム内に記述できる最大の行数は32,000です。コマンドライン・レベルでPROGRAM文をコード化する際は、改行デリミタ(\n)でプログラムの行を分けるか、例10-80に示すJOINLINESファンクションを使用します。

例10-79 引数を持つユーザー定義ファンクション

アナリティック・ワークスペースにunits.planという名前の変数が含まれ、この変数はproductdistrictおよびmonthディメンションによってディメンション化されているとします。この変数は販売予定の製品数を示すINTEGERデータを保持します。

また、units_goals_metという名前のプログラムを定義するとします。このプログラムはユーザー定義ファンクションです。これは、units.plan変数の特定のセルを指定する3つのディメンション値の引数を受け取り、さらに、実際に販売された数量をそのセルに指定する4番目の引数を受け取ります。このプログラムは、コール側プログラムにブール値を返します。実際の販売数量が予定販売数量の10%以内である場合はYESを返し、そうでない場合はNOを返します。

units_goals_metプログラムの定義は、次のとおりです。

DEFINE units_goal_met PROGRAM BOOLEAN
LD Tests whether actual units met the planned estimate
"Program Initialization
ARGUMENT userprod  TEXT
ARGUMENT userdist  TEXT
ARGUMENT usermonth TEXT
ARGUMENT userunits INTEGER
VARIABLE answer boolean
TRAP ON errorlabel
PUSH product district month
"Program Body
LIMIT product TO userprod
LIMIT district TO userdist
LIMIT month TO usermonth
IF (units.plan - userunits) / units.plan GT .10
   THEN answer = NO
   ELSE answer = YES
"Normal Exit
POP product district month
RETURN answer
"Abnormal Exit
errorlabel:
POP product district month
SIGNAL ERRORNAME ERRORTEXT
END

units_goal_metプログラムを実行し、successという名前の変数に戻り値を格納するには、代入文(SET)を使用します。

success = units_goal_met('TENTS' 'BOSTON' 'JUN96' 2000)

例10-80 即時実行のプログラム

この例は、柔軟な即時実行のレポート・プログラムを作成して、アンパサンド置換を使用した従来型のプログラムの非能率性を回避します。従来型のプログラムには、次のようなループが存在します。

FOR &dimname
   ROW &dimname &varname

アンパサンド置換を回避するには、たとえば、STANDARDREPというプログラムを定義し、内部にコードを記述しないままにするか、破棄しても差し支えないコードを記述しておきます。次に、レポート・プログラムに次のような行を挿入します。

DEFINE myreport PROGRAM
LD Program to produce my report
PROGRAM
ARGUMENT dimname TEXT
ARGUMENT varname TEXT
...
CONSIDER standardrep
PROGRAM JOINLINES(JOINCHARS('FOR ', dimname) - 
   JOINCHARS('   ROW ', dimname, ' ', varname) )
COMPILE standardrep
standardrep
...

例10-81 入力ファイルを基にしたプログラム

この例は、salesrep.infという名前のASCIIディスク・ファイルに記述された簡単なプログラムの本文です。ファイルの最初の行にはプログラムが定義され、2番目の行にはPROGRAM文が含まれ、後続の行にはプログラムの行が記述されています。

DEFINE salesrep PROGRAM
PROGRAM
PUSH month product district
TRAP ON haderror
LIMIT month TO FIRST 3
LIMIT product TO FIRST 3
LIMIT district TO ALL
REPORT grandtotals sales
haderror:
POP month product district
END

salesrepプログラムをアナリティック・ワークスペースに含めるには、次の文を実行します。

INFILE 'salesrep.inf'

既存のプログラムを基にして入力ファイルを作成するには、OUTFILE文を使用します。

例10-82 PROGRAM文のかわりにOLAP Worksheetを使用する場合

OLAP Worksheetを使用してプログラムを作成する場合、EDIT文を使用して、内容を入力できる「編集」ウィンドウを表示できます。たとえば、salesrepという名前の新規プログラムを定義して、これを「編集」ウィンドウに表示するには、次の文を使用します。

DEFINE salesrep PROGRAM
EDIT salesrep

PROPERTY

PROPERTYコマンドは、直近に定義または検討されたオブジェクトに対して、プロパティを追加または削除するコマンドです(DEFINE PROGRAMコマンドおよびCONSIDERコマンドを参照)。プロパティは、特定の定義に関連付けられた名前付きの値です。あらゆる種類の定義に対して、1つ以上のプロパティを割り当てることができます。たとえば、プロパティはオブジェクトに割り当てることができるので、オブジェクトのレポートを準備する場合、使用する小数点以下の桁数を確認できます。

構文

PROPERTY { name value | DELETE {ALL | name} }

パラメータ

name

プロパティの名前が含まれるテキスト式。プロパティ名の長さは1から256バイトです。

注意:

$(ドル記号)で始まる名前を持つ独自のプロパティは作成しないでください。Oracle OLAPでは、$(ドル記号)で始まる名前を持つプロパティは、あらかじめ定められた方法で解釈されるシステム・プロパティとして使用されるため、システムに予約されています。

プロパティ名のデータ型はTEXTです。ただし、名前に指定する値にUnicodeエスケープ・シーケンスを含める場合や、指定した値をCONVERTまたはTO_NCHARファンクションを使用して明示的にNTEXTに変換した場合は異なります。

value

プロパティの値が含まれる式。プロパティ値のデータ型は、NUMBERINTEGERLONGINTEGERDECIMALSHORTDECIMALTEXTNTEXTIDBOOLEANDATEまたはDATETIMEです。Oracle OLAPでは、指定した値に基づいてデータ型が判別されます。たとえば、YESを指定すると、データ型はBOOLEANであるとみなされます。データ型DATEの変数に格納される日付値を指定すると、そのプロパティのデータ型はDATEであるとみなされます。

DELETE ALL
DELETE name

オブジェクトのプロパティをすべて削除するか、nameに指定したプロパティのみを削除します。一度に指定できるnameは1つのみです。

使用上の注意

PROPERTYの実行時におけるプログラム実行のトリガー

TRIGGERコマンドを使用すると、PROPERTY文を、OLAP DMLプログラムを自動的に実行するイベントにすることができます。詳細は、トリガー・プログラムを参照してください。

プロパティ値の変更

新しい値を既存のプロパティ名に割り当てるPROPERTY文を実行すると、以前の値は新しい値によって上書きされます。

OBJによるプロパティ値の判別

プロパティをOLAP DML文で使用するには、OBJファンクションのプロパティ関連キーワードを使用して、プロパティの値を取得する必要があります。たとえば、オブジェクトのレポート時に使用するために小数点以下の桁数を格納するdecplaceという名前のプロパティがあるとします。REPORT文を実行する場合、OBJファンクションとPROPERTYキーワードを組み合せて使用することによってdecplaceプロパティの値を取得し、その値をREPORT文のDECIMAL属性と組み合せて使用できます。

FULLDSCによるプロパティ値のリスト表示

オブジェクトのプロパティをリスト表示するには、FULLDSC文を使用します。FULLDSCからの出力を使用すると、新しいオブジェクトを作成できます。詳細は、FULLDSCプログラムを参照してください。

例10-83 変数へのプロパティの追加

次の文は、プロパティdecplaceおよびprgnameactual変数に追加し、decplaceプロパティの値としてdecimal 4を割り当て、prgnameプロパティの値としてテキストrepprgを割り当てます。

CONSIDER actual
PROPERTY 'decplace' 4
PROPERTY 'prgname' 'repprg'

PUSH

PUSHコマンドは、ディメンション(NAMEディメンションを含む)の現行のステータス、値セットのステータス、オプションの値または単一セル変数の値を保存するコマンドです。これらの保存値およびステータスは、POP文によって後でリストアできます。

一般にPUSHおよびPOPは、プログラムの実行時にのみ適用されるオプションおよびディメンション・ステータスを変更するときに、プログラム内で使用されます。その後、オプションおよびステータスはプログラムの実行前と同じになります。

関連項目:

POPPOPLEVELPUSHLEVELおよびCONTEXTコマンド

構文

PUSH name1 [name]

パラメータ

name

ステータスまたは値を保存する、ディメンション、値セット、オプションまたは変数の名前。

使用上の注意

ディメンションのプッシュされたステータスでのMAINTAIN文の効果

ディメンションを指定してMAINTAIN文を使用すると、ディメンションのプッシュされたステータス・リストが消去されます。たとえば、毎回異なる制限値を使用してディメンションmonthを数回プッシュしたとします。MAINTAIN文を使用してmonthディメンションのメンテナンス・アクティビティを実行すると、monthのステータスはALL(デフォルト)にリセットされ、monthディメンションをポップしても効果がなくなります。

例10-84 値の保存とリストア

次のプログラムは、PUSHおよびPOPを使用して、特定の製品、地区および月に関して小数桁のない売上高を表示し、その後、ステータスの設定およびDECIMALSの値をプログラム実行前の状態にリストアします。

DEFINE report1 PROGRAM
PROGRAM
TRAP ON cleanup
PUSH DECIMALS product district month
 
DECIMALS = 0
LIMIT product TO 'Sportswear' 'Footwear'
LIMIT district TO 'Atlanta' 'Dallas'
LIMIT month TO 'Jan96' TO 'Jun96'
REPORT sales
 
cleanup:
POP DECIMALS product district month
END

PUSHLEVEL

PUSHLEVELコマンドは、一連のPUSHコマンドの始点をマークするコマンドです。対応するPOPLEVEL文を使用すると、PUSHLEVELの後に実行したPUSHコマンドで保存したすべての値をリストアできます。POPLEVELは、一連のコマンドを開始するPUSHLEVEL文と同じマーカーを指定する必要があります。PUSHLEVELは、プログラム内でのみ使用できます。

構文

PUSHLEVEL marker-expression

パラメータ

marker-expression

すべての保存値が即座にポップされる一連のPUSHコマンドの始点をマークするためのテキスト値。まったく同じmarker-expressionを指定するPOPLEVEL文によって、一連の保存値全体がリストアされます。

使用上の注意

PUSHLEVELとPOPLEVEL文の作成時の注意事項

PUSHLEVEL文をコーディングする際は、次の点に注意してください。

  • PUSHLEVELとPOPLEVELのペアは、次のコードに示すように、ペアごとに異なるマーカーを指定するとネストできます。

    PUSHLEVEL 'firstlevel'
    PUSH PAGESIZE DECIMALS       < saves values in FIRSTLEVEL
    ...
    PUSHLEVEL 'secondlevel'
    PUSH month product           < Saves values in SECONDLEVEL
    ...
    POPLEVEL 'secondlevel'       < Restores values in SECONDLEVEL
    ...
    POPLEVEL 'firstlevel'        < Restores values in FIRSTLEVEL
    

    通常は1つのプログラムに複数のレベルは必要ありません。ただし、1つのプログラムが別のプログラムをコールし、それぞれのプログラムに1組のPUSHLEVELおよびPOPLEVELコマンドが含まれる場合、ネストしたレベルが自動的に作成されます。

  • 複数のPUSHLEVELコマンドに対して同じマーカーを指定すると、同じマーカーを指定しているPOPLEVEL文によって、最後のPUSHLEVEL文以降に保存された値のみがリストアされます。

  • 複数のPUSHLEVELコマンドに対して異なるマーカーを指定すると、いずれかのPUSHLEVEL文のマーカーを指定するPOPLEVEL文によって、そのPUSHLEVEL文以降に保存されたすべての値がリストアされます。この場合、そのPUSHLEVELコマンド以降のPUSHLEVELコマンドの後に保存された値も含みます。

例10-85 レベル・マーカーの作成

PUSHLEVEL文を使用して、firstlevelという名前のレベル・マーカーを作成できます。その後でPUSHを使用すると、現行値を保存できます。

PUSHLEVEL 'firstlevel'
PUSH month DECIMALS ZSPELL

レベル・マーカーは、一重引用符で囲まれた任意のテキストです。値がレベル・マーカーの名前になる単一セルのID変数またはTEXT変数の名前を指定することもできます。プログラムの終了処理の部分にPOPLEVEL文を使用すると、firstlevelマーカーの作成以降に保存したすべての値をリストアできます。

POPLEVEL 'firstlevel'

例10-86 PUSHLEVELおよびPOPLEVELコマンドのネスト

PUSHLEVELおよびPOP LEVELコマンドをネストすると、特定の値のグループをプログラム内の一定の場所に保存し、他の値のグループをプログラム内の別の場所に保存できます。次の例は、2組のネストしたPUSHLEVELコマンドとPOPLEVELコマンドを示します。

PUSHLEVEL 'firstlevel'
PUSH PAGESIZE DECIMALS "Saves values in FIRSTLEVEL
        ...
PUSHLEVEL 'secondlevel'
PUSH month product     "Saves values in SECONDLEVEL
      ...
POPLEVEL 'secondlevel' "Restores values in SECONDLEVEL
       ...
POPLEVEL 'firstlevel'  "Restores values in FIRSTLEVEL

通常は、1つのプログラム内でPUSHLEVELおよびPOPLEVELコマンドの複数のペアを使用することはありません。ただし、1つのプログラムが別のプログラムをコールし、それぞれのプログラムにPUSHLEVELおよびPOPLEVELコマンドのペアが1組ずつ含まれる場合、ネスト機能が自動的に働きます。

例10-87 ワンステップの復元とネスト・レベル

次のプログラムは、PUSHLEVEL 'rpt1'を使用して、プログラム内で個別にプッシュされているDECIMALSの元の値やmonthproductおよびdistrictの元のステータスをワンステップで復元するためにマークします。

ネストを実際に示すため、このプログラムには、'rpt2'をマーカーとするネストしたPUSHLEVELとPOPLEVELのペア、および様々な箇所にあるいくつかのSTATUSコマンドが含まれています。プログラムの出力とプログラムを比較することにより、ステータスがどのように影響を受けているかがわかります。

DEFINE sales.RPT PROGRAM
PROGRAM
STATUS month product district
 
PUSHLEVEL 'rpt1'
PUSH DECIMALS month
DECIMALS = 0
LIMIT month TO 'Jan96'
REPORT WIDTH 8 DOWN district WIDTH 9 ACROSS product: expense
PUSH product
LIMIT product TO 'Racquets' 'Sportswear'
REPORT DOWN district ACROSS product: advertising
 
PUSHLEVEL 'rpt2'
PUSH district
LIMIT district TO 'Atlanta' 'Dallas' 'Chicago'
REPORT DOWN district ACROSS product: sales
BLANK
STATUS month product district
BLANK
 
POPLEVEL 'rpt2'
STATUS month product district
BLANK
POPLEVEL 'rpt1'
 
STATUS month product district
END

sales.rptプログラムによって生成される出力は、次のとおりです。

The current status of MONTH is:
ALL
The current status of PRODUCT is:
ALL
The current status of DISTRICT is:
ALL
MONTH: JAN96
         ---------------------EXPENSE---------------------
         ---------------------PRODUCT---------------------
DISTRICT   Tents    Canoes   Racquets  Sportswear  Footwear
-------- --------- --------- --------- ---------- ----------
Boston      31,299    67,527    52,942     49,668    80,565
Atlanta     41,139    53,186    57,159    108,047    99,758
Chicago     27,768    45,621    53,756     65,055    81,639
Dallas      47,063    34,072   118,807    113,629    19,785
Denver      33,177    42,975    89,144     63,380    36,960
Seattle     41,043    64,009    26,719     38,970    46,900
Month: JAN96
               -----ADVERTISING-----
               -------PRODUCT-------
DISTRICT        RAcquets  Sportswear
-------------- ---------- ----------
Boston              3,784      3,352
Atlanta             4,384      9,509
Chicago             3,351      5,283
Dallas              8,700      8,340
Denver              6,215      4,654
Seattle             2,344      3,726
MONTH: Jan96
               --------SALES--------
               -------PRODUCT-------
DISTRICT        Racquets  Sportswear
-------------- ---------- ----------
Atlanta            61,895    129,616
Dallas            125,880    128,115
Chicago            58,649     77,490
The current status of MONTH is:
JAN96
The current status of PRODUCT is:
RACQUETS, SPORTSWEAR
The current status of DISTRICT is:
ATLANTA, DALLAS, CHICAGO
 
The current status of MONTH is:
JAN96
The current status of PRODUCT is:
RACQUETS, SPORTSWEAR
The current status of DISTRICT is:
ALL
 
The current status of MONTH is:
ALL
The current status of PRODUCT is:
ALL
The current status of DISTRICT is:
ALL

RECAP

RECAPコマンドは、現行セッション中に以前に入力した文を現行の出力ファイルまたは指定したファイルに送信するコマンドです。この文は、現在のセッション中の最後に入力した最大256の文のリストであるコマンド・ログからコピーされます。

注意:

RECAP文は、コマンド・ログには含まれません。

構文

RECAP [number|ALL] [ 'search-text' ] [ FILE file-name ]

パラメータ

number

送信される文の数を示す正のINTEGERsearch-textを指定した場合、search-text文字列が含まれるサブセットからこの数の文が送信されます。search-textを指定しなかった場合、コマンド・ログのうち最近実行された部分からこの数の文が送信されます。デフォルトの数は10です。

ALL

search-textを指定した場合、ALLを指定すると検索要件を満たす文がすべて要求されます。search-textを指定しなかった場合、ALLを指定するとコマンド・ログ内のすべての文が要求されます。

search-text

引用符で囲まれたテキスト・リテラル。この引数を指定すると、search-textが含まれる文がコマンド・ログ内の文の中から検索されます。検索では、大/小文字は区別されません。その後、これらの文はサブセットを構成し、そこからRECAPはnumberまたはALLに指定される数の文を送信します。

FILE file-name

RECAP文の出力を指定のファイルに書き込みます。file-nameは出力が書き込まれるファイルの名前を表すテキスト式を指定します。そのファイルがカレント・ディレクトリにない場合、ファイルの名前にディレクトリ・オブジェクトの名前を含める必要があります。

注意:

ディレクトリ・オブジェクトはデータベースで定義され、ディレクトリおよびディレクトリ内のファイルへのアクセスを制御します。CDA文を使用して、カレント・ディレクトリ・オブジェクトを特定および指定できます。使用するデータベース・ユーザー名で読取りおよび書込み可能なファイルがあるディレクトリ・オブジェクトへのアクセス権については、Oracle DBAに問い合せてください。

使用上の注意

search-textパラメータの順序

search-text引数に加えてALL引数またはnumber引数を使用する場合、search-textは2番目に指定する必要があります。

パラメータを指定しないRECAP

引数のないRECAPを指定した場合、最近の10の文が送信されます。

文の再実行

以前に実行した文をREEDITによって編集するため、または以前に実行した文をREDOによって再実行するため、RECAPの出力を使用できます。

ファイルとディレクトリの指定

OLAP DML文でファイルやディレクトリを指定する場合、必ず一重引用符で囲むことをお薦めします。

例10-88 「actual」を含む最新の3つの文の取得

次のRECAP文は、テキスト・リテラル「actual」を含む最新の3つの文を要求します。

RECAP 3 'actual'

この文によって生成される出力は、次のとおりです。

       COMMAND LOG
    3: dsc actual
    5: report total(actual)
    8: report average(actual) 

REDO

REDOコマンドは、セッション内で以前に入力した文を再度実行するコマンドです。この文は、現在のセッション中に最近入力した最大256の文のリストであるコマンド・ログから取り出されます。REDOでは、文を再実行する前に文を変更できます。

注意:

REDO文自身はコマンド・ログに含まれませんが、REDOによって再実行された文は含まれます。

構文

REDO [number|index] 'original' 'replacement' [specifier

パラメータ

number

再実行される文の数を示す正のINTEGER。文とその番号を表示するには、RECAP文を使用します。

index

コマンド・ログの末尾を基準とする、再実行される文の位置を示す負のINTEGERまたは0(ゼロ)。最新の文は0、その1つ前は-1です(以降同様)。デフォルト値は0です。

original

再実行される文の一部を表すテキスト・リテラル。

replacement

文が再実行されるときにoriginalを置換するテキスト・リテラル。

specifier

次の表に示す指定子。各指定子は、再実行される文でテキスト置換が行われる場所を示します。

表10-2 REDO指定子の有効な値

指定子 意味

FIRST

originalの最初の出現箇所のみをreplacementに変更することを指定する。

LAST

originalの最後の出現箇所のみをreplacementに変更することを指定する。

n

replacementに変更するoriginalの出現箇所を示す数。たとえば、3は3番目の出現箇所を示す。

ALL

originalのすべての出現箇所をreplacementに変更することを指定する。

*

originalのすべての出現箇所をreplacementに変更することを指定する。

デフォルトはALLです。指定子を指定しなかった場合、originalのすべての出現箇所がreplacementに変更されます。

使用上の注意

引数を指定しないREDO

引数のないREDOを指定した場合は、最新の文が再実行されます。

大文字と小文字の区別

再実行される文のテキストとoriginalの比較では、REDOは大文字と小文字を区別しません。たとえば、originalとしてATを指定すると、REDOでは、文中のatAtaTATのいずれにも一致します。

originalreplacementと置換する場合、REDOではreplacementのすべての文字について大文字と小文字の違いが維持されます。たとえば、ShOwreplacementとして指定すると、再実行される文でもこれと同じです。

例10-89 レポートの再実行

次の出力は、recap 2文の結果です。

   COMMAND LOG
6: fetch w 20 down division total(actual)
7: listnames

次のREDO文は、異なる変数でFETCH文を再実行します。

REDO 6 'actual' 'budget'

REEDIT

REEDITコマンドは、セッション内で以前に入力した文を編集するコマンドです。この文は、現在のセッション中に最近入力した最大256の文のリストであるコマンド・ログから取り出されます。REEDITを使用すると、文を実行せずに変更できるので、順次編集が可能になります。

REDOコマンドは、REEDITに似ていますが、文の編集後にその文が実行されます。

注意:

REEDIT文自身はコマンド・ログに含まれませんが、REEDITによって再実行された文は含まれます。

構文

REEDIT [number|index] 'original' 'replacement' [specifier

パラメータ

number

編集される文の番号を示す正のINTEGER。文とその番号を表示するには、RECAP文を使用します。

index

コマンド・ログの末尾を基準とする、編集される文の位置を示す負のINTEGERまたは0(ゼロ)。最新の文は 0、その1つ前は-1です(以降同様)。デフォルト値は0です。

original

編集される文の一部を表すテキスト・リテラル。

replacement

文が編集されるときにoriginalを置換するテキスト・リテラル。

specifier

次の表に示す指定子。各指定子は、編集される文でテキスト置換が行われる場所を示します。

表10-3 REEDIT指定子の有効な値

指定子 意味

FIRST

originalの最初の出現箇所のみをreplacementに変更することを指定する。

LAST

originalの最後の出現箇所のみをreplacementに変更することを指定する。

n

replacementに変更するoriginalの出現箇所を示す数。たとえば、3は3番目の出現箇所を示す。

ALL

originalのすべての出現箇所をreplacementに変更することを指定する。

*

originalのすべての出現箇所をreplacementに変更することを指定する。

デフォルトはALLです。指定子を指定しなかった場合、originalのすべての出現箇所がreplacementに変更されます。

使用上の注意

number引数またはindex引数を指定しないREEDIT

numberまたはindexのないREEDITを指定した場合、最新の文が編集されます。

大文字と小文字の区別

編集される文のテキストとoriginalの比較では、REEDITは大文字と小文字を区別しません。たとえば、originalとしてATを指定すると、REEDITでは、文中のatAtaTATのいずれにも一致します。

originalreplacementと置換する場合、REEDITではreplacementのすべての文字について大文字と小文字の違いが維持されます。たとえば、ShOwreplacementとして指定すると、編集される文でもこれと同じです。

例10-90 LIMITコマンドの複数の値の編集

次の例は、REEDIT文を使用して文を複数回編集してから実行する効果を示します。REEDITコマンドを使用すると、LIMITコマンドを実行する前にその複数の値を編集できます。LIMITコマンドは、REDO文を入力すると実行されます。

次の出力は、recap 1という文の結果です。

   COMMAND LOG
6: limit mydim to 1 to 10, 15 to 20, 24 to 28, 33 to 40

次の文

REEDIT 6 '1' '2' FIRST

によって、次の出力が生成されます。

7: limit mydim to 2 to 10 , 15 to 20, 24 to 28, 33 to 40

次の文

REEDIT 7 '15' '18'

によって、次の出力が生成されます。

8: limit mydim to 2 to 10 , 18 to 20, 24 to 28, 33 to 40
 

次の文

REDO 8 '40' '41'

もう一度変更され、新しい値のLIMITコマンドが再実行されます。また、この文によって次の出力が生成されます。

9: limit mydim to 2 to 10 , 18 to 20, 24 to 28, 33 to 41

REGRESS

REGRESSコマンドは、単純な多重線形回帰を計算するコマンドです。オプションのWEIGHTBYキーワードを指定すると、一部のデータ・ポイントがその他のデータ・ポイントよりも信頼性が高い場合に加重回帰を計算できます。

その後、REGRESS.REPORTを実行すると、回帰の標準レポートを作成できます。また、INFOファンクションを使用して、独自にカスタマイズしたレポートまたはさらに詳細な分析に使用するために結果を部分的に取得することもできます。

ヒント:

より複雑な回帰分析を実行するには、予測プログラムに示す予測コンテキストを使用します。

構文

REGRESS [NOINTERCEPT] dependent independent... [WEIGHTBY weight]

パラメータ

NOINTERCEPT

回帰方程式の定数項(切片)を抑制します。デフォルトは定数項を計算します。

dependent

回帰の従属変数として使用する式。

REGRESSでは、結果の計算中に従属変数と独立変数のすべてのディメンションをループします。

independent

回帰分析の独立変数(リグレッサ)として使用する1つ以上の式。

WEIGHTBY weight

加重回帰を指定します。数式weightには、データ・ポイント(測定値)ごとの加重を指定します。信頼性のある測定値に大きな加重を付けると、品質の高い回帰結果が得られます。WEIGHTBYは、REGRESSコマンドの最後に置く必要があります。

すべての測定値のweightがゼロ未満の場合は、エラーが発生します。いずれかの測定値でweightがゼロに等しい場合、その測定値は計算から除外されます。WEIGHTBYを省略すると、加重されない回帰が計算されます。

使用上の注意

NA値の無視

REGRESSコマンドでは、その計算中、NA値である測定値が無視されます。

標準レポートの生成

回帰の標準レポートには、独立変数ごとに係数、標準誤差およびT-比率が示され、さらに、R-2乗値、F-統計量、測定値の数、回帰の予測の標準誤差も示されます。このレポートを生成するには、次のように入力します。

REGRESS.REPORT

結果の取得

独自のレポート作成またはさらに詳細な分析のためにREGRESSの結果の一部を取得する方法については、INFO文を参照してください。

例10-91 単純な回帰

次の文は、productディメンションをCanoesに制限し、回帰を使用してカヌーの販売に対する広告、価格および経費の影響を調べます。

LIMIT product TO 'Canoes'
REGRESS NOINTERCEPT sales advertising price expense

次に、例10-93に示すようにREGRESS.REPORTを実行すると、この回帰の結果を参照できます。

例10-92 加重回帰

次の文は、加重回帰を使用します。この場合、次の定義と値を持つreliabilityという名前の変数を使用して地区が加重されます。

DEFINE reliability VARIABLE DECIMAL <district>

DISTRICT       RELIABILITY
-------------- -----------
Boston                1.00
Atlanta               0.90
Chicago               1.00
Dallas                0.80
Denver                0.90
Seattle               0.60

次の文により回帰が実行されます。

REGRESS NOINTERCEPT sales advertising price expense -
WEIGHTBY reliability

次に、例10-93に示すようにREGRESS.REPORTを実行すると、この回帰の結果を参照できます。

REGRESS.REPORT

REGRESS.REPORTプログラムは、REGRESSコマンドを使用して実行した回帰の標準レポートを生成するプログラムです。

構文

REGRESS.REPORT

例10-93 単純な回帰のレポート

例10-91に示す単純な回帰を実行したとしますREGRESS.REPORTを実行すると、回帰の結果を参照できます。

                              Regression Analysis
                              ===================
 
       Dependent Variable: SALES
        WEIGHTBY Variable: NONE
 
Regressor                Coefficient      Std. Error     T-ratio
--------------------    ------------    ------------    --------
ADVERTISING                     0.36            0.16        2.24
PRICE                          -8.66            1.80       -4.82
EXPENSE                         1.05            0.01       79.69
 
      Corrected R-square                   1.00
      F-Statistic (2, 141)                   NA
      Number of observations                144
      Standard error of estimate       1,477.16

例10-94 加重回帰のレポート

例10-92に示す単純な回帰を実行したとしますREGRESS.REPORTを実行すると、回帰の結果を参照できます。

                              Regression Analysis
                              ===================
 
       Dependent Variable: SALES
        WEIGHTBY Variable: RELIABILITY
 
Regressor                Coefficient      Std. Error     T-ratio
--------------------    ------------    ------------    --------
ADVERTISING                     0.44            0.17        2.64
PRICE                          -8.03            1.92       -4.19
EXPENSE                         1.04            0.01       76.45
 
      Corrected R-square                   1.00
      F-Statistic (2, 141)                   NA
      Number of observations                144
      Standard error of estimate       1,373.15

RELATIONコマンド

RELATIONコマンドは、任意のリレーションを現行オブジェクトの指定ディメンションのデフォルト・リレーションとして指定したり、現行オブジェクトからデフォルト・リレーション情報を削除するコマンドです。デフォルトのリレーションの詳細は、式における関連ディメンションの使用方法を参照してください。

注意:

RELATIONコマンドと、ALLOCMAPやAGGMAPのRELATION文とを混同しないでください。

構文

RELATION {dimension-name relation-name }| DELETE { ALL | dimension-name}

パラメータ

dimension-name

事前定義のディメンションの名前。dimension-name引数で指定するディメンションは、デフォルトのリレーションを指定または削除する現在検討中のオブジェクトのディメンションである必要があります。

注意:

dimension-name引数で指定するディメンションは、現在検討中のオブジェクトのディメンションである必要があります。現行オブジェクトは、現行セッションで最も新しく定義したオブジェクトか検討しているオブジェクトです。オブジェクト定義を現行定義にするには、CONSIDER文を使用します。

relation-name

dimension-nameで指定されたディメンションのデフォルト・リレーションとして使用される事前定義のリレーションの名前。

DELETE

事前に指定したデフォルト・リレーション情報の削除を指定します。

ALL

事前に定義したデフォルト・リレーション情報をすべて削除します。

使用上の注意

Oracle OLAPでの複数リレーション間の選択方法

2つのディメンション間で複数のリレーションが存在し、関連ディメンションに基づいてそれらのディメンションの1つで計算を実行する場合、Oracle OLAPでは、文の実行時に使用するリレーションが次のように選択されます。

  1. 文に指定されているリレーションが使用されます(ある場合)。

  2. ディメンションのデフォルトのリレーションが使用されます。Oracle OLAPでは、デフォルトのリレーションは次のように決定されます。

    1. RELATIONコマンドを使用してデフォルトのリレーションを指定した場合、Oracle OLAPでは、そのリレーションがデフォルトのリレーションとして認識されます。

    2. RELATIONコマンドを使用してデフォルトのリレーションを指定していない場合、Oracle OLAPでは、最初に定義したリレーションがデフォルトのリレーションとして認識されます。

デフォルトのリレーションの確認

OBJファンクションをRELATIONキーワードとともに使用すると、オブジェクトのデフォルト・リレーション情報を確認できます。

同じオブジェクトに対する複数のRELATIONコマンド

最後に検討されたオブジェクトに対して処理を行う文(LD文など)とは異なり、RELATIONコマンドを新たに発行しても、事前に発行されたRELATIONコマンドは置き換えられません。かわりに、同じオブジェクトに対して複数のRELATIONコマンドが発行されることになり、累積的な効果が得られます。

例10-95 RELATIONコマンドを使用したデフォルト・リレーションの指定

次のアナリティック・ワークスペース・オブジェクトを(次の順序で)定義したとします。

DEFINE CITY DIMENSION TEXT
DEFINE DISTRICT DIMENSION TEXT
DEFINE CITY_DISTRICT RELATION DISTRICT <CITY>
DEFINE CITY_REDISTRICT_1 RELATION DISTRICT <CITY>

REPORT city_district
CITY                    CITY_DISTRICT
-------------------- --------------------
Annapolis            Southern
Bethesda             Southern
Charlotte            Southern
Gettysburg           Southern
Greensboro           Southern
Raleigh              Southern
Reston               Southern
Rochester            Southern
Virginia Beach       Southern
Washington           Capital
 
 
REPORT city_redistrict_1
CITY                  CITY_REDISTRICT_1
-------------------- --------------------
Annapolis            Capital
Bethesda             Capital
Charlotte            Southern
Gettysburg           Southern
Greensboro           Southern
Raleigh              Southern
Reston               Southern
Rochester            Southern
Virginia Beach       Capital
Washington           Capital

次のOBJ文が示すように、city_districtリレーションがcitydistrictとの間のデフォルトのリレーションです。これは、city_districtリレーションがcitydistrictとの間で定義された最初のリレーションであり、RELATION文でデフォルトのリレーションが指定されていないためです。

SHOW OBJ (RELATION ACTUAL 'city' 'district')
CITY_DISTRICT
 
SHOW OBJ (RELATION SPECIFIED 'city' 'district')
NA
 

ここで、次の文を発行し、districtをWashingtonに制限し、city_redistrict_1リレーションをデフォルトのリレーションにするとします。

 
LIMIT city TO district
CONSIDER city
RELATION city city_redistrict_1
 

次のOBJ文が示すように、ここで、RELATION文で指定したcity_redistrict_1リレーションがcitydistrictとの間のデフォルトのリレーションになります。

SHOW OBJ (RELATION ACTUAL 'city' 'district')
CITY_REDISTRICT_1
SHOW OBJ (RELATION SPECIFIED 'city' 'district')
CITY_REDISTRICT_1
 

また、次の文が示すように、cityをdistrictに制限すると、cityをcity_redistrict_1リレーションに制限したのと同じ結果が得られます。

LIMIT city TO district
 
REPORT city
CITY
--------------------
Annapolis
Bethesda
Virginia Beach
Washington
 
 
LIMIT city to ALL
LIMIT city to city_redistrict_1
 
REPORT city
CITY
--------------------
Annapolis
Bethesda
Virginia Beach
Washington

RELEASE

アナリティック・ワークスペースがマルチライタ・モードでアタッチされている場合、RELEASEコマンドは、指定の変数、リレーション、値セット、ディメンションまたは変数の1つ以上のパーティションのアクセス・モードを読取り/書込み(取得)アクセスから読取り専用アクセスに変更します。

構文

RELEASE  objects

パラメータ

objects

解放する1つ以上の変数、リレーション、値セット、ディメンションの名前またはアナリティック・ワークスペースの名前(カンマ区切り)。パーティション変数の個々のパーティションを指定するには、次の構文を使用します。

     variable_name (PARTITION partition_name [, PARTITION partition_name ]...)

各アナリティック・ワークスペース名の前にはAWを付けます(次の構文を使用)。

AW analytic workspace name

このリストから1つのアナリティック・ワークスペースを指定すると、そのアナリティック・ワークスペースのすべての取得済オブジェクトは、保留されているすべての変更が適用された後に解放されます。RELEASE文の実行前の変数、リレーション、値セットまたはディメンションに加えられたすべての変更は、RELEASE文の実行後にプライベートな変更として保存されます。

使用上の注意

未更新または未コミットのオブジェクトの解放

更新されているアナリティック・ワークスペースに対してAW DETACH文を使用するのと似ています。更新したオブジェクトに対してRELEASEを使用しても、そのトランザクションをコミットまたはロールバックするまで、他のユーザーはそのオブジェクトを取得できません。what-if変更をさらに進め、後でUPDATEを使用して取得済のすべての変数を更新する場合に、更新済のオブジェクトをコミット前に解放するのには役立ちます。

ディメンションの解放によるディメンションの回復

取得済のディメンションを解放すると、そのディメンションは自動的に回復します(ディメンションの回復の意味については、REVERTコマンドを参照)。

次のコードに示すように、取得済のディメンションを解放すると自動回復されます。

ユーザーAが次のOLAP DML文を発行します。

AW ATTACH myworkspace MULTI
ACQUIRE RESYNC time WAIT
MAINTAIN time ADD 'Y2002'
actuals (time 'Y2002', ...) = 37
REPORT time --> ..., 'Y2002'
... report
SHOW actuals (time 'Y2002', ...) --> 37
RELEASE time
REPORT time --> ... (no 'Y2002')
AW ATTACH myworkspace MULTI
... report
ACQUIRE RESYNC actuals, time WAIT
MAINTAIN time ADD 'Y2002'
actuals (time 'Y2002', ...) = 37
REPORT time --> ..., 'Y2002'
SHOW actuals (time 'Y2002', ...) --> 37
... report
REVERT time
REPORT time --> ... (no 'Y2002')
MAINTAIN time ADD 'Y2002'
... report
REPORT time --> ..., 'Y2002'
SHOW actuals (time 'Y2002', ...) --> NA
... report

例10-96 2人のユーザーによる同じアナリティック・ワークスペースの異なるオブジェクトの変更

マルチライタ・アタッチ・モードの従来の使用法では、2人のユーザーが同じアナリティック・ワークスペース内にある異なる2つのオブジェクトを変更できます。たとえば、アナリティック・ワークスペースに2つの変数actualsおよびbudgetがあるとします。ユーザーAがactualsを変更し、ユーザーBがbudgetを変更しようとします。この場合、アナリティック・ワークスペースをマルチライタ・モードでアタッチした後、各ユーザーは必要な変数を取得して必要な変更を行い、変更を更新およびコミットしてから、ワークスペースをデタッチするか、取得した変数を解放します。

ユーザーAは次の文を実行します。

AW ATTACH myworkspace MULTI
ACQUIRE actuals
... make modifications
UPDATE MULTI actuals
COMMIT
RELEASE actuals
AW DETACH myworkspace

一方で、ユーザーBは同時に次の文を実行します。

AW ATTACH myworkspace MULTI
ACQUIRE budget
... make modifications
UPDATE MULTI budget
COMMIT
RELEASE budget
AW DETACH myworkspace

例10-97 UPDATE後のCOMMIT前に使用するRELEASE

RELEASE文を使用しても、解放済の変数を必ずしも他のユーザーが取得できるとは限りません。たとえば、変数を更新したが変更をコミットしなかった場合、RELEASE文を実行してもコミットが実行されるまでは他のユーザーにとって効果はありません。ただし、単純なUPDATEを使用して取得済のすべての変数を更新すると、変数の更新後ではあるがコミットより前に変数を解放するのに役立ちます。最初の更新後に変数を解放すると、この変数は2回目の更新時には更新済変数のリストに含まれなくなります。次のコードでは、ユーザーB1が様々なタイミングでbudgetを解放する状況を示しています。

ユーザーB1が次の文を発行するとします。

AW ATTACH myworkspace MULTI
ACQUIRE RESYNC budget WAIT
make changes C1
RELEASE budget
UPDATE
make changes C2
UPDATE
COMMIT

ユーザーB2が次の文を発行します。

AW ATTACH myworkspace MULTI
ACQUIRE RESYNC budget WAIT

ユーザーB2はbudgetを取得して変更がないことを確認し、次の文を発行します。

...
AW ATTACH myworkspace MULTI
ACQUIRE RESYNC budget WAIT
make changes C1
UPDATE
RELEASE budget
make changes C2
UPDATE
COMMIT
...
AW ATTACH myworkspace MULTI
ACQUIRE RESYNC budget WAIT

あるいは、ユーザーB2はbudgetを取得して変更C1を確認し、次の文を発行します。

AW ATTACH myworkspace MULTI
ACQUIRE RESYNC budget WAIT
make changes C1
UPDATE
make changes C2
RELEASE budget
UPDATE
COMMIT
...
AW ATTACH myworkspace MULTI
ACQUIRE RESYNC budget WAIT

または、もう1つの可能性として、ユーザーB2はbudgetを取得して変更C1を確認し、次の文を発行します。

AW ATTACH myworkspace MULTI
ACQUIRE RESYNC budget WAIT
make changes C1
UPDATE
make changes C2
UPDATE
COMMIT
RELEASE budget
...
AW ATTACH myworkspace MULTI
ACQUIRE RESYNC budget WAIT

この時点で、ユーザーB2はbudgetを取得し、変更C2を確認します。

REMOVE_CUBE_MODEL

指定したモデル(キューブ・ディメンションのサブオブジェクト)のMODEL(集計内)文を、そのキューブ・ディメンションの集計マップから削除します。このプログラムの実行で行われる変更はトランザクショナルではなく、プログラムの一部としてCOMMITが自動的に実行されます。

注意:

キューブ・ディメンションまたはそのキューブ・ディメンションを含むキューブに対してマテリアライズド・ビューが存在する場合は、キューブ・ディメンションの変更に、このプログラムを使用できません。

関連項目:

キューブ対応のOLAP DML文

構文

CALL REMOVE_CUBE_MODEL(logical_cube, logical_dim, model_name, is_static_model)

パラメータ

CALL

REMOVE_CUBE_MODELは引数を持つOLAP DMLプログラムであるため、OLAP DML CALL文を使用して起動します。

logical_cube

Oracleデータ・ディクショナリで定義されたキューブの名前を示すテキスト式。

logical_dim

変更するキューブ・ディメンションのOracleデータ・ディクショナリ名を示すテキスト式。

model_name

logical_dimに関連付けられている論理モデルの名前を表すテキスト式。

is_static_model

削除するMODEL文がlogical_cubeのaggmapにあるRELATION(集計用)文の前または後ろのどちらにあるのかを指定するブール式。

デフォルト値はTRUEです。これは、削除するMODEL文がRELATION文の前にある(model_nameは静的モデルである)ことを意味します。

削除するMODEL文がRELATION文の後ろにある(model_nameが動的モデルである)場合は、FALSEを指定します。

REMOVE_DIMENSION_MEMBER

REMOVE_DIMENSION_MEMBERプログラムを実行すると、1つ以上の階層からOLAPキューブ・ディメンション・メンバーが削除されるか、またはキューブ・ディメンションからOLAPキューブ・ディメンション・メンバーが完全に削除されます。

注意:

キューブ・ディメンションまたはそのキューブ・ディメンションを含むキューブに対してマテリアライズド・ビューが存在する場合は、キューブ・ディメンションの変更に、このプログラムを使用できません。

関連項目:

キューブ対応のOLAP DML文

構文

CALL REMOVE_DIMENSION_MEMBER(member_id, logical_dim, hier_list, [ auto_compile ])

パラメータ

CALL

REMOVE_DIMENSION_MEMBERは引数を持つOLAP DMLプログラムであるため、OLAP DML CALL文を使用して起動します。

member_id

キューブ・ディメンション階層から削除するメンバーを示すテキスト式。

logical_dim

変更するキューブ・ディメンションのOracleデータ・ディクショナリ名を示すテキスト式。

hier_list

キューブ・ディメンション・メンバーの削除元となるすべての階層のOracleデータ・ディクショナリ名で構成された複数行のテキスト式。1行ごとに1つの階層を指定します。

ディメンションからメンバーを完全に削除するには、NAを指定します。

auto_compile

関連するアナリティック・ワークスペース・オブジェクト(親リレーションの変更など)を即時更新するかどうかを指定するブール式。

デフォルト値はTRUEです。この値を指定すると、アナリティック・ワークスペースの変更内容のうち、キューブ・ディメンション・メンバーの削除に必要のあるものはすべて即座に更新されます。

パフォーマンス上の理由から、FALSEはコンパイルの実行前に大量の変更を行う場合のみ指定してください。この場合、アナリティック・ワークスペース・オブジェクトの値が有効になる前に、キューブ・ディメンションを明示的にコンパイルする必要があります(キューブ・ディメンションの明示的なコンパイルを参照)。

注意:

この引数に対して指定した値に関係なく、新しいメンバーは常にディメンションから即時に削除されます。これは、コンパイル中にエラーが通知された場合でも同様です。

例10-98 階層からのOLAPキューブ・ディメンション・メンバーの削除

  1. my_timeキューブ・ディメンションの値についてレポートする次のSQL文を実行します。

    select dim_key||'  '||level_name||'  '||parent 
       from my_time_lvl_hier_view 
       order by dim_key asc;
    

    この文によって返される値は次のとおりです。

    DIM_KEY||''||LEVEL_NAME||''||PARENT
    -------------------------------------------------------------------------------
    L1_0  L1
    L1_1  L1
    L1_2  L1
    L2_1  L2  L1_1
    L2_2  L2  L1_1
    L2_3  L2  L1_2
    L3_1  L3  L2_1
    L3_2  L3  L2_1
    L3_3  L3  L2_2
    L3_4  L3  L2_2
    L3_5  L3  L2_2
    L3_6  L3  L2_3
    
    12 rows selected.
     
  2. remove_12_1 OLAP DMLプログラムという名前のユーザー作成プログラムをコールする次のSQL文を実行します。

    exec dbms_aw.execute('call my_util_aw!remove_l2_1');
    

    ユーザー作成のremove_12_1プログラムの内容を次に示します。

    注意:

    このプログラムでは次を使用します。

    • OBJORGファンクション。このファンクションを使用して、my_timeキューブ・ディメンションを物理的に実装するOLAP DMLオブジェクトを指定します。

    • OLAP DMLから提供されるREMOVE_DIMENSION_MEMBERプログラム。このプログラムを使用して、my_timeキューブ・ディメンションからL2_1およびその子孫を削除します。

    DEFINE REMOVE_L2_1 PROGRAM
    PROGRAM
     
      VARIABLE _aw_dim       text
      VARIABLE _parentrel    text
      VARIABLE _members      text
      VARIABLE _member       text
      VARIABLE _i            integer
     
      " Removes L2_1 and descendants
      _aw_dim = OBJORG(DIM 'my_time')
      _parentrel = OBJORG(PARENTREL 'my_time')
     
      LIMIT &_aw_dim TO 'L2_1'
      LIMIT &_aw_dim ADD DESCENDANTS USING &_parentrel
      _members = VALUES(&_aw_dim)
      _i = 1
      WHILE _i LE NUMLINES(_members)
      DO
        _member = EXTLINES(_members, _i, 1)
        _i = _i + 1
        CALL REMOVE_DIMENSION_MEMBER(_member, 'my_time', NA, NO)
      DOEND
     
      UPDATE
      COMMIT
    END
     
  3. 削除後のmy_timeキューブ・ディメンションの値を表示する次のSQL文(手順1で使用した文と同じ)を実行します。

    select dim_key||'  '||level_name||'  '||parent 
        from my_time_lvl_hier_view 
        order by dim_key asc;
    

    削除後の値は次のとおりです。

    DIM_KEY||''||LEVEL_NAME||''||PARENT
    --------------------------------------------------------------------------------
    L1_0  L1
    L1_1  L1
    L1_2  L1
    L2_2  L2  L1_1
    L2_3  L2  L1_2
    L3_3  L3  L2_2
    L3_4  L3  L2_2
    L3_5  L3  L2_2
    L3_6  L3  L2_3
     
    9 rows selected.

REMOVE_MODEL_DIMENSION

REMOVE_MODEL_DIMENSIONプログラムを実行すると、キューブ・ディメンションのモデルからDIMENSION(モデル内)文が削除されます。このプログラムの実行で行われる変更はトランザクショナルではなく、プログラムの一部としてCOMMITが自動的に実行されます。

関連項目:

キューブ対応のOLAP DML文

構文

CALL REMOVE_MODEL_DIMENSION(logical_dim, model_name, explicit_dim)

パラメータ

CALL

REMOVE_MODEL_DIMENSIONは引数を持つOLAP DMLプログラムであるため、OLAP DML CALL文を使用して起動します。

logical_dim

変更するキューブ・ディメンションのOracleデータ・ディクショナリ名を示すテキスト式。

model_name

logical_dimに関連付けられている論理モデルの名前を表すテキスト式。

explicit_dim

キューブ・ディメンションのモデルから削除するディメンションの識別子を示すテキスト式。

RENAME

RENAMEコマンドは、アナリティック・ワークスペース内にあるオブジェクトの名前を変更するコマンドです。

構文

RENAME oldname newname [AW workspace]

パラメータ

oldname

アナリティック・ワークスペース内にある既存のオブジェクトの名前。修飾オブジェクト名を指定して、オブジェクトが存在するアタッチされたワークスペースを指定できます。別の方法として、AWキーワードを使用してワークスペースを指定することもできます。両方を一緒には使用できません。

修飾オブジェクト名またはAWキーワードを使用してアナリティック・ワークスペースを指定しない場合、現行のワークスペース内のオブジェクトの名前が変更されます。

名前のないコンポジットの場合、その作成時に使用したのと同じ構文を使用します。名前のないコンポジットの名前付けを参照してください。

newname

新しい名前。アナリティック・ワークスペース・オブジェクトの新しい名前は、オブジェクトが存在するワークスペース内の他の名前とは重複できません。アナリティック・ワークスペース・オブジェクトのネーミングのルールに従って名前を選択します(詳細はDEFINEコマンドを参照)。名前付きコンポジットを名前のないコンポジットに変更するには、newname引数としてSPARSEキーワードを使用します。名前付きコンポジットの名前解除を参照してください。

AW workspace

オブジェクトの名前を変更するアタッチされたワークスペースの名前。修飾オブジェクト名またはAWキーワードを使用してアナリティック・ワークスペースを指定しない場合、現行のワークスペース内のオブジェクトの名前が変更されます。

使用上の注意

関連付けられたオブジェクトの更新

変数の名前を変更しても、その変数を使用するオブジェクト(計算式など)は自動的には更新されません

ディメンションの名前を変更すると、そのディメンションによってディメンション化されるすべてのオブジェクトの定義は自動的に更新されます。さらに、名前が変更されたディメンションのすべての値セットは、新しい名前に自動的に更新されます。

RENAMEとPERMIT

オブジェクトのアクセス権を変更する権限がPERMIT文によって拒否されている場合、そのオブジェクトの名前は変更できません。オブジェクトの名前を変更しても、オブジェクトに関連付けられている権限には影響しません。

名前のないコンポジットの名前付け

RENAME文を使用すると、名前のないコンポジットに名前を付けることができます。次の例は、marketおよびproductによってディメンション化される名前のないコンポジットに対して名前m.prodを割り当てます。

RENAME SPARSE <market product> m.prod

名前付きコンポジットの名前解除

名前付きコンポジットにプロパティおよびアクセス権制限がない場合、および名前付きコンポジットによってディメンション化されるオブジェクトが1つ以上存在する場合、そのコンポジットを名前のないコンポジットに変更できます。また、名前付きコンポジットと同じ順序のディメンションを持つ名前のないコンポジットは存在できず、名前付きコンポジットは、名前のないコンポジットのディメンション・リストでは使用できません。名前付きコンポジットを名前のないコンポジットに変更するには、newname引数としてSPARSEキーワードを使用します。次の例は、名前付きコンポジットm.prodを名前のないコンポジットに変更します。

RENAME m.prod SPARSE

コンポジットの名前変更の制限

コンポジットが名前のないコンポジットのベース・ディメンションである場合、またはコンポジットのベース・ディメンションのいずれかが名前のないコンポジットである場合、そのコンポジットの名前は変更できません。

例10-99 プログラムの名前変更

次の文は、プログラムtestreportの名前をsales.reportに変更します。

RENAME testreport sales.report 

REPORT

REPORTコマンドは、1つ以上のデータ式のレポートを書式付きで生成するコマンドです。REPORTは、式のディメンションに対して自動的にループ処理します。結果は現行の出力ファイルに送信されます。

構文

REPORT [NOHEAD] [GRANDTOTALS] [[SUBTOTALS] {GROUP group-dimension}...] -       [[SUBTOTALS] [attributes] DOWN down-dimension] -      [[ROWTOTALS] { ACROSS across-dimension [limit-clause]: }... ] -      [SUBTOTALS] [attributesexpression(s)

パラメータ

expression引数のみを指定した場合、REPORTは、デフォルトのレイアウトに説明するレイアウトを使用してレポートを生成します。GROUP、DOWNまたはACROSS句に式のディメンションのいくつか(すべてではない)を指定すると、指定されないディメンションを持つデフォルトのレイアウトに可能なかぎり近いレイアウトになります。

NOHEAD

レポートに初期空白行およびヘッダーが含まれないことを指定します。NOHEADは、attributes引数で指定したすべてのHEADING引数より優先され、REPORTコマンドが通常自動的に生成するすべてのヘッダーを非表示にします。

GRANDTOTALS

数値列ごとの総計をレポートの末尾に挿入します。

SUBTOTALS

数値列の小計を挿入します。小計の各行の上にはダッシュの列が挿入されます。式またはDOWN句に対してSUBTOTALSを指定すると、GROUPディメンション(またはコンポジット)ごとの小計が得られます。GROUP句に対してSUBTOTALSを指定すると、指定したディメンションおよび変化の遅いGROUPディメンションの小計が得られます。グループの小計はグループの最後のスライスの下部に表示されます。

GROUP

group-dimensionの値ごとに、データの個別group、つまり2次元スライスを生成します。GROUP句を複数回使用すると、複数のGROUPディメンション(またはコンポジット)を指定できます。この場合、GROUPディメンションの値の組合せごとに異なるスライスが生成されます。

group-dimension

グループ・ラベルとして使用する値の取得元のディメンションまたはコンポジットの名前。または、グループ・ラベルとして使用する実際の値である1つ以上のTEXT式。

  • group-dimensionにコンポジットまたは結合ディメンションの名前を指定すると、各ベース・ディメンションに別々のグループが作成されます。

  • group-dimensionTEXT式を指定する場合、その式は、目的のGROUPディメンションのみによってディメンション化される必要があり、式の各値は、関連ディメンション値に対応する説明テキストにする必要があります。

GROUP句に指定したディメンションは、それらがループ処理するデータに関連する必要はありません。デフォルトのレイアウトを参照してください。

DOWN

行のラベル、つまり、レポートの左側に、その他の値をラベル付けする1つ以上の列が含まれるように指定します。使用できるDOWN句は1つのみです。

down-dimension

行のラベルとして使用する値の取得元のディメンションまたはコンポジットの名前。または、行のラベルとして使用する実際の値である1つ以上のTEXT式。

  • down-dimensionに非結合ディメンションの名前を指定すると、行のラベルとして1列のみ生成されます。

  • down-dimensionにコンポジットまたは結合ディメンションの名前を指定すると、各ベース・ディメンションに別々の列が作成されます。

  • down-dimensionTEXT式を指定する場合、その式は、目的のDOWNディメンションのみによってディメンション化される必要があり、式の各値は、関連ディメンション値に対応する説明テキストにする必要があります。

DOWN句に指定したディメンションは、それらがループ処理するデータに関連する必要はありません。追加ディメンションの指定を参照してください。

ROWTOTALS

「TOTAL」のヘッダーの列を、数値行ごとの合計とともにレポートの右側に挿入します。レポートに行の合計を挿入するのは、列の小計または総計を挿入するのと異なります。

ACROSS

列ヘッダーの行をレポート上部にdimensionの値ごとに生成します。各ヘッダーの下には、指定したデータ式のためのデータの列がREPORTによって生成されます。レポートには、複数のACROSS句(またはコンポジット)を入れることができます。

across-dimension

列ヘッダーとして使用する値の取得元のディメンションまたはコンポジットの名前。または、列ヘッダーとして使用する実際の値である1つ以上のTEXT式。

  • across-dimensionにコンポジットまたは結合ディメンションの名前を指定すると、各ベース・ディメンションに別々のヘッダー列が作成されます。

  • across-dimensionにTEXT式を指定する場合、その式は、目的のacross-dimensionのみによってディメンション化される必要があり、式の各値は、関連ディメンション値に対応する説明テキストにする必要があります。DAY、WEEK、MONTH、QUARTERまたはYEAR型のディメンションに対する書式設定済ラベルの指定の詳細は、DAY、WEEK、MONTH、QUARTERおよびYEARのディメンション値の書式設定を参照してください。

ACROSS句に指定したディメンションは、それらがループ処理するデータに関連する必要はありません。追加ディメンションの指定を参照してください。

limit-clause

REPORT文の実行時のディメンションの一時的なステータス。ACROSS句にディメンションを指定する場合に使用します。(ACROSS句にコンポジットを指定する場合、limit-clause引数を含めることはできません。)

limit-clauseの構文は、各種LIMITコマンドにおけるlimit-clause引数の構文(つまり、LIMITコマンドの「TO」などのlimit-type引数の後の構文)と同じです。これらの引数の構文については、LIMITコマンド(値を使用)LIMITコマンド(LEVELRELを使用)LIMIT(親リレーションを使用)LIMITコマンド(関連ディメンションを使用)LIMITコマンド(NOCONVERTを使用)およびLIMITコマンド(POSLISTを使用)を参照してください。

指定した制限による結果としてディメンションが空のステータスになると、OKNULLSTATUSオプションの設定に関係なくエラーが発生します。ただし、IFNONE label句を指定すると、エラーは表示されずにプログラムの実行は指定のラベルに分岐するため、ここでエラーに対処できます。

attributes

データの書式設定の方法を指定する表10-4に示す1つ以上の書式属性。DAY、WEEK、MONTH、QUARTERまたはYEAR型のディメンションに対する書式設定済ラベルの指定の詳細は、DAY、WEEK、MONTH、QUARTERおよびYEARのディメンション値の書式設定を参照してください。

ヒント:

変数の定義に属する書式設定プロパティが変数に存在する場合、OBJファンクションを使用してこのプロパティの値を取得し、これをREPORT文の属性の値として使用できます。

属性を指定しなかった場合、データ値の書式設定には、デフォルトのレイアウトに説明するデフォルトの書式が使用されます。この場合、Oracle OLAPでは、列の幅、小数点以下の桁数、数値の3桁区切りにカンマを使用するかどうかなどが自動的に決定されます。

表10-4 レポートのデータ値の書式属性

属性 意味

HEADING 'text'

デフォルトの列ヘッダーのかわりに使用するテキストを指定。HEADING属性を使用する場合、指定するヘッダーの位置は、レポート内でこの属性の適用が必要な式の数に応じて変わる。つまり、指定のヘッダーは、デフォルトのヘッダーを置き換える場合とそうでない場合がある。また、HEADING属性を使用して列幅より広い列タイトルを指定すると、タイトルのテキストは、その列の幅の範囲内で折り返される。

WIDTH n

(省略形はW)列の幅を空白n個分にする。最大幅は4,000文字。幅が0(ゼロ)の列は表示されない。(Width属性のデフォルト値も参照。)

TRUNCATE

(省略形はTRUNC)文字値が列に収まらない場合、文字値を列幅に合せて切り捨てる。

NOTRUNCATE

(省略形はNOTRUNC)文字値が列に収まらない場合、追加の行を生成。(デフォルト)。

CENTER

(省略形はC)列内で値を中央揃え。

LEFT

(省略形はL)列内で値を左揃え。(テキスト・データのデフォルト。)

RIGHT

(省略形はR)列内で値を右揃え。(数値データおよびブール・データのデフォルト。)

SPACE n

(省略形はSP)指定した数の空白を列の前に挿入。

(デフォルトで、最初の列の前には0個の空白が挿入され、残りの列の前には1個の空白が挿入される。)

FILL 'char'

列の未使用の位置にcharを置く。(デフォルトの埋込み文字は空白。)

COMMA

カンマ、またはTHOUSANDSCHARオプションに現在記録されている文字で、3桁および6桁を区切る。COMMASオプションの設定に優先。

NOCOMMA

3桁および6桁を文字で区切らない。COMMASオプションの設定に優先。

PAREN

カッコを使用して負の数を表す。PARENSオプションの設定に優先。

NOPAREN

マイナス符号を使用して負の数を表す。PARENSオプションの設定に優先。

DECIMAL n

(省略形はD)小数桁をn桁表示。小数桁は、DECIMALCHARオプションに現在記録されている文字で区切られる。DECIMALSオプションの値に優先。

注意: REPORTでは、合計の式に対してDECIMAL属性を指定しないかぎり、整数データの行合計や列合計での小数点以下の桁は非表示になる。また、DECIMAL属性を0に設定し、NOLEADINGZEROキーワードを使用すると、0に丸められる-1から1までの小数値は表示されない。

MDECIMAL n

M表記法で書式化された値の小数点以下の桁をn桁まで表示。nの値は0から16または255。

NODECIMAL

DECIMALSオプションの設定で指示された小数桁の桁数を表示。(デフォルト)。

EDECIMAL n

E表記法で書式化された値の小数点以下の桁をn桁まで表示。nの値は0から16または255。

ENOTATION

指数表記法またはE表記法とも呼ばれる科学表記法を使用(値の後にEを、指数の前に符号を付加。たとえば、.230E+2.230E-2など)。

NOENOTATION

E表記法を使用しない。かわりに、条件付きのM表記法を使用。

CENOTATION

値が列の中に収まるために必要な場合、条件付きでE表記法を使用。

MNOTATION

常にM表記法を使用(百万で除算した値にMを付加)。

NOMNOTATION

M表記法を使用しない。かわりに、サイズの大きすぎる値にはアスタリスクを使用。

CMNOTATION

値が列の中に収まるために必要な場合、条件付きでM表記法を使用。(デフォルト)。

FOLDDOWN

複数行の文字値の場合、最初の行を他の値と並べて表示し、それ以外の行をその下に配置。また、先行または後続の空白を削除。(デフォルト)。

FOLDUP

複数行の文字値の場合、最後の行のみを他の値と並べて表示し、それ以外の行は上部に配置。また、先行または後続の空白を削除。

INDENT n

列内で、値を空白n個分インデント。デフォルトは0です。

LEADINGZERO

-1から1までの小数部の前にゼロを付加。

NOLEADINGZERO

-1から1までの小数部の前のゼロを非表示にする。

CNLEADINGZERO

有効桁を切り捨てない場合、-1から1までの小数部の前にゼロを付加。(デフォルト)。

LSET 'text'

textを値の左側に追加。NA値を含む式とともにLSETを使用すると、LSETで指定したテキストは、NA値の左側に挿入されない

NOLSET

値の左側に何も追加しない。(デフォルト)。

RSET 'text'

textを値の右側に追加。NA値を含む式とともにRSETを使用すると、RSETで指定したテキストは、NA値の右側に挿入されない。

NORSET

値の右側に何も追加しない。(デフォルト)。

NASPELL 'text'

NA値のかわりにtextを使用。NASPELLオプションの設定に優先。

NONASPELL

NASPELLオプションに指定した内容でNA値を表示。(デフォルト)。

YESSPELL 'text'

TRUEブール値としてtextを使用。デフォルト値はYESSPELLオプションで記録。

NOSPELL 'text'

FALSEブール値としてtextを使用。NOSPELLオプションの設定に優先。

ZSPELL 'text'

ゼロの数値のかわりにtextを使用。ZSPELLオプションの設定に優先。

NOZSPELL

ZSPELLオプションで指定した内容でゼロ数値を表示。(デフォルト)。

OVER textexp

文字式(textexp)の値を持つ値に上線を引く。textexpがリテラル値の場合は、一重引用符で囲まなければならない。有効なリテラル値は、値または列に上線を引く'-'、値または列に二重上線を引く'='、値または列に上線を引かないことを指定する''

条件が一致した場合にのみ上線を引くには、textexpに次の文を使用する。

IF boolean-expression THEN '-' ELSE ''

UNDER textexp

文字式(textexp)の値を持つ値に下線を引く。textexpがリテラル値の場合は、一重引用符で囲まなければならない。有効なリテラル値は、値または列に下線を引く'-'、値または列に二重下線を引く'='、値または列に下線を引かないことを指定する''

条件を満たした場合にのみ下線を引くには、textexpに次の文を使用する。IF boolean-expression THEN '-' ELSE ''

VALONLY

UNDERおよびOVER属性とともに使用し、値に対してのみ下線または上線を引く。

NOVALONLY

UNDERおよびOVER属性とともに使用し、列の幅全体に下線または上線を引く。(デフォルト)。

expression . . .

レポートに表示されるデータ。データの表示は、そのデータ型と指定した属性に依存します。

注意:

REPORTコマンドにはNTEXT値を処理する機能はありません。レポートのどの部分にもこれを使用しないでください。

複数の式を指定できます。それらの式が同じディメンションを持つ必要はありません。

  • REPORT文に複数のデータ式がある場合、それぞれの前に異なる書式を指定できます。属性を2つ以上のデータ式に適用する場合、式を山カッコ(< >)で囲みます。

    attributes <expression1expression2>

  • カッコの外側の属性が、カッコの内側のすべての式に適用されます。ただし、カッコ内にある1つの式にのみ対してその直前に属性を指定すれば、グループに適用される属性と矛盾する属性の場合でも、その式のみに別の属性を指定することもできます。

    attributes0 <attributes1 expression1expression2>

    この場合、attributes0expression1expression2の両方に適用されますが、attributes1expression1にのみ適用されます。

ヒント:

現在までの合計を作成するには、RUNTOTALファンクションを使用します。

使用上の注意

レポートのオプション

OLAP DMLを使用して作成されるレポートには、複数のオプションによる効果が適用されます。これらのオプションは、レポートのオプションに記載されています。

デフォルトのレイアウト

どのレイアウト句(GROUP、DOWNまたはACROSS)も指定しない場合、REPORTではコンパクトな書式で出力されます(通常は、一方のディメンションがサイドを上下に沿い、他方のディメンションが上部を左右に沿う、スプレッドシートに似た2次元のデータ・レポートです)。データのディメンションを追加した場合は、一連のスプレッドシートのように、スライス、つまり異なる2次元のセグメントが形成されます。デフォルトでは、次のルールが適用されてレイアウトが決まります。

  • 式の中で最も変化の速いディメンション(その式の定義のうちで先頭に置かれているディメンション)は横方向に表示され、次に変化するディメンションは縦方向に表示されます。それ以降に変化するディメンションはGROUPスライスになります。

  • 2つ以上の式のリストにおけるディメンションの順序は、コンポーネント式の定義に記述されているディメンションの単純な組合せです。元の順序が可能なかぎり保持されますが、同じディメンションが繰り返し記述されている場合は削除されるというルールに従います。たとえば、変数priceがディメンション<month product>を持ち、変数industry.salesがディメンション<quarter product region>を持つ場合、priceindustry.salesの組合せのディメンションは<month product quarter region>です。

コンポジットによってディメンション化される変数についてデータのレポートを作成すると、REPORTは、変数の定義に使用されているコンポジットのベース・ディメンション別に、データを自動的に取り出します。ベース・ディメンション値の特定の組合せがコンポジットに存在しない場合、レポートには、これに対応するデータ・セルに対してNAが表示されます。例10-104を参照してください。

Width属性のデフォルト値

ACROSS句でWIDTH属性を指定しない場合、デフォルトの幅はCOLWIDTHオプションの値となります(デフォルトは10)。

DOWN句でWIDTH属性を指定しない場合、またはDOWN句で単純なディメンションを指定した場合、デフォルトの幅はLCOLWIDTHオプションの値となります(デフォルトは14)。

結合ディメンションまたはコンポジットを指定するDOWN句でWIDTH属性を指定しない場合、デフォルトのラベル幅はCOLWIDTHオプションの幅となり、各ベース・ディメンションに別個の列が生成されます。KEYファンクションを使用すると、ベース・ディメンション列ごとに異なる幅を設定できます。KEYファンクションによって、ベース・ディメンションごとにラベル列を生成し、列ごとに異なるWIDTH属性を使用できます。たとえば、ベース・ディメンションproductおよびdistrictを持つproddistという名前のコンポジットがあるとします。この場合、次のような文を使用できます。

REPORT DOWN < W 8 KEY(proddist, product) -
   W 12 KEY(proddist, district) > . . .

デフォルトの行幅である80文字(LSIZEオプションで指定)およびデフォルトの列幅設定(14文字のラベル列が1つ)を使用すると、出力の1行にはラベル列と6つのデータ列が収まります。

レポートのすべての列を合せた幅は、4,000文字を超えることはできません。

数値が大きすぎてデータ列に収まらない場合、数値は百万の位に四捨五入され、セルの右側に記号Mが付きます。この処理をしても値が大きすぎる場合、値は1列のアスタリスクに置き換えられます。

DAY、WEEK、MONTH、QUARTERおよびYEARのディメンション値の書式設定

DAY、WEEK、MONTH、QUARTERまたはYEAR型のディメンションをACROSS、DOWNまたはGROUP句のdimensionとして使用した場合、CONVERTファンクションを使用してディメンションのVNF(またはデフォルトのVNF)を変更し、ディメンション値の名前に独自の書式を適用できます。VNFを変更するには、ACROSS、DOWNまたはGROUPキーワードに対して、dimension引数のかわりにvnf引数を指定してCONVERTファンクションを使用します。たとえば、unitsデータのレポートでは、次の文を使用してmonthディメンションのラベルを書式設定できます。

REPORT HEADING 'Month' DOWN -
   CONVERT(month TEXT '<mtextl> <yyyy>') units

追加ディメンションの指定

REPORTコマンドは、表示される式がどのディメンションによってディメンション化されるかにかかわらず、レポートのレイアウトで指定したすべてのディメンションを使用します。式が指定された1つ以上のディメンションによってディメンション化されない場合、その式の値は追加のディメンションの値ごとに繰り返されます。比較の際に効果があることがあります。例10-103を参照してください。

例10-100 デフォルトのレポートの作成

この例は、1996年の最初の3か月間の製品価格を参照する方法を示します。デフォルトのレイアウトを変更することなく、最も簡単な形式のREPORTを使用します。

LIMIT month TO 'Jan96' TO 'Mar96'
REPORT price

これらの文によって生成される出力は次のとおりです。

                --------------PRICE-------------
                --------------MONTH-------------
PRODUCT           Jan96       Feb96      Mar96
--------------- ---------- ---------- ----------
Tents               165.50     165.75     165.13
Canoes              200.25     200.09     200.05
Racquets             55.02      55.03      55.00
Sportswear           50.03      50.02      50.00
Footwear             38.01      38.01      38.01

例10-101 列合計の追加

この例は、1996年前半における3つの地区の売上数量を表示し、レポートの横方向にdistrictを示し、列ごとに小計を示します。(デフォルトでは、レポートの横方向には月が並べられますが、これは、monthunitsの最も変化の速いディメンションであるためです。)レポートをよりコンパクトにするため、狭い列幅として8文字を指定します。

LIMIT month TO 'Jan96' TO 'Jun96'
LIMIT district TO 'Boston' 'Chicago' 'Dallas'
REPORT SUBTOTALS W 8 DOWN month -
   ACROSS district: W 8 units

これらの文によって生成される出力は次のとおりです。

PRODUCT: TENTS
         ----------UNITS-----------
         ---------DISTRICT---------
MONTH    Boston   Chicago  Dallas
-------- -------- -------- --------
Jan96         307      189      308
Feb96         209      190      324
Mar96         277      257      436
Apr96         372      318      560
May96         525      433      744
Jun96         576      466      838
-------- -------- -------- --------
TOTAL       2,266    1,853    3,210
   ...

REPORTでは、製品ごとに同様なスライスを生成できます。

例10-102 2つの変数の比較

この例は、スポーツウェア販売実績と販売計画予測とを比較し、ドル単位の整数値のみで示します。1996年5月および6月の実績と予測値を横に並べてレポートし、すべての地区の販売実績と販売予測の総計を表示します。

LIMIT product TO 'Sportswear'
LIMIT month TO 'May96' 'Jun96'
LIMIT district TO ALL
REPORT GRANDTOTALS W 12 DOWN district ACROSS month: -
   DECIMAL 0 <sales sales.plan>

これらの文によって生成される出力は次のとおりです。

PRODUCT: SPORTSWEAR
             -------------------MONTH-------------------
             --------May96-------- --------Jun96--------
DISTRICT       SALES    SALES.PLAN   SALES    SALES.PLAN
------------ ---------- ---------- ---------- ----------
Boston           72,617     69,623     79,630     73,569
Atlanta         161,537    148,823    177,967    157,939
Chicago         101,873     94,545    112,793     97,427
Dallas          170,939    165,449    175,066    164,192
Denver           89,971     91,880     97,237     94,729
Seattle          57,713     55,905     60,323     56,808
             ---------- ---------- ---------- ----------
                654,651    626,224    703,017    644,664
             ========== ========== ========== ==========

例10-103 価格データの繰返し

この例は、3つの地区にわたる販売実績を比較し、各地区で綿密な比較ができるように販売数量の横にそれぞれ単価を表示します。REPORT文では、2つの式(salesおよびprice)を指定します。salesには3つのディメンション(monthproductおよびdistrict)があるため、レポートにはこれら3つのディメンションを表示します。ただし、pricedistrictによってディメンション化されません。したがって、レポートはdistrictごとにpriceの値を繰り返します。1995年1月のレポートを表示します。

LIMIT district TO FIRST 3
LIMIT product TO ALL
LIMIT month TO 'Jan95'
REPORT GROUP month W 10 DOWN product ACROSS district: -
   <W 9 sales W 6 price>

これらの文によって生成される出力は次のとおりです。

MONTH: Jan95
           -------------------DISTRICT------------------------
           -----Boston-----  ----Atlanta----- -----Chicago----
PRODUCT      SALES    PRICE   SALES    PRICE   SALES    PRICE 
---------- --------- ------  --------- ------ --------- ------
Tents      32,153.52 160.77  40,674.20 160.77 29,098.94 160.77
Canoes     66,013.92 190.24  49,462.88 190.24 45,277.56 190.24
Racquets   52,420.86  52.84  54,798.82  52.84 54,270.39  52.84
Sportswear 53,194.70  48.54 114,446.26  48.54 72,123.47  48.54
Footwear   91,406.82  36.10 100,540.28  36.10 90,287.70  36.10

例10-104 コンポジットによってディメンション化されたデータのレポート

この例では、d.salesは、ディメンション・リストにディメンションmonthおよび名前のないコンポジットSPARSE <product district>が含まれる変数です。名前のないコンポジットには、BostonChicago の各地区、およびTentsRacquetsFootwearの各製品に対するベース・ディメンションの組合せについて値が存在しません。REPORTコマンドのデフォルトの形式を使用してd.salesデータのレポートを生成すると、month別および名前のないコンポジットのベース・ディメンション(productおよびdistrict)別にレポートが出力されます。コンポジットに存在しないベース・ディメンション値の組合せの場合、レポートではこれに対応するデータ・セルにNAが表示されます。

LIMIT month TO 'Jan96' TO 'Mar96'
LIMIT district TO 'Boston' 'Chicago'
REPORT d.sales

これらの文によって生成される出力は次のとおりです。

DISTRICT: Boston
               ------------D.SALES-------------
               -------------MONTH--------------
PRODUCT          Jan96      Feb96      Mar96
-------------- ---------- ---------- ----------
Tents                  NA         NA         NA
Canoes             70,489     82,238     97,622
Racquets               NA         NA         NA
Sportswear         57,079     63,122     67,006
Footwear               NA         NA         NA
 
DISTRICT: Chicago
               ------------D.SALES-------------
               -------------MONTH--------------
PRODUCT          Jan96      Feb96      Mar96
-------------- ---------- ---------- ----------
Tents                  NA         NA         NA
Canoes             48,662     54,425     68,816
Racquets               NA         NA         NA
Sportswear         77,490     85,879     85,308
Footwear               NA         NA         NA

GROUP、DOWNまたはACROSS句にコンポジットを指定すると、REPORTのデフォルトの書式を無効にし、d.salesデータをそのコンポジット別に取り出すことができます。この場合、レポートの内容はコンポジットに値が格納されているデータ・セルのみになります。

REPORT DOWN SPARSE <product district> d.sales

この文によって生成されるレポートは、次のとおりです。

                      ------------D.SALES-------------
                      -------------MONTH--------------
 PRODUCT    DISTRICT    Jan96      Feb96      Mar96
---------- ---------- ---------- ---------- ----------
Canoes     Boston         70,489     82,238     97,622
Sportswear Boston         57,079     63,122     67,006
Canoes     Chicago        48,662     54,425     68,816
Sportswear Chicago        77,490     85,879     85,308

RESYNC

アナリティック・ワークスペースがマルチライタ・モードでアタッチされている場合、RESYNCコマンドは、指定された読取り専用オブジェクトのプライベートな変更を削除し、表示可能な最新の世代のデータを取得します。

RESYNCは読取り専用オブジェクトを再同期化します。取得済オブジェクトの再同期化を行うには、ACQUIREを使用します。

構文

RESYNC objects

パラメータ

objects

再同期化する1つ以上の変数、リレーション、値セットまたはディメンションの名前のリスト(カンマ区切り)。このリスト内の取得済オブジェクトはすべて無視されます。

objectsには値としてName を指定し、他のユーザーが定義した最新のオブジェクトを再同期化することを指定します。

使用上の注意

オブジェクトの論理的関係の保持

RESYNCを使用する場合、異なるオブジェクト間の論理的関係に留意し、一部のオブジェクトのみを新しい世代にプロモートしたために、データの論理的一貫性が失われないようにしてください。

コンポジット・ディメンションを共有するオブジェクトの再同期化

コンポジット・ディメンションを共有するオブジェクトは別々に再同期化できます。ただし、これらの再同期化されていないオブジェクトはすべて、変更されていないか取得済である必要があります。

例10-105 オブジェクトの再同期化

この例では、ユーザーAが定期的にactualsを更新し、ユーザーRは定期的にデータの最新ビューをチェックする必要があります。それぞれ次のOLAP DML文を実行します。

ユーザーAは次のOLAP DML文を実行します。

AW ATTACH myworkspace MULTI
ACQUIRE actuals
...make modifications
UPDATE MULTI actuals
COMMIT
...make modification
UPDATE MULTI actuals
COMMIT

同時に、ユーザーRも次のOLAP DML文を実行します。

AW ATTACH myworkspace MULTI
...
RESYNC actuals
...
RESYNC actuals
...
RESYNC actuals
...

RETURN

OLAP DMLプログラムのRETURNコマンドは、最後の行より前でプログラムの実行を終了します。オプションとして、プログラムがファンクションとしてコールされた場合に返す値を指定できます。この値は、プログラムを定義したときに指定したのと同じデータ型またはディメンションである必要があります。

構文

RETURN [expression]

パラメータ

expression

コールされたプログラムの終了時にコール側プログラムに返される式。

使用上の注意

戻り値のディメンション性

プログラムによる戻り値は、ディメンションを持たない単一の値です。ただし、ユーザー定義ファンクションをコールする文のコンテキスト内では、ファンクションの式はその引数のディメンションを持ちます。この場合、ファンクションの式に含まれるディメンション値の組合せごとにプログラムがコールされます。

戻り値のデータ型

プログラムを定義するときにデータ型を指定すると、戻り値はそのデータ型になります。プログラムを定義するときにディメンションを指定すると、戻り値はそのディメンションの単一の値になります。RETURN文の式が、宣言されているデータ型またはディメンションと一致しない場合、Oracle OLAPは宣言されているデータ型に式を変換します。

プログラムの定義でデータ型またはディメンションを指定しない場合、戻り値はワークシート・データとして処理され、すべての戻り値がOracle OLAPによってコール側のコンテキストで必要とされるデータ型に変換されるため、予期しない結果になる場合があります。

ディメンションの位置

プログラムがディメンションの値を返す場合、そのディメンションはプログラムと同じアナリティック・ワークスペースで宣言されている必要があります。そのプログラムは、LISTBYプログラムの出力に含まれ、ディメンションに対するOBJ(ISBY)は、TRUEになります。

戻り値なし

ファンクションとして起動したプログラムが戻り値を返さない場合、コール側プログラムへの戻り値はNAになります。

例10-106 プログラムの早期終了

この例では、newfiguresという名前の変数が現行のアナリティック・ワークスペースに存在する場合にのみレポートを生成するレポート・プログラムを必要とするとします。このプログラムでは、IF文を使用してnewfiguresの存在を確認し、存在しない場合はRETURNで実行を停止します。

DEFINE sales.report PROGRAM
PROGRAM
IF NOT EXISTS('newfigures')
   THEN DO
          SHOW 'The new data is not yet available.'
          RETURN
        DOEND
PUSH month
TRAP ON cleanup
LIMIT month TO LAST 3
REPORT ACROSS month: newfigures
 
cleanup:
POP month
END

newfiguresがアナリティック・ワークスペースに存在しない場合にこのプログラムを実行すると、プログラムはメッセージを生成し、RETURN文でプログラムの実行をその時点で終了します。

例10-107 戻り値

次のプログラムは、actual変数から来年の予算額を取得します。これは一時的な計算です。このプログラムをREPORT文でコールすると、予算額が計算およびレポートされますが、アナリティック・ワークスペースには保存されません。

DEFINE budget.growth PROGRAM DECIMAL
PROGRAM
VARIABLE growth DECIMAL
VARIABLE factor DECIMAL
growth = TOTAL(actual(year 'Yr97') year) - TOTAL(actual(year -
   'Yr96') year)
factor = ( 1 + growth ) / TOTAL(actual(year 'Yr96') year)
RETURN TOTAL(actual(year 'Yr97') year) * (factor * factor/2)
END

REVERT

REVERTコマンドは、指定したオブジェクトについて、最後に更新、再同期化(RESYNC文を使用)、またはACQUIREのRESYNC句で取得されてから行われたすべての変更、あるいはアナリティック・ワークスペースがアタッチされてから行われたすべての変更を削除するコマンドです。

構文

REVERT objects

パラメータ

objects

マルチライタ・モードでアタッチされているアナリティック・ワークスペースの取得された変数、値セット、リレーションまたはディメンションの名前のリスト(カンマ区切り)。または、読取り専用モードでアタッチされているアナリティック・ワークスペースの変数、値セット、リレーションまたはディメンションのリスト。

使用上の注意

ディメンション値の追加後のディメンションの回復

ディメンション値を追加してからディメンションを元に戻すと、そのディメンションによってディメンション化された変数の領域割当てが最適ではなくなる場合があるためお薦めしません。

例10-108 REVERTによる変更の取消し

budgetという名前の変数がmyworkspaceという名前のアナリティック・ワークスペースにあるとします。また、複数のステップでbudgetを変更する必要があり、すべてのステップが完了するまでアナリティック・ワークスペースのデータは更新しません。各ステップで複数のモデルを実行し、必要な結果が得られるモデルを見つけます。このタスクを実行するには、次の手順を実行します。

  1. アナリティック・ワークスペースをマルチライタ・モードでアタッチします。

  2. budgetを取得します。

  3. 各ステップで次の手順を実行します。

    1. 適切なモデルを実行し、必要なモデルが見つかるまで実行ごとに操作を元に戻して繰り返します。

    2. budgetを更新します。

  4. budgetをコミットして解放します。

次のコードによってこれらのタスクが実行されます。

AW ATTACH myworkspace MULTI
ACQUIRE RESYNC budget
...try model 1a --> not acceptable
REVERT budget
...try model 1b --> ok. Done with Step 1
UPDATE MULTI budget
...try model 2a --> not acceptable
REVERT budget
...try model 2b --> not acceptable
REVERT budget
...try model 2c --> ok. Done with Step 2
UPDATE MULTI budget
...try model 3a --> ok. Done with Step 3. Done with all steps.
UPDATE MULTI budget
COMMIT
RELEASE budget
AW DETACH myworkspace

ROWコマンド

ROWコマンドは、単一の行のセルに一連のデータを連続して生成するコマンドです。一連のROWコマンドは、対応するセルをそれぞれ生成し、これによりデータの列が作成されます。このため、通常、ROWコマンドは一連の列を生成するコマンドと言えます。ROWコマンドによる出力は、現行の出力ファイルに送信されます。

一般にROWコマンドは、レポート書込み文としてまとめて考えることができる他のコマンド、ファンクションおよびオプションとともに使用されます。

ROWコマンドは、生成するデータおよびデータの出力書式(オプション)を指定する一連の列説明で構成されます。

さらに、ROWには行および列の計算を実行するための幅広い機能があります。計算を実行して計算結果を出力に含めることができます。あらゆる種類の計算式を列説明で使用でき、行および列の合計ファンクションを利用できます(表10-6を参照)。

ROWは、主にレポート・プログラムで使用してレポートの行を生成します。レポートにおける行の最大幅は4,000文字です。

ヒント:

ROWコマンドの小計機能を必要としないことが前もって明らかな場合、ROWコマンドのかわりにHEADING文を使用してレポートの行を生成すると、この場合、Oracle OLAPは小計を管理しないので時間を節約できます。

関連項目:

ROWファンクション

構文

ROW [attributes] [ACROSS dimension [limit-clause]:] {exp1|SKIP } -      [[attributes] [ACROSS dimension [limit-clause]:] {expn|SKIP }]

パラメータ

引数を持たないROWは、空白行を生成します。

attributes

列に関する1つ以上の属性。属性とは、列内でデータ値を書式化する方法を決定する書式指定です。列書式の記述に使用できる属性の数に制限はありません。(使用できる属性の説明については、SKIPパラメータを参照。)一部の書式属性のデフォルトは、Oracle OLAPオプションの現在の設定に依存しています(これらのオプションのリストについては、表10-7を参照)。

ACROSS

ACROSS句では、式の1つのディメンション(またはコンポジット)をループし、ディメンション化された式の複数の値を単一行に挿入します。通常のROWは、現在の制限内で最初のディメンション値に対応する値を表示するのみです。ACROSS句を使用すると、ROWは現在ステータスにある各ディメンション値について1つのデータ列を生成します。

複数のデータ式に同じACROSS句を適用することも、異なるデータ式ごとに別のACROSS句を適用することもできます。複数式および個別のACROSS句を参照してください。

dimension

文をループさせるディメンションまたはコンポジットの名前。

コンポジットでディメンション化された変数のデータを表示するときにACROSS句を含めない場合、ROWはコンポジットのベース・ディメンション値に対応するすべてのデータ・セルの出力を表示します。ベース・ディメンション値の特定の組合せがコンポジットに存在しない場合、ROWは、対応するデータ・セルにNAを表示します。同様に、ACROSS句で1つのコンポジットのベース・ディメンションを指定すると、コンポジットに値が存在しないデータ・セルにNAを表示します。ただし、ACROSS句でコンポジットを指定すると、ROWはコンポジットにベース・ディメンション値の組合せが存在するデータ・セルにのみ出力を表示しますが、この場合、データをより的確に反映する簡潔なレポートが生成されます。

ACROSS句で指定されたディメンションがNULLステータスである場合、ROWはそのACROSS句に対してデータ列を生成しません。

limit-clause

ACROSS句でディメンションを指定する場合は、この句を使用すると、ROW文を実行している間、そのディメンションのステータスを一時的に変更できます。

limit-clauseの構文は、各種LIMITコマンドにおけるlimit-clause引数の構文(つまり、LIMITコマンドの「TO」などのlimit-type引数の後の構文)と同じです。これらの引数の構文については、LIMITコマンド(値を使用)LIMITコマンド(LEVELRELを使用)LIMIT(親リレーションを使用)LIMITコマンド(関連ディメンションを使用)LIMITコマンド(NOCONVERTを使用)およびLIMITコマンド(POSLISTを使用)を参照してください。

次の例は、月の現行のステータスに関係なく、一時的に月を最新の6つの値に制限します。

      ACROSS month LAST 6: units

指定する制限によってディメンションのステータスが空になる場合は、エラーが発生します。ただし、IFNONE label句が含まれている場合、エラーが表示されずにプログラムの実行は指定されたラベルに分岐するため、ここでエラーを処理できます。

注意:

ACROSS句でコンポジットを指定する場合、limit-clause引数を含めることはできません。ROW文を実行する前に、LIMITコマンドでコンポジットのベース・ディメンションを目的の値に制限する必要があります。

SKIP

式のかわりに使用され、その列を空白のままにすることを示します。

表10-5 ROWの列属性

属性 意味

WIDTH n

(W n)

列の幅を空白n個分にする。最初の列のデフォルトの幅は、LCOLWIDTHオプションの値。他の列は、COLWIDTHオプションの値。最大幅は4,000文字。幅が0の列は表示されない。

SPACE n

(SP n)

n個の空白を列の前に挿入。最初の列のデフォルト値は0、他の列は1

INDENT n

列内で、値を空白n個分インデント。デフォルトは0です。

LEFT

(L)

列内で値を左揃え。(TEXTデータのデフォルト)

RIGHT

(R)

列内で値を右揃え。(数値データおよびブール・データのデフォルト)

CENTER

(C)

列内で値を中央揃え。

LSET 'text'

textを値の左側に追加。NA値を含む式で使用した場合、指定したテキストがNA値の左側に追加されることはない。

NOLSET

値の左側に何も追加しない。

RSET 'text'

textを値の右側に追加。NA値を含む式で使用した場合、指定したテキストがNA値の右側に追加されることはない

NORSET

値の右側に何も追加しない。

FILL 'char'

列の未使用の位置にcharを置く。デフォルトの埋込み文字は空白。

DECIMAL n

(D n)

小数桁をn桁表示。小数桁は、DECIMALCHARオプションに現在指定されている文字で区切られる。小数桁の数のデフォルト値は、DECIMALSオプションで制御される。

NODECIMAL

DECIMALSオプションで指示された小数桁の桁数を表示。

COMMA

カンマ、またはTHOUSANDSCHARオプションに現在記録されている文字で、3桁および6桁を区切る。デフォルト値はCOMMASオプションで制御される。

NOCOMMA

3桁および6桁を文字で区切らない。

PAREN

カッコを使用して負の数を表す。デフォルト値はPARENSオプションで制御される。

NOPAREN

マイナス符号を使用して負の数を表す。デフォルト値はPARENSオプションで制御される。

LEADINGZERO

-1から1までの小数部の前にゼロを付加。

NOLEADINGZERO

-1から1までの小数部の前のゼロを非表示にする。DECIMAL属性を0に設定し、NOLEADINGZEROキーワードを使用した場合、0に丸められる-1から1までの小数値は表示されない

CNLEADINGZERO

有効桁を切り捨てない場合、-1から1までの小数部の前にゼロを付加。

MNOTATION

常にM表記法を使用(百万で除算した値にMを付加)。

CMNOTATION

値が列の中に収まるために必要な場合、条件付きでM表記法を使用。

NOMNOTATION

M表記法を使用しない(サイズの大きすぎる値にはアスタリスクを使用)。

MDECIMAL n

M表記法で書式化された値の小数点以下の桁をn桁まで表示。nの値は0から16または255。

ENOTATION

指数表記法またはE表記法とも呼ばれる科学表記法を使用(値の後にEを、指数の前に符号を付加。たとえば、.230E+2.230E-2など)。

CENOTATION

値が列の中に収まるために必要な場合、条件付きでE表記法を使用。

NOENOTATION

E表記法を使用しない(デフォルトの設定は条件付きのM表記法)。

EDECIMAL n

E表記法で書式化された値の小数点以下の桁をn桁まで表示。nの値は0から16または255。

NASPELL 'text'

NA値のかわりにtextを使用。デフォルト値はNASPELLオプションで制御される。

NONASPELL

NASPELLオプションに指定した内容でNA値を表示。

ZSPELL 'text'

ゼロの数値のかわりにtextを使用。デフォルト値はZSPELLオプションで制御される。

NOZSPELL

ZSPELLオプションで指定した内容でゼロ値を表示。

YESSPELL 'text'

TRUEブール値として使用するテキスト。デフォルト値はYESSPELLオプションで記録。

NOSPELL 'text'

FALSEブール値として使用するテキスト。デフォルト値はNOSPELLオプションで記録。

TRUNCATE

(TRUNC)

文字値が列に収まらない場合、文字値を列幅に合せて切り捨てる。

NOTRUNCATE

(NOTRUNC)

文字値が列に収まらない場合、追加の行を生成。

FOLDUP

複数行の文字値の場合、最後の行のみを他の値と並べて表示し、それ以外の行は上部に配置。また、先行または後続の空白を削除。

FOLDDOWN

複数行の文字値の場合、最初の行を他の値と並べて表示し、それ以外の行をその下に配置。また、先行または後続の空白を削除。

VALONLY

値に対してのみ下線または上線を引く。(UNDERおよびOVERと組み合せて使用。)

NOVALONLY

列の幅全体に下線または上線を引く。(UNDERおよびOVERと組み合せて使用。)

UNDER textexp

文字式(textexp)の値を持つ値に下線を引く。textexpがリテラル値の場合は、一重引用符で囲まなければならない。有効なリテラル値は、値または列に下線を引く'-'、値または列に二重下線を引く'='、値または列に下線を引かないことを指定する''

条件が一致した場合にのみ下線を引くには、textexpに次の文を使用する。

IF boolean-expression THEN '-' ELSE ''

OVER textexp

文字式(textexp)の値を持つ値に上線を引く。textexpがリテラル値の場合は、一重引用符で囲まなければならない。有効なリテラル値は、値または列に上線を引く'-'、値または列に二重上線を引く'='、値または列に上線を引かないことを指定する''

条件が一致した場合にのみ上線を引くには、textexpに次の文を使用する。

IF boolean-expression THEN '-' ELSE ''

次の表に示すファンクションを使用すると、すでにレポートに生成されている値に対して計算を実行できます。

表10-6 行と列の計算

ファンクション データ型 戻り値

COLVAL(n)

DECIMAL

現行の行のn番目の列の値。n > 0の場合、絶対的な列番号(左マージンから右に向かって)。n < 0の場合、相対的な列番号(現行の列から左に)。

 

RUNTOTAL(n)

ここで

n = 1,2, ...32

DECIMAL

nについて、SUBTOTALまたはZEROTOTALが最後に実行されてから現行の列で生成されたすべての数字の合計。nの合計を0にリセットしない。

SUBTOTAL(n)

ここで

n = 1,2, ...32

DECIMAL

nについて、SUBTOTALまたはZEROTOTALが最後に実行されてから現行の列で生成されたすべての数字の合計。nの合計を0にリセット。

 

次の表に示すオプションは、ROWコマンドのデフォルトの書式に影響を与えます。

表10-7 レポート関連のオプション

オプション 意味

COLWIDTH

WIDTH属性を使用しない場合の最初の列以外の列幅。デフォルト値は10です。

COMMAS

COMMA属性およびNOCOMMA属性を使用しない場合に3桁区切り文字を使用するかどうかを指定します。デフォルトはYES(区切り文字を使用)です。

DECIMALS

DECIMAL属性を使用しない場合の小数点以下の桁数。デフォルト値は2です。

LCOLWIDTH

WIDTH属性を使用しない場合の最初の列の列幅。デフォルト値は14です。

LSIZE

STDHDRプログラムが標準ヘッダーを中央揃えする行サイズを定義します。デフォルトは80文字です。

NASPELL

NASPELL属性を使用しない場合にNA値に使用するテキスト。デフォルト・テキストはNAです。

NLS_LANGUAGE

TRUEおよびFALSEのブール値に使用するテキストを指定します。これらの値は、YESSPELLおよびNOSPELLオプションに反映されます。

NLS_TERRITORY

小数点および3桁を区切る文字を指定します。これらの値は、DECIMALCHARおよびTHOUSANDSCHARオプションに反映されます。

PARENS

PAREN属性およびNOPAREN属性を使用しない場合に、負の数にカッコを使用します。デフォルトはNO(カッコを使用せず、マイナス符号を使用)です。

ZEROROW

すべての数値がゼロの行の生成または非表示を制御します。デフォルトはNO(ゼロの行を生成)です。

ZSPELL

ZSPELL属性を使用しない場合にゼロ値に使用するテキスト。デフォルトのテキストはOFFで、ゼロ(0)を表示します。

次の表に示す文をROWコマンドとともに使用します。

表10-8 ROWコマンドと互換性のあるOLAP DML文

コマンド 機能

BLANK n

n行の空白行を生成します。デフォルトは1行です。

HEADING column-

description(s)

レポートのタイトルおよび列ヘッダーを生成します。ヘッダーの数値は列合計に加算されません。

PAGE

PAGINGの設定がYESの場合、出力に改ページを挿入します。

ZEROTOTAL

すべての列について、32の合計をすべて0にリセットします。

ZEROTOTAL ALL col(s)

指定した列について、または列引数がない場合はすべての列について、32の合計をすべて0にリセットします。

ZEROTOTAL n col(s)

指定した列について、または列引数がない場合はすべての列について、指定された合計(n)を0にリセットします。

使用上の注意

レポート書込みのコマンド

ROWコマンドと関連付けられているオプションおよびコマンドは、まとめてレポート書込み文と呼ばれます表10-6は、レポートで行と列の計算に使用できるファンクションを示します。表10-7は、ROW出力のデフォルトの書式を決定するレポート関連のオプションを示します。表10-8は、レポートを作成する際、ROWと組み合せて使用する追加文を示します。PAGINGオプションと関連付けられているページング関連のオプションを使用して、ページ向け書式のレポート・プログラムを作成できます。

コンポジットと結合ディメンションのラベル

ディメンション・リストにコンポジットまたは結合ディメンションを持つデータのレポートを生成する場合、KEYファンクションを使用してベース・ディメンションごとにラベル列を生成できます。また、ラベル列ごとに別のWIDTH属性を指定できます。たとえば、ベース・ディメンションproductおよびdistrictによるコンポジットであるproddistの場合、次のような文を使用できます。

FOR proddist
   ROW W 12 KEY(proddist district) W 8 KEY(proddist product) ...

複数式

同じ書式属性またはACROSS句を複数のデータ式に適用する場合は、それらの式を山カッコ(< >)で囲み、共通の属性またはACROSS句をそのカッコで囲んだ式の直前に置きます。

attributes <expression1expression2, ...> 

または

ACROSS dimension: <expression1expression2, ...>

山カッコ内の1つの式にのみ適用する属性がある場合は、その式の直前に適用する属性を置きます。

attributes1 <expression1attributes2 expression2>

山カッコ内の属性(ある列に固有)がカッコ外の属性(複数の列に共通)と矛盾する場合、固有の属性が共通の属性よりも優先されます。

左右のカッコの数が同じである場合、カッコは任意の深さまでネストできます。

個別のACROSS句

ACROSS句で生成するデータの場合、ある式のすべての列を作成してから、別のACROSS句を使用して追加する式にそのすべての列を作成できます。

ACROSS dimexpression1, ACROSS dimexpression2

また、ACROSS句をネストして、式の2つ以上のディメンションのデータ列を行全体に表示できます。

ACROSS dim1: ACROSS dim2expression

行と列の計算

行と列の計算に使用できるファンクションのリストは、表10-6を参照してください。これらのファンクションを使用して、レポートの生成済の値に計算を実行できます。Oracle OLAPでは、列ごとに32の現在までの合計を保持するため、レポートには最大で32レベルの小計を含めることができます。ただし、数値が大きすぎるためにデータ・セルに収まらない場合、ROWはセルの右側に記号Mを付けて最も近い百万の単位にその数値を丸めます。それでも値が大きすぎる場合、値はアスタリスクに置き換えられます。

例10-109 データ値のラベリング

この例では、ROWは、salesの値とそれを特定するdistrictmonthおよびproductの対応するディメンション値を含む出力行を生成します。

ROW W 8 district month product sales

この文によって生成される出力は、次のとおりです。

Boston        Jan95      Tents  32,153.52

例10-110 2つの変数のレポート

このROW文で生成される出力行には、districtの現行のディメンション値、その後ろに1996年の最初の2か月に関するスポーツウェアのsalesおよびsales.planの値が表示されます。

LIMIT month TO 'Jan96' 'Feb96'
LIMIT product TO 'Sportswear'
ROW W 8 district ACROSS month: <sales sales.plan>

この文によって生成される出力は、次のとおりです。

Boston    57,079.10  61,434.20  63,121.50  64,006.91

例10-111 出力の書式設定とラベリング

このROW文では、1996年のテントについて実際の売上高および予定売上高を表示します。monthのステータスをこのROW文についてのみ制限するため、ACROSS句に値Jun96を含めます。値はドル単位の整数値として書式化し、さらに、その値にはドル記号、および実績値か予測値かを区別するラベルをそれぞれ付けます。

LIMIT product TO 'Tents'
ROW WIDTH 15 name.product ACROSS month 'Jun96': -
   DECIMAL 0 LSET '$' W 18 -
   <RSET ' (actual)' sales -
   RSET ' (plan)' sales.plan>

この文によって生成される出力は、次のとおりです。

3-Person Tents    $95,121 (actual)     $80,138 (plan)

例10-112 コンポジットでディメンション化された変数に関するレポート

この例で、D.SALESはディメンション・リストにディメンションmonthおよび名前のないコンポジットSPARSE <product district>を含む変数です。ROW文のACROSS句でコンポジットを指定することにより、コンポジットに値が含まれるデータ・セルのみを含むレポートを作成できます。

LIMIT product TO ALL
LIMIT district TO 'Atlanta'
LIMIT month TO 'Jan96'
ROW ACROSS SPARSE <product district>: d.sales

SET

SETコマンド(代入文または=コマンドともいう)は、1つ以上の値を変数、オプション、リレーションまたはディメンション・サロゲートに代入するコマンドです。オブジェクトに1つ以上のディメンションがある場合、SETコマンドはターゲット・オブジェクトの各ディメンションについてステータスにある値をループ処理し、ターゲット・オブジェクトの対応するセルにデータ値を代入します。

ターゲット・オブジェクトがディメンション・リストのコンポジットで定義されている場合、非NA値が代入されるターゲット・セルが欠落していると、Oracle OLAPはそれを自動的に作成します。このステップでは、その新しいセルに対応するすべてのディメンション値の組合せもコンポジットに追加されます。したがって、ターゲット・オブジェクトおよびコンポジットは、代入後にサイズが大きくなることがあります。ターゲットにすでに存在しているセルにのみ値を代入する場合は、ACROSSキーワードを使用します。

注意:

SETとともにUNRAVELを使用すると、式のディメンションが変数のディメンションと異なる場合に、その式の値を変数のセルに代入できます。

構文

[SET] target-name [=] expression [ACROSS composite]

パラメータ

SET

SETはオプションです。この機能の古いコマンド形式であり、互換性を維持するために対応しています。

target-name

データを代入して格納するターゲット・オブジェクトの名前。ターゲット・オブジェクトにすることができるアナリティック・ワークスペース・オブジェクトのリストは、表10-9を参照してください。

=

=(代入または等号)演算子は、1つ以上の値を変数、オプションまたはリレーションに代入します。代入演算子も参照してください。

expression

ターゲット・オブジェクトに代入するデータ値のソース。表10-9を参照してください。

ACROSS composite

コンポジットでディメンション化された変数にデータを代入する場合、デフォルトの動作はオブジェクトの各ベース・ディメンションのステータスにあるすべての値をループ処理します。Oracle OLAPは、非NA値が代入されるターゲット・セルが欠落している場合、それを自動的に作成し、必要なディメンション値の組合せをコンポジットに追加します。

コンポジットで定義されている変数の既存のセルにのみ値を代入する場合は、ACROSSキーワードを使用しますが、このキーワードは、コンポジットの一部であるターゲットのディメンションに対して=がループを実行する方法を変更します。=は、そのディメンションのステータスにある値の可能なすべての組合せをループするのではなく、コンポジットにすでに存在するステータスにある値の組合せのみをループします。

ACROSSキーワードは、コンポジットを指定するために使用します。ただし、コンポジットではなく、コンポジットのベース・ディメンションを指定する場合は、代入文によってコンポジットに多数の値が追加されることがあるので注意してください。

使用上の注意

代入文実行時におけるプログラム実行のトリガー

TRIGGERコマンドを使用すると、SET文を、OLAP DMLプログラムを自動的に実行するイベントにすることができます。詳細は、トリガー・プログラムを参照してください。

ディメンション性とパフォーマンス

ターゲットに複数のディメンションがある場合、=文は、デフォルトのステータスで反映される論理的な順序に関係なく、追加された順序でディメンション値をループします。多次元の場合、複合ディメンションに対してループされます。定義にリストされている最初のディメンションが最も速く変化します。ターゲットを式の値に設定する場合、ソースの式がターゲットと同じディメンションで同じ順序であると、Oracle OLAPのパフォーマンスはさらに向上します。

式中の異なるディメンションの変数

代入文に異なるディメンションのオブジェクトが複数含まれる場合、計算が複雑になります。複雑な代入文の処理を次にまとめます。A = Bという文においてAは式Bに設定されるオブジェクトですが、Oracle OLAPは最初にAのディメンションを判別します。次にそのディメンションのステータスを判別します。ディメンションのステータスにあるディメンション値の組合せごとに、次のように処理されます。

  1. Oracle OLAPは、設定するAの単一の値(セルともいう)を決定します。

  2. 式Bの各構成要素(変数、計算式、ファンクション、修飾データ参照またはリテラル)について、Oracle OLAPは設定するAのセルに対応する単一の値を決定します。式の構成要素がディメンション化されていない場合またはリテラルである場合、Oracle OLAPは単純にその値を使用します。式の構成要素がAとは異なるディメンションを持つ場合、Oracle OLAPはそのディメンションのステータスにある最初の値を使用します。

  3. Oracle OLAPは、手順2で取得された単一の値に対して指定された計算を実行し、手順1で選択したAのセルにその結果を格納します。

代入文でのオブジェクトの使用

次の表は、代入文で使用できるオブジェクトと、それらがターゲット式またはソース式として使用可能かどうかを示しています。

表10-9 代入文でのオブジェクトの使用

オブジェクト ターゲット ソース

コンポジット

なし

あり

ディメンション

モデルでのみ可

あり

計算式

あり

あり

ファンクション(ファンクションとしてのOLAP DMLプログラムを含む)

なし

あり

リレーション

あり

あり

サロゲート

あり

あり

値セット

なし

あり

変数

あり

あり

ワークシート

あり

あり

変数への値の代入

=(SET)文を使用して単一セル式の値を単一セルに代入すると、単一の値が格納されます。ただし、=文を使用して1つ以上のディメンションを持つターゲット変数に単一セル式の値を代入すると、ターゲット変数の各ディメンションのステータスにある値に対して代入がループ処理され、その変数の対応するセルにデータ値が代入されます。

複数行の値を固定幅のテキスト変数に代入する場合、変数は最初の行にのみ設定されます。複数行の値を固定幅のテキスト変数に代入するには、JOINCHARSファンクションを使用して複数行の値を1行の長さに変更します。たとえば、非固定幅のテキスト変数textvarがあるとします。次の文

SHOW textvar

次の出力が生成され、textvarの値の各行が改行して表示されます。

This is a variable
that has a multiline
text value.

この値を60バイトの固定幅のfixedtextという変数に代入して値を表示するには、次の文を使用します。

fixedtext = JOINCHARS(textvar)
SHOW fixedtext

次の出力が生成され、textvarの値が1行で表示されます。

This is a variable that has a multiline text value.

textvar変数の値の実際のバイト数がfixedtext変数の幅を超過する場合、textvarの値はfixedtextに格納されるときに切り捨てられます。

リレーションへの値の代入

例10-114に示すように、SET文を使用してリレーションに値を代入できます代入文を実行すると、ターゲット・リレーションの各ディメンションのステータスにある値に対してループ処理され、ターゲット・リレーションの対応するセルにデータ値が代入されます。

次のいずれかを代入して、テキスト・ディメンションを含むリレーションに値を代入できます。

  • ディメンションのテキスト値

  • ディメンションのデフォルトのステータス・リストに含まれるディメンション値の位置を示すINTEGER

ディメンションへの値の代入

モデル方程式での計算の結果が数値である場合にのみ、ディメンションの値の代入に=文を使用できます。この場合、=演算子を使用してその結果をディメンション値に代入できます。ただし、モデルの方程式(つまり、式)は、他のコンテキストで使用される式とはいくつかの点で異なります。モデル内での代入文の使用方法については、モデルでの方程式のルールを参照してください。それ以外のケースでのディメンションへの値の追加方法については、MAINTAINコマンドを参照してください。

ディメンション・サロゲートへの値の代入

ディメンション・サロゲートへの値の代入では、=(SET)文を使用します。たとえば、次の文はディメンション・サロゲートstorenameを定義しますが、これはNUMBER型のディメンションstore_idTEXT型のサロゲートであり、storenameの4番目の位置に値を代入し、store_idの4番目の値、つまり100のサロゲートの値をレポートします。

DEFINE storename SURROGATE store_id TEXT
storename(storename 4) = 'Molly\'s Emporium'
REPORT W 25 storename(store_id 100)
 
STORENAME(STORE_ID 100)
-------------------------
Molly's Emporium

たとえば、5つの値を持つNUMBERディメンションnumdimにINTEGERディメンション・サロゲートintsurrを定義すると、intsurrのレポートは次のようになります。

INTSURR
-------
      1
      2
      3
      4
      5

ディメンションと同様に、ディメンション・サロゲートの値は一意である必要があります。ただし、ディメンションと異なり、ディメンション・サロゲートはINTEGER型でないかぎり、NA値を持つことができます。ディメンションの値とサロゲートのいずれかの値が同じでもかまいません。

代入文のターゲットでのQDRの使用

=(SET)文のターゲットでQDRを使用できます。これによって、変数またはリレーションの特定のセルに値を代入できます。

次の例は、修飾データ参照で指定されているsales変数のデータ・セルに値10200を代入します。salesという名前の変数の値がBostonTentsおよびJan99に関連付けられたセルに存在しない場合、このセルに値が代入され、変数に追加されます。セルに値が存在する場合、値10200によってその値が上書きされます。

sales(market 'Boston' product 'Tents' month 'Jan99')= 1020

結合ディメンションでディメンション化された式

式が結合ディメンションでディメンション化されている場合、Oracle OLAPはそのディメンションのベース・ディメンション値に対する関係を使用してデータを正しいセルに代入します。結合ディメンションでディメンション化されている変数の値は、ベース・ディメンションのいずれかでディメンション化されている式に代入できます。その逆も当てはまります。例 10-117を参照してください。

モデルでの方程式のルール

モデルの方程式は、OLAP DML代入文を使用して変数またはディメンション値に値を代入します。モデルの方程式は、Oracle OLAPの他のコンテキストで使用される方程式といくつかの点で異なります。

  • モデル方程式では、通常に変数の名前を使用するかぎり、どこででもディメンション値の名前を使用できます。ディメンション値に基づいた計算を実行でき、計算の結果をディメンション値に代入できます。1つ以上のディメンション値を直接参照する方程式は、ディメンションベースの方程式と呼ばれます。

  • モデル方程式では、アンパサンド置換を使用できません。

  • ファンクションとして使用する場合にのみ、プログラムを構成要素として計算に含めることができます。

  • 1つのディメンションベースの方程式内では、すべてのディメンション値が同じディメンションに属している必要があります。

  • 計算の結果をディメンション値に代入する場合、その結果は数値である必要があります。

  • モデル方程式が基準にする各ディメンションは、DIMENSION文にリストされている必要があります。モデルにINCLUDE文が含まれている場合は、インクルードされるモデルから適切なDIMENSION文が継承される必要があります。モデルにINCLUDE文が含まれていない場合は、適切なDIMENSION文が含まれている必要があります。モデルをコンパイルまたは実行すると、Oracle OLAPは明示的にリストされているディメンションまたはDIMENSION文で継承されたディメンションを検索し、各ディメンション値が属するディメンションを特定します。

ディメンション・ステータスおよびモデル方程式

ディメンション値にデータを割り当てる代入文がモデルに含まれている場合、ディメンションは一時的にその値に制限され、計算を実行してディメンションの初期ステータスをリストアします。

結合ディメンション値の書式化

ディメンションベースの方程式が結合ディメンションの値を参照する場合、特別な書式が必要です。

  • ディメンション値の指定全体を山カッコで囲み、さらに一重引用符で全体を囲みます。各値を個別に一重引用符で囲まないでください。

  • ベース・ディメンション値には、大文字と小文字を正しく使用します。

  • ディメンション値の指定に空白が埋め込まれたテキスト値が含まれる場合、それらのディメンション値をカンマで区切る必要があります。

たとえば、item.orgがベース・ディメンションitemおよびorgを持つ結合ディメンションであるとします。この場合、次の書式を使用してitem.orgの値を参照します。

'<Expenses, Direct Sales>'

テキスト・ディメンション値の書式化

ディメンションベースの方程式が、空白が埋め込まれた、または大文字と小文字が混在したテキスト・ディメンション値を参照する場合、そのディメンション値は一重引用符で囲みます。ディメンション値には、大文字と小文字を正しく使用します。

たとえば、lineitemという名前のテキスト・ディメンションに、空白が埋め込まれている値があるとします。この場合、次の書式を使用します。

'Software Revenue'

モデル方程式のDAY、WEEK、MONTH、QUARTER、YEAR値の指定

モデル方程式がDAY、WEEK、MONTH、QUARTER、YEAR型のディメンションに基づいている場合、日付書式ではなくディメンションのVNF(値名書式)を使用して、ディメンションの値を指定する必要があります。また、VNFはディメンション値を次のように書式化する必要があります。

  • 値は文字で始まります。

  • 値は、文字、数字、アンダースコア、ピリオドのみで構成します。

DAY、WEEK、MONTH、QUARTER、YEAR型のディメンションにVNFが割り当てられていない場合、そのディメンションのデフォルトのVNFを使用できます。VNFコマンドに関する説明に、各ディメンション型のデフォルトのVNFのリスト、およびVNFをディメンションに割り当てる方法が示されています。

DAYディメンションのデフォルトのVNFは、各ディメンション値の最初の文字に数字が指定されているため受け入れられません。DAYディメンションの場合は、ディメンション名を指定してその値をカッコと一重引用符で囲みます。

たとえば、daydimという名前のDAYディメンションの場合、次の書式を使用できます。

daydim('01jul97')

INTEGERディメンション値の書式設定

ディメンションベースの方程式がINTEGERディメンションの値を参照する場合、そのディメンション値は一重引用符で囲みます。

たとえば、intdimという名前のINTEGERディメンションの場合、次の書式を使用して最初のディメンション値を参照します。

'1'

モデルが複数のディメンションに基づいている場合、モデル・コンパイラはリテラルなINTEGER値が属するディメンションを正しく特定できない場合があります。この場合、ディメンションの名前を指定し、あいまいなディメンション値の書式設定で説明するように値をカッコおよび一重引用符で囲みます。

あいまいなディメンション値の書式設定

モデル・コンパイラは、ディメンション値が属するディメンションを正しく特定できない場合があります。たとえば、次のような場合に生じます。

  • 2つ以上のディメンションが同じ名前のディメンション値を持つ場合

  • DAYディメンションがデフォルトのVNF(数字で始まる)を使用している場合

  • INTEGER値がディメンション内の位置、またはディメンションのリテラルなINTEGER値として解釈できる場合。

このような場合、次のルールに従うことでモデルベースの方程式の不明瞭性を回避できます。

  • ディメンション値を一重引用符で囲みます。

  • 引用符付きの値をカッコで囲みます。

  • カッコの前にディメンションの名前を付けます。

たとえば、intdimという名前のINTEGERディメンションの場合、次の書式を使用して最初のディメンション値を参照します。

intdim('1')

例10-113 変数への値の代入

最初の例では、2つの変数unitsおよびpriceを定義し、どちらもproductでディメンション化されているとします。次の例は、productディメンションの各値について、売上金額(units*price)を計算します。代入文を使用して、結果を変数salesに格納しますが、この変数も、productでディメンション化されています。

sales = units*price

次の例では、choicedesc変数がchoiceでディメンション化されているとします。変数にデータを入力する前、変数のセルにはNA値のみが含まれています。

CHOICE           CHOICEDESC
-------------- --------------------
Report         NA
Graph          NA
Analyze        NA
Data           NA
Quit           NA

次の文を使用してchoicedesc変数を初期化します。

choicedesc =  JOINCHARS ('Description for ' choice)

これにより、変数のすべてのchoicedescセルに適切な値が含まれます。

CHOICE             CHOICEDESC
-------------- -------------------------
Report         Description for Report
Graph          Description for Graph
Analyze        Description for Analyze
Data           Description for Data
Quit           Description for Quit

次の例は、timeproductおよびdistrictで式をディメンション化し、この式を新しい変数に割り当てます。この式は、2001年の売上数量に基づいて2002年の売上計画を計算します。

DEFINE units.plan INTEGER <month product district>
LIMIT month TO 'DEC02'
units.plan = LAG(units 12 month) * 1.15

例10-114 リレーションへの値の代入

アナリティック・ワークスペースには、次に示すように、geogという名前の地理の階層ディメンションに関する定義、および地理階層の親子関係を表す値を含むgeog_parentrelという名前のリレーションに関する定義が含まれているとします。

DEFINE geog DIMENSION TEXT
DEFINE geog_parentrel RELATION geog <geog>
 

階層ディメンションは、次のMAINTAIN ADD文を使用して移入できます。

" Populate the geog dimension with values for all levels
MAINTAIN geog ADD 'North America' 'Europe' 'United States' 'Canada' 'France' 'Germany'
MAINTAIN geog ADD 'Massachusetts' 'California' 'Quebec' 'Ontario' 
MAINTAIN geog ADD 'Boston''Springfield' 'San Francisco''Los Angeles' 'Toronto' 'Ottawa' 
MAINTAIN geog ADD 'Montreal''Quebec City' 'Paris' 'Marseilles' 'Bonn' 'Berlin'
 

次の代入文を使用してgeog_parentrelを移入します。geog_parentrelに値を代入する前に、geogを適切な値に制限する必要があります。

"  Limit geog (and therefore geog_parentrel) to countries and assign 
"   parent value (continent name) to those countries in geog_parentrel
LIMIT geog to 'United States' 'Canada'
geog_parentrel = 'North America'
LIMIT geog to ALL
LIMIT geog to 'France' 'Germany'
geog_parentrel = 'Europe'
 
"  Limit geog (and therefore geog_parentrel) to states or provinces and assign 
"   parent value (country name) to those states or provinces in geog_parentrel
LIMIT geog to ALL
LIMIT geog to 'Massachusetts' 'California'
geog_parentrel = 'United States'
LIMIT geog to ALL
LIMIT geog to 'Quebec' 'Ontario'
geog_OLAP DML Commands: A-G = 'Canada'
 
"  Limit geog (and therefore geog_parentrel) to cities and assign
"   parent value (state, province, or country) to those cities in geog_parentrel
LIMIT geog to ALL
LIMIT geog to 'Boston' 'Springfield' 
geog_parentrel = 'Massachusetts'
LIMIT geog to ALL
LIMIT geog to 'San Francisco' 'Los Angeles' 
geog_parentrel = 'California'
LIMIT geog to ALL
LIMIT geog to 'Montreal' 'Quebec City'
geog_parentrel = 'Quebec'
LIMIT geog to ALL
LIMIT geog to 'Toronto' 'Ottawa' 
geog_parentrel = 'Ontario'
LIMIT geog to ALL
LIMIT geog to 'Paris' 'Marseilles' 
geog_parentrel = 'France'
LIMIT geog to ALL
LIMIT geog to 'Bonn' 'Berlin'
geog_parentrel = 'Germany'
LIMIT geog to ALL
 

geog_parentrelのレポートには、代入された値が表示されます。

COLWIDTH = 20
REPORT geog_parentrel
REPORT geog_parentrel
 
GEOG                GEOG_PARENTREL
---------------- --------------------
North America    NA
Europe           NA
United States    North America
Canada           North America
France           Europe
Germany          Europe
Massachusetts    United States
California       United States
Quebec           Canada
Ontario          Canada
Boston           Massachusetts
Springfield      Massachusetts
San Francisco    California
Los Angeles      California
Toronto          Ontario
Ottawa           Ontario
Montreal         Quebec
Quebec City      Quebec
Paris            France
Marseilles       France
Bonn             Germany
Berlin           Germany

例10-115 修飾データ参照の使用

この例は、代入文を修飾データ参照とともに使用して変数budgetに値を代入します。予算明細項目(Net.Income)に代入する値は、2つの他の明細項目(Opr.IncomeおよびTaxes)の差として計算されるため、正しいデータ値を取得するには、修飾データ参照を使用する必要があります。

budget(line Net.Income)= budget(line Opr.Income) - budget(line Taxes)

例10-116 コンポジットを含む変数への値の代入

salesのデータを、sparse_salesの既存のデータ・セル、つまり関連付けられているディメンション値がステータスにあるセルにのみ代入するには、次の文を使用します。

sparse_sales = sales ACROSS SPARSE<product market>

ソース式が単一の値である場合、ACROSSキーワードが特に有効です。sparse_salesのディメンションに制限がない場合、次のような代入文では、ソース式がNAになることはないため、ディメンション値のすべての組合せについてセルが作成されます。

sparse_sales = 0

これは、コンポジットを含む変数をディメンション化する目的に反します。

これに対し、次の文ではsparse_salesの既存のセルにのみ0(ゼロ)が設定されます。

sparse_sales = 0 ACROSS SPARSE<product market>

例10-117 データの緻密化

地区ごとに、一部の製品のみが販売されているとします。現在、地区と製品の特定の組合せにはデータがあるが、それ以外はNA値である変数salesがあります。コンポジットまたは結合ディメンションを定義し、それを新しい変数のディメンションとして使用すると、salesデータに関して稠密な配列を作成できます。新しい変数にデータを直接代入するには、代入文を使用します。コンポジットまたは結合ディメンションの値にすべての組合せとデータが含まれる場合、元の変数を削除してアナリティック・ワークスペースの領域を節約できます。

DEFINE proddist DIMENSION <product district>
MAINTAIN proddist ADD <'Tents' 'Boston'> <'Canoes' 'Seattle'> -
   <'Sportswear' 'Atlanta'>
DEFINE sales.dense DECIMAL <month proddist>
sales.dense = sales
LIMIT month TO FIRST 4

REPORT sales.dense文を発行すると、次の出力が生成されます。

                    ----------------SALES.DENSE----------------
-----PRODDIST------ -------------------MONTH-------------------
PRODUCT    DISTRICT   Jan95      Feb95      Mar95      Apr95
-------- ---------- ---------- ---------- ---------- ----------
Tents      Boston    32,153.52  32,536.30  43,062.75  57,608.39
Canoes     Seattle   64,111.50  71,899.23  83,943.86  14,383.90
Sportswear Atlanta  114,446.26 123,164.92 138,601.64 141,365.66

別の方法として、結合ディメンションのかわりにコンポジットを使用できます。この場合、次の文を使用します。

DEFINE sales.compact DECIMAL <month SPARSE <product district>>
sales.compact = sales

sales.compactを定義するときには、名前のないコンポジットがOracle OLAPによって自動的に作成され、代入文を使用するときには、そのコンポジットにディメンション値の組合せが自動的に追加されます。Oracle OLAPは、非NA値のsalesについてのみディメンション値の組合せを作成します。

SET1

SET1コマンドは、単一の値を変数、オプション、リレーションまたはディメンション・サロゲートに代入するコマンドです。オブジェクトに1つ以上のディメンションがある場合、SET1コマンドは現行のステータスにあるオブジェクト・セルにその値を代入します。

SET1コマンドは、ディメンション化されたオブジェクトをループしないため、ASSIGNトリガー・プログラムで使用して1つのオブジェクトに値を代入できます。

構文

SET1 target-name expression 

パラメータ

target-name

データを代入して格納するターゲット・オブジェクトの名前。ターゲット・オブジェクトにすることができるアナリティック・ワークスペース・オブジェクトのリストは、表10-9を参照してください。

expression

ターゲット・オブジェクトに代入するデータ値のソース。表10-9を参照してください。

SET1の使用例は、例10-164を参照してください。

SET_INCLUDED_MODEL

SET_INCLUDED_MODEL プログラムを実行すると、事前定義されたキューブ・ディメンションのモデルへのINCLUDEモデル文の追加、または事前定義されたキューブ・ディメンションのモデルからのINCLUDEモデル文の削除が行われます。このプログラムの実行で行われる変更はトランザクショナルではなく、プログラムの一部としてCOMMITが自動的に実行されます。

関連項目:

キューブ対応のOLAP DML文

構文

CALL SET_INCLUDED_MODEL(logical_dim, model_name, custom_model)

パラメータ

CALL

SET_INCLUDED_MODELは引数を持つOLAP DMLプログラムであるため、OLAP DML CALL文を使用して起動します。

logical_dim

変更するキューブ・ディメンションのOracleデータ・ディクショナリ名を示すテキスト式。

model_name

キューブ・ディメンションに関連付けられている論理モデルの名前を示すテキスト式。

custom_model

INCLUDE文を追加するOLAP DML作成のモデルを示すテキスト式。

INCLUDE文を削除するには、NAを指定します。

例10-118 OLAPキューブの静的および動的モデルの作成

my_cubeという名前のOLAPキューブをディメンション化する、my_timeという名前のOLAPキューブ・ディメンションが作成されているとします。my_cube内には、2つのメジャー(salesおよびmoving_sales)があります。次に、my_cubeの静的および動的モデルを作成します。

  1. 静的モデルを作成するには、次のPL/SQL文を実行して、setup_pre_modelという名前のユーザー作成のOLAP DMLプログラムを実行します。

    exec dbms_aw.execute('call my_util_aw!setup_pre_model');
    

    次のsetup_pre_modelプログラムの定義からわかるように、モデルは実際にはSET_INCLUDED_MODELプログラムを使用して定義され、ADD_CUBE_MODELプログラムを使用して追加されます。これらのプログラムはどちらもOLAP DMLから提供されるプログラムです。

    DEFINE SETUP_PRE_MODEL PROGRAM
    PROGRAM
     
      VARIABLE _pre_model    text
      VARIABLE _aw_dim       text
     
      _pre_model = 'my_aw!my_pre_model'
      _aw_dim = OBJORG(DIM 'my_time')
     
      DEFINE &_pre_model model
      CONSIDER &_pre_model
      MODEL JOINLINES(JOINCHARS('dimension ' _aw_dim) -
                      JOINCHARS(_aw_dim '(\'L3_3\')=10') -
                      'end')
     
      CALL SET_INCLUDED_MODEL('my_time', 'pre_model', _pre_model)
      CALL ADD_CUBE_MODEL('my_cube', 'my_time', 'pre_model', YES)
    END
    
  2. 次のPL/SQL文を実行して、my_timeディメンションをロードし、my_cubeをロードして解決します。

    exec dbms_cube.build('MY_CUBE');
    
  3. これで、次の文を発行することにより、静的モデルを使用したsalesおよびmoving salesの初期値についてのレポートを生成できます。

    select my_time||'  '||lpad(sales, 2)||'  '||lpad(moving_sales, 2)
    from my_cube_view
    order by my_time asc;
     
    MY_TIME||''||LPAD(SALES,2)||''||LPAD(MOVING_SALES,2)
    --------------------------------------------------------------------
    L1_1  14  14
    L2_1  12  12
    L2_2   2  14
    L3_1   1   1
    L3_2   1   2
    L3_3  10  11
    L3_4   1  11
    L3_5   1   2
     
    8 rows selected.
     
  4. L1_2 = (L2_2' * 2)となる動的モデルを作成するには、次のPL/SQL文を実行して、SETUP_POST_MODELという名前のユーザー作成のOLAP DMLプログラムをコールします。

    exec dbms_aw.execute('call my_util_aw!setup_post_model');
     

    次に示すユーザー作成のsetup_post_modelプログラムの定義からわかるように、モデルは実際にはSET_INCLUDED_MODELプログラムを使用して定義され、ADD_CUBE_MODELプログラムを使用して追加されます。これらのプログラムはどちらもOLAP DMLから提供されるプログラムです。

    DEFINE SETUP_POST_MODEL PROGRAM
    PROGRAM
     
      VARIABLE _post_model   text
      VARIABLE _aw_dim       text
      VARIABLE _start_date   text
      VARIABLE _timespan     text
      VARIABLE _member       text
     
      _post_model = 'my_aw!my_post_model'
      _aw_dim = OBJORG(DIM 'my_time')
      _start_date = OBJORG(ATTRIBUTE 'my_time' 'start_date')
      _timespan = OBJORG(ATTRIBUTE 'my_time' 'timespan')
      _member = 'L1_0'
     
      DEFINE &_post_model model
      CONSIDER &_post_model
      MODEL JOINLINES( -
               JOINCHARS('dimension ' _aw_dim) -
               JOINCHARS(_aw_dim '(\'' _member '\')=' _aw_dim '(\'L2_2\')*2') -
               'end')
     
      CALL SET_INCLUDED_MODEL('my_time', 'post_model', _post_model)
      CALL ADD_CUBE_MODEL('my_cube', 'my_time', 'post_model', NO)
     
      " Add _member to the dimension
      CALL ADD_DIMENSION_MEMBER(_member, 'my_time', NA, 'L1', NA, NO)
      CALL UPDATE_ATTRIBUTE_VALEU(_member, 'my_time', 'start_date', -
                                  &_start_date(&_aw_dim 'L1_1')-365, NO)
      CALL UPDATE_ATTRIBUTE_VALUE(_member, 'my_time', 'timespan', -
                                  &_timespan(&_aw_dim 'L1_1'))
      UPDATE
      COMMIT
    END
     
  5. 次の文を実行して、my_timesalesおよびmoving_salesの新しい値についてのレポートを生成します。

     
    select my_time||'  '||lpad(sales, 2)||'  '||lpad(moving_sales, 2)
        from my_cube_view
        order by my_time asc;
    
    MY_TIME||''||LPAD(SALES,2)||''||LPAD(MOVING_SALES,2)
    --------------------------------------------------------------------
    L1_0   4   4
    L1_1  14  18
    L2_1  12  12
    L2_2   2  14
    L3_1   1   1
    L3_2   1   2
    L3_3  10  11
    L3_4   1  11
    L3_5   1   2
     
    9 rows selected.

SET_PROPERTY

SET_PROPERTYプログラムを実行すると、Oracleデータ・ディクショナリで定義されたキューブの導出メジャーが持つ$LOOP_DENSEプロパティまたは$LOOP_VARプロパティの値が変更されます。このプログラムの実行で行われる変更はトランザクショナルではなく、プログラムの一部としてCOMMITが自動的に実行されます。

関連項目:

キューブ対応のOLAP DML文

構文

CALL SET_PROPERTY(property_name, logical_cube, meas_name, property_value)

パラメータ

CALL

SET_PROPERTYは引数を持つOLAP DMLプログラムであるため、OLAP DML CALL文を使用して起動します。

property_name

$LOOP_VARまたは$LOOP_DENSEを示すテキスト式。

logical_cube

meas_nameを含むキューブのOracleデータ・ディクショナリ名を示すテキスト式。

meas_name

$LOOP_VARまたは$LOOP_DENSEプロパティの値を変更する導出メジャーのOracleデータ・ディクショナリ名を示すテキスト式。

property_value

property_nameで指定したプロパティに対して有効な値を示すテキスト式。有効な値については、$LOOP_DENSEまたは$LOOP_VARを参照してください。

SHOW

SHOWコマンドは、式の単一の値を表示するコマンドです。通常、SHOWは、単一セルの変数の値またはメッセージを表示するのに使用します。SHOWは、エラー条件が発生せずに、エラーに似たメッセージを生成するプログラムで便利です。SHOWの出力は現行の出力ファイルに送信されます。

構文

SHOW expression [NONL]

パラメータ

expression

表示する値。expressionがディメンション化されている場合は、ディメンションの現行のステータスに基づいてその式の最初の値のみが表示されます。テキスト・リテラルを表示する場合は、一重引用符で値を囲む必要があります。

NONL

値の最後に改行文字を付加しないことを示します。デフォルトでは、SHOWは改行文字を付加します。

使用上の注意

出力行の連結

SHOWに付けるNONL引数は、プログラムで便利です。この引数を使用すると、複数の値を単一の出力行に連結できます。このためには、NONL引数を持つ1つ以上のSHOWコマンドの後に、NONL引数を持たない1つのSHOW文を続けます。すべてのSHOWコマンドから得られた値は、指定した順序で単一の出力値に連結されます。行の長さによって、実際には、この値が複数行の出力として生成される場合があります。

エラー・メッセージの生成

プログラムからエラー・メッセージを生成する場合、SHOWをSIGNALのかわりとして使用できます。SIGNALはエラー状態を知らせてプログラムの実行を停止しますが、SHOWはこれを実行せずにメッセージを生成します。エラー・メッセージは、デバッグ・ファイルに送信して活用できます。DBGOUTFILE文を使用してメッセージをデバッグ・ファイルに送るように指定すると、SHOWの出力はデバッグ・ファイルおよび現行の出力ファイルに送信されます。

コンポジットの値の表示

SHOWを名前付きまたは名前のないコンポジットとともに使用すると、コンポジットにそのベース・ディメンションのステータスの最初の値に対応する値がない場合はNA値が表示されます。たとえば、次の文を発行します。

SHOW SPARSE <market product>

marketおよびproductの現行値の組合せがコンポジットに存在しない場合、NA値を生成します。

テキストの行の分割

テキスト式を出力テキストで2つ以上の行に分割するには、改行デリミタ(\n)をテキストの適切な場所に挿入します。

NTEXT値に対するSHOWの使用

SHOWコマンドはNTEXT値を出力ファイルのキャラクタ・セットに変換します。NTEXT値を出力ファイルのキャラクタ・セットで表示できない場合、その文字は正しく表示されません。

例10-119 オプションの値の表示

この例では、SHOWを使用してDECIMALSオプションの現行値をレポートします。OLAP DML文

SHOW DECIMALS

によって、次の出力が生成されます。

2

例10-120 データ値の表示

SHOWを使用してディメンション化された変数の値をレポートする場合、そのディメンションの現行のステータスに基づいて変数の最初の値のみが表示されます。OLAP DML文

SHOW JOINCHARS('Actual = ' actual)

によって、次の出力が生成されます。

Actual = 533,362,88 

例10-121 SHOWによるエラー・メッセージの作成

エラー・ラベルに分岐させずに警告メッセージを表示する場合、SHOW文を使用できます。

select:
LIMIT month TO nummonths
IF STATLEN(month) GT 9
   THEN DO
     SHOW 'You can select no more than 9 months.'
     GOTO finish
     DOEND
REPORT DOWN district W 6 units
finish:
POP month
RETURN

例10-122 値セットの値の表示

アナリティック・ワークスペースに、値Jan95May95およびDec95を持つ、monthsetという値セットが格納されているとします。SHOWを使用すると、この値セットの値を表示できます。

SHOW monthset
Jan95
May95
Dec95

SIGNAL

SIGNALコマンドは、プログラム内部からユーザー定義のエラー・メッセージを生成します。TRAPがオンのときにOracle OLAPによってSIGNAL文が実行されると、実行はトラップ・ラベルに分岐します。そして、プログラム内のトラップ・ラベルに続く文が実行されます。プログラムにアクティブなトラップ・ラベルがある場合、プログラムの実行はそのラベルに分岐します。トラップ・ラベルがない場合、プログラムの実行は終了し、そのプログラムが他のプログラムによってコールされていた場合は、コール側プログラムに実行の制御が戻ります。

構文

SIGNAL {errname [message]|STOP}

パラメータ

errname

生成されるエラー・メッセージの名前を示すTEXT式。errnameは、SIGNAL文の実行時にOracle OLAPによってERRORNAMEオプションに格納されます。通常、エラーの名前はエラー・メッセージに表示されません。ただし、messageを省略すると、message引数に示すストック・メッセージとともにエラー名(errname)が表示されます。

特別な名前PRGERRを使用すると、エラーが発生したコール側プログラムと通信できます。SIGNAL PRGERR文は、ERRORNAMEを空白値に設定し、別のエラー・メッセージを表示せずにエラー状態をコール側プログラムに渡します。ネストしたプログラムの連鎖をさかのぼってSIGNALでエラーを渡す方法については、TRAPコマンドを参照してください。

message

生成するエラー・メッセージを指定するTEXT式。長い行のエラー・メッセージを作成する場合、自分で改行を追加してテキストを書式設定する必要があります。各行の終わりに改行のエスケープ・シーケンス(\n)を入力します。入力できるテキストは、最大で6行または4,000文字のいずれか先に達した方です。1行で4,000文字を超過するテキストを入力しようとすると、エラーが発生します。

この引数を省略すると、SIGNALは次のメッセージを生成します。

ERROR: (errname) Please contact the administrator of your
   Oracle Oracle OLAP application.

messageは、SIGNAL文の実行時にOracle OLAPによってERRORTEXTオプションに格納されます。

STOP

現在実行しているすべてのプログラムの実行を即座に停止します。エラー・メッセージは生成されません。このエラー状態は、アクティブなTRAPラベルではトラップされません。

例10-123 エラーの通知

1つの引数を必要とするプログラムを記述したとします。引数を指定しないと、プログラムを実行する目的がなくなります。このため、最初にプログラムは引数が渡されたかどうかを確認します。引数が渡されていない場合、プログラムはエラー・メッセージを現行の出力ファイルに送信してから終了します。

次のプログラム行は、引数の有無を確認し、見つからない場合はエラーを通知します。

IF ARGS EQ ''
THEN SIGNAL msg1 'You must supply an argument.'

SIGNALは、次のメッセージを現行の出力ファイルに送信します。

ERROR: You must supply an argument.

例10-124 引数の値が無効な場合のエラーの通知

プログラムで、1から9か月までのデータを表示できるレポートを作成するとします。プログラムが9より大きな引数でコールされる場合、エラーを通知できます。この例では、nummonthsが、9より大きいとエラーになる引数の名前です。

select:
TRAP ON error
PUSH month
LIMIT month TO nummonths
IF STATLEN(month) GT 9
   THEN SIGNAL toomany -
     'You can specify no more than 9 months.'
REPORT DOWN district W 6 units
finish:
POP month
RETURN
error:
POP month
IF ERRORNAME EQ 'TOOMANY'
   THEN SHOW 'No report produced'

SLEEP

OLAP DMLプログラム内で、SLEEPコマンドは少なくとも指定した秒数の間、プログラムの実行を一時停止します。

注意:

プログラムの実行を一時停止する必要がほとんどないため、SLEEPがOracle OLAPプログラムで使用されることはほとんどありません。

構文

SLEEP n

パラメータ

n

Oracle OLAPをスリープにする秒数を指定する数式。プログラムの実行は、少なくともこの秒数の間一時停止されます。

例10-125 プログラムの実行の一時停止

あるプログラムで、完了に10秒かかる文を実行するとします。この文の後に次のSLEEP文を続けると、プログラムの実行を10秒間一時停止できます。

SLEEP 10

SORTコマンド

SORTコマンドは、ディメンションまたはディメンション・サロゲートの現行のステータス・リストの値、あるいは値セットの値の順序を並べ替えるコマンドです。

構文

SORT dimension [byhierarchy] [bycriterion...]

ここで

  • byhierarchyはオプションの句で、階層内のファミリ・リレーションに基づき、親リレーションを使用して、階層ディメンションまたはそのディメンション・サロゲートの現行のステータス・リストの値の順序を並べ替えたり、値セットに値を代入します。SORT文に指定できるbyhierarchy句は1つのみです。この句は、SORT文の最初の句である必要があります。

    HIERARCHY parent-relation [INVERT] [DEPTH n] [SORTORPHANS]

  • bycriterionは、明示的に指定された基準を使用して、ディメンションまたはそのディメンション・サロゲートの現行のステータス・リストの値の順序を並べ替えたり、値セットに値を代入したりします。SORT文に指定できるbycriterion句の数に制限はありません。

    {A|D} [NAFIRST] criterion

パラメータ

dimension

値がディメンション、ディメンション・サロゲートまたは値セットの名前であるテキスト式。

HIERARCHY

parent-relationでの値位置に基づいてdimensionの値をソートするように指定します。

parent-relation

dimensionの親子セルフ・リレーションの名前を指定します。このリレーションは、各ディメンション値に対して、その親ディメンション値(特定の階層におけるすぐ上位の値)である、ディメンション内の別の値を保持します。この親リレーションは、複数のディメンションを持つことが可能です。

ヒント:

単一値の指定には、parent-relationのQDRを使用できます。

INVERT

Oracle OLAPが階層内の子を親の前に配置するように指定します。(デフォルトでは、子は親の後に配置されます。)

DEPTH n

ステータスに配置される世代の数(結果に含まれる値の数)を、階層の最上位からの数で指定します。nのデフォルト値は99です。結果に値を含めない場合(つまり、NULLのステータスが必要な場合)は、n-1を指定します。階層の最上位のみがステータスに必要な場合(つまり、親を持たないディメンション値のみが必要な場合)は、 0(ゼロ)を指定します。

SORTORPHANS

ステータスに親が存在しない最初の従兄弟をすべてまとめてソートするように指定します。デフォルトでは、子をソートする際、その親がステータスに存在しない場合でも、階層構造は維持されます。

A
D

値をソートする順序。Aは昇順(ソート基準がTEXT、IDまたはリレーションの場合はアルファベット順)、Dは降順(ソート基準がTEXT、IDまたはリレーションの場合は逆アルファベット順)を意味します。

NAFIRST

NA値がソートの最後でなく、最初に配置されます。

criterion

ソート基準として使用する式。各criterionは、dimensionでディメンション化する必要があります。最初の式は主要なソート基準です。式が多次元の場合、SORTはソートするディメンション以外のすべてのディメンションのステータスにある最初の値を使用します。値セットは、ソート基準として使用できません。

使用上の注意

ディメンションと値セットのソート

Oracle OLAPはディメンションをソートするとき、ディメンションの一時ステータス・リストをソートし、ディメンション化されたデータをソートしません。多くのOLAP DML文はデータをそのディメンションの現行のステータスに従って操作するため、ディメンションをソートすると、データをソートしたように見えます。ディメンションとそのディメンション・サロゲートは、同じステータスを共有します。このため、ディメンションまたはそのサロゲートに対するSORT文は、それらすべてをソートします。

Oracle OLAPが値セットをソートする場合、値セット内の実際の値をソートします。値セットをソートしてからUPDATEコマンドおよびCOMMITコマンドを実行すると、値セットの値はソートされた順序で格納されます。

アルファベット順のソート

TEXTまたはIDディメンション、あるいはその値セットをアルファベット順にソートするには、ディメンション自体をソート基準として使用します。

SORT district A district

テキスト・データのソート順

アルファベット順によるテキスト・データのソート順は、NLS_SORTオプションで制御します。

時間ディメンションのソート

DAY、WEEK、MONTH、QUARTERおよびYEAR型のディメンションの値は、内部では数字として格納されます。このため、DAY、WEEK、MONTH、QUARTERおよびYEAR型のディメンションまたはその値セットをディメンション自体をソート基準にして昇順でソートする場合、ステータス・リストまたは値セットの値は時間順に配置されます。DAY、WEEK、MONTH、QUARTERおよびYEAR型のディメンションまたはその値セットを降順でソートすると、値は時間の逆順で配置されます。

リレーションを基準とするソート

リレーションをソート基準にすると、アルファベット順でソートされますが、つまり、ディメンションや値セットが関連ディメンション値のアルファベット順リストに従ってソートされます。リレーションをソート基準として使用し、関連ディメンション値を元の順序のままにするには、ソート基準に次の式を使用する必要があります。

CONVERT(relation, INTEGER)

例10-126を参照してください。

結合ディメンションのソート

結合ディメンションまたはその値セットは、結合ディメンション自体またはそのベース・ディメンションのいずれかでディメンション化された基準によってソートできます。

連結ディメンションのソート

連結ディメンションまたはその値セットは、連結ディメンション自体またはそのコンポーネントのディメンションのいずれかでディメンション化された基準によってソートできます。例10-127および例10-128を参照してください。

ワークシートのソート

ワークシートはソート基準として使用できません。まずCONVERTを使用して、ワークシートの値を変換するデータ型を指定する必要があります。

例10-126 リレーションを基準とするソート

次の例は、1996年7月のテントの売上数量に従って地区をソートします。まず、各地区が属する地域でソートしてから売上金額を降順にソートします。次のSORT文では、第1のソート基準としてリレーションを使用します。したがって、地区はアルファベット順の地域によってソートされます。

LIMIT month TO 'Jul96'
LIMIT product TO 'Tents'
SORT district A Region.District D sales

次のREPORT文を発行します。

REPORT DOWN district HEADING 'Region' region.district sales

この文によって、SORT文の動作が反映された次のレポートが生成されます。

PRODUCT: Tents
               --------MONTH--------
               --------JUL96--------
DISTRICT         Region     SALES
-------------- ---------- ----------
Dallas         Central    154,914.23
Chicago        Central     79,934.42
Atlanta        East       140,711.00
Boston         East        93,972.49
Seattle        West       123,700.17
Denver         West       100,413.49

次のSORT文では、CONVERTを使用して地域を元の順序のままにします。

SORT district A CONVERT(region.district INTEGER) D sales

次のREPORT文を発行します。

REPORT DOWN district HEADING 'Region' region.district sales

この文によって、最後のSORT文の動作が反映された次のレポートが生成されます。

PRODUCT: Tents
               --------MONTH--------
               --------JUL96--------
DISTRICT         Region     SALES
-------------- ---------- ----------
Atlanta        East       140,711.00
Boston         East        93,972.49
Dallas         Central    154,914.23
Chicago        Central     79,934.42
Seattle        West       123,700.17
Denver         West       100,413.49

ディメンションで値をソートした順序を永続的に維持する場合は、ディメンションをソートしてからMAINTAIN文を使用します。

SORT district A district
MAINTAIN district MOVE STATUS FIRST

例10-127 連結に基づくソート

次の文は、連結ディメンションのreg.dist.ccdimをその値のすべてについて昇順にソートし、結果をレポートします。

sort reg.dist.ccdim d reg.dist.ccdim
report reg.dist.ccdim

この文によって生成される結果は、次のとおりです。

REG.DIST.CCDIM
--------------------
<Region: West>
<Region: East>
<Region: Central>
<District: Seattle>
<District: Denver>
<District: Dallas>
<District: Chicago>
<District: Boston>
<District: Atlanta>

次の文は、連結ディメンションのreg.dist.ccdimをその値のすべてについて昇順にソートし、結果をレポートします。

SORT reg.dist.ccdim A reg.dist.ccdim
REPORT reg.dist.ccdim

この文によって生成される結果は、次のとおりです。

REG.DIST.CCDIM
--------------------
<District: Atlanta>
<District: Boston>
<District: Chicago>
<District: Dallas>
<District: Denver>
<District: Seattle>
<Region: Central>
<Region: East>
<Region: West>

例10-128 コンポーネントに基づくソート

次の文は、連結ディメンションのreg.dist.ccdimをいずれかのベース・ディメンションの値に基づいて昇順でソートし、その他のベース・ディメンションの値については降順にソートし、その結果をレポートします。

SORT reg.dist.ccdim A region D district
REPORT reg.dist.ccdim

この文によって生成される結果は、次のとおりです。

REG.DIST.CCDIM
--------------------
<REGION: CENTRAL>
<REGION: EAST>
<REGION: WEST>
<DISTRICT: SEATTLE>
<DISTRICT: DENVER>
<DISTRICT: DALLAS>
<DISTRICT: CHICAGO>
<DISTRICT: BOSTON>
<DISTRICT: ATLANTA> 

例10-129 階層によるソート

アナリティック・ワークスペースに、ディメンションが2つ(geogおよびtime)、リレーションが1つ(geogparent)および変数が1つ(sales)あり、それぞれ次のように定義されているとします。

DEFINE GEOG DIMENSION TEXT
DEFINE TIME DIMENSION TEXT
DEFINE GEOGPARENT RELATION GEOG <GEOG>
DEFINE SALES VARIABLE INTEGER <TIME GEOG>
 

geogのすべての値がステータスにある状態でsalesに対するREPORT文を発行すると、次のようなレポートが生成されます。このレポートでは、geogの値は、アナリティック・ワークスペースに追加されたときの順序で表示されています。

REPORT sales
               --------SALES--------
               --------TIME---------
GEOG              2004       2005
-------------- ---------- ----------
USA                 1,300         NA
Massachusetts       3,881         NA
Florida             3,479         NA
Boston              2,644         NA
Orlando             4,398         NA
Miami               3,294         NA
Pembroke            4,268         NA
California          1,899         NA
Texas               2,115         NA
Los Angeles         2,394         NA
San Francisco       1,334         NA
Dallas                839         NA
Houston               997         NA
 

ここで、(1)geogparent と(2)sales(降順)を基準にしてgeogの値をソートするSORT文を発行します。このソートを実行した後、salesに対するREPORT文を発行すると、次のようなレポートが生成されます。このレポートでは、geogの値は、salesを基準に降順でソートされた州と、それらの州の都市(各都市はそれらが属する州の下に示されている)の両方で表示されています。

SORT geog HIERARCHY geogparent D sales
REPORT SALES
 
               --------SALES--------
               --------TIME---------
GEOG              2004       2005
-------------- ---------- ----------
USA                 1,300         NA
Massachusetts       3,881         NA
Pembroke            4,268         NA
Boston              2,644         NA
Florida             3,479         NA
Orlando             4,398         NA
Miami               3,294         NA
Texas               2,115         NA
Houston               997         NA
Dallas                839         NA
California          1,899         NA
Los Angeles         2,394         NA
San Francisco       1,334         NA
 

例10-130 階層内で親を持たない子のソート

例10-129で説明したものと同じオブジェクトがあるとします。また、フロリダ州(Florida)とマサチューセッツ州(Massachusetts)はステータスにないものとします。

ここで、SORT文にSORTORPHANSキーワードを指定すると、マサチューセッツ州の都市とフロリダ州の都市はまとめてソートされます。

SORT geog HIERARCHY geogparent SORTORPHANS D sales
REPORT sales
               ------------------SALES------------------
               ------------------TIME-------------------
GEOG                   2004                 2005
-------------- -------------------- --------------------
USA                           1,300                   NA
Orlando                       4,398                   NA
Pembroke                      4,268                   NA
Miami                         3,294                   NA
Boston                        2,644                   NA
Texas                         2,115                   NA
Houston                         997                   NA
Dallas                          839                   NA
California                    1,899                   NA
Los Angeles                   2,394                   NA
San Francisco                 1,334                   NA
 

同じ文からSORTORPHANSキーワードを除外すると、マサチューセッツ州の都市とフロリダ州の都市は別々にソートされます。

LIMIT geog COMPLEMENT 'Florida' 'Massachusetts'
SORT geog HIERARCHY geogparent D sales
REPORT SALES
 
              --------SALES--------
               --------TIME---------
GEOG              2004       2005
-------------- ---------- ----------
USA                 1,300         NA
Pembroke            4,268         NA
Boston              2,644         NA
Orlando             4,398         NA
Miami               3,294         NA
Texas               2,115         NA
Houston               997         NA
Dallas                839         NA
California          1,899         NA
Los Angeles         2,394         NA
San Francisco       1,334         NA
 

SQL

SQLコマンドは、Structured Query Language(SQL)で記述された命令をOracle OLAPからリレーショナル・マネージャに渡すコマンドです。SQLコマンドを使用すると、リレーショナル表のデータの挿入および更新、リレーショナル表からアナリティック・ワークスペース・オブジェクトへのデータの取得、およびストアド・プロシージャの実行ができます。

SQLコマンドを使用するには、SQL構文およびリレーショナル・データベース内のデータ構造を理解している必要があります。また、対象のリレーショナル表に対する適切なアクセス権も必要です。

最初に一般的なOLAP DML SQLコマンドについて説明し、続いて、次に示す特定のSQL文としてOLAP DML SQLコマンドを使用する方法について説明します。

構文

SQL sql-statement

パラメータ

sql-statement

sql-statementには、動的に実行可能なほとんどのSQL文に加えて、関連付けられた非動的な文も指定できます。また、PROCEDUREでストアド・プロシージャを指定することもできます(SQL PROCEDUREの説明を参照)。SQL文は、すべての非テキストのOLAP DML入力式の値を含め、128KB以内に収める必要があります。

次のSQL文はsql-statementに指定できません

  • COMMIT: 変更をコミットするには、OLAP DML COMMIT文を発行します。

  • ROLLBACK: OLAP DMLではロールバックできません。SQL ROLLBACKを指定すると、ROLLBACKはOLAP DML SQL文の引数としてサポートされていないというエラー・メッセージが返されます。

    注意:

    OLAP DML SQL文を使用して他の方法でロールバックを要求すると(たとえば、SQL EXECUTEを使用するなど)、Oracle OLAPはシステム・エラー・メッセージを発行し、その文を発行したOLAP DMLプログラムを異常終了します。また、Oracle OLAPは不確定な状態となり、ロールバックを要求したOLAP DMLプログラムを含むアナリティック・ワークスペース、およびコミットされていない更新があるアタッチされている他のアナリティック・ワークスペースをデタッチします。

一部のSQL文は、リレーショナル・マネージャに送信される前にOracle OLAPによって評価されます。たとえば、Oracle OLAPはSQL PREPARE、SQL EXECUTE、およびリレーショナル表のデータをアナリティック・ワークスペース・オブジェクトにコピーするSQL文を評価します(これらの文のリストは、アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピーを参照)。

使用上の注意

アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピー

リレーショナル・データは、次のように暗黙カーソルまたは明示カーソルのいずれかを使用してアナリティック・ワークスペース・オブジェクトにコピーできます。

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

  • 明示カーソルを使用してリレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするには、OLAP DMLプログラム内で次のコマンドを次に示す順序で使用します。

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

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

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

      ヒント:

      SQL FETCHは機能性に優れ、SQL IMPORTは大量のデータをリレーショナル表からアナリティック・ワークスペース・オブジェクトにコピーする際のパフォーマンスに優れています。

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

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

Oracle OLAPは、これらのすべての文をリレーショナル・マネージャに送信する前に評価します。

これらの文の構文については、それぞれの項を参照してください。他のSQL文の構文については、『Oracle Database SQL言語リファレンス』を参照してください。

リレーショナル表へのデータの挿入

アナリティック・ワークスペースのデータをリレーショナル表に挿入する際は、SQL INSERT文のためのSQL PREPARE文を使用し(通常はDIRECT= YESに設定)、SQL EXECUTEを使用してこの文を実行します。

OLAP DML SQL文に関連するオプション

SQLをOLAP DMLに埋め込む際には、いくつかのオプションが使用できます。これらのオプションは、SQLの埋込みオプションに記載されています。

OLAP DML SQL文でのOLAP DML式の使用

多くのOLAP DML SQL文では、OLAP DML式(OLAP DML変数など)を引数として使用できます。OLAP DML入力式は、SQL文へのパラメータとしてOracle OLAPにより提供されている値です。これらは、選択するデータを指定したり、変更するデータの値を提供したりするために使用します。OLAP DML入力式は、SQL WHERE句、プロシージャのパラメータ・リスト、UPDATE文、およびINSERTのVALUE句で使用できます。

OLAP DML SQL文でOLAP DML式を使用する場合は、次の点に注意してください。

  • OLAP DML式の先頭にはコロンを付けます(:myvarなど)。

  • OLAP DML入力式としてディメンションまたはディメンション変数を指定すると、ステータスにある最初の値が使用され、FORまたはACROSS文を使用してすべての値をループ処理することは可能ですが、暗黙的ループは行われません。適切なデータ型を持つ式であれば、OLAP DML入力式とすることができます。OLAP DML入力式の値は、カーソルがオープンされていれば、宣言されていなくても受け付けられます。例10-131を参照してください。

  • CLOBまたはNCLOBデータ型のリレーショナル表に対してデータの更新または挿入を行うには、OLAP DML入力式でWIDEを使用します(CLOB列またはNCLOB列への大きなテキスト値の挿入を参照)。

エラー・チェック

Oracle OLAPは、SQL文の引数における構文エラーの一部を検出できますが、ほとんどのエラーはOracle RDBMSで検出されます。エラー・コードおよびメッセージはOracle OLAPに返されます。SQL文ごとにSQLCODEの値をチェックして、どこでエラーが発生したかを判別します。エラーが発生している場合(つまり、SQLCODE EQ -1)、エラーの原因に関する情報としてSQLERRMの値をチェックします。

Oracle RDBMSデータ型のOracle OLAP DMLデータ型への変換

次の表に、自動的にOracle OLAP DMLデータ型に変換できるOracle RDBMSデータ型を示します。その他のデータ型は、SQL DECLARE CURSOR文のSELECT文で明示的に変換するかキャストする必要があります。

表10-10 RDBMSデータ型のOLAP DMLデータ型への変換

Oracle RDBMSデータ型 OLAP DMLディメンション型 OLAP DML変数データ型

CHARNCHARNVARCHAR2VARCHAR2

TEXT [WIDTH n]IDNTEXT

TEXTNTEXT

NUMBER

NUMBERINTEGERSHORTINTEGERLONGINTEGER

NUMBERINTEGERBOOLEANSHORTINTEGERLONGINTEGERDECIMALSHORTDECIMAL

CLOB(SQL FETCHおよびSQL SELECT文内のみ)

TEXT

TEXT

NCLOB(SQL FETCHおよびSQL SELECT文内のみ)

NTEXT

NTEXT

DATE

-

DATEDATETIME

SQL UPDATE文

SQL UPDATE文には、特定の検索条件を指定するWHERE句を含めることができます。単一表、および1つの表の列のみを含むビューでは、SQLで通常使用される検索条件に加えて、WHERE CURRENT OF cursor句がサポートされています。カーソルはFOR UPDATE句で定義しておく必要があります(SQL DECLARE CURSORを参照)。

例10-131 表へのデータの挿入

次のようなSQL文を使用して表を作成し、その表に行を追加できます。SQL INSERT文は、ディメンションsalespersonおよび変数dollarsの値を使用してsales表に行を追加します。ステータスにあるsalespersonの最初の値を使用して1行が追加されます。

SQL CREATE TABLE sales (name CHAR(12), dollars INTEGER)
SQL INSERT INTO sales VALUES (:salesperson, :dollars)

SQL CLEANUP

SQL CLEANUPコマンドは、すべてのSQLカーソルの宣言を取り消し、すべてのSQLカーソルのメモリー・リソースを解放します。SQL CLEANUPコマンドは、アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピーで説明したように、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするために他のSQLコマンドと組み合せて使用します。

構文

SQL CLEANUP

SQL CLEANUPの使用例については、例10-141を参照してください。

SQL CLOSE

SQL CLOSEコマンドはSQLカーソルをクローズします。SQL OPENコマンドは、アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピーで説明したように、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするために他のSQLコマンドと組み合せて使用します。

構文

SQL CLOSE cursor

パラメータ

cursor

前にSQL OPEN文でオープンしたカーソルの名前。

使用上の注意

結果セットの再定義

カーソルに関連付けられている結果セットは、カーソルをクローズし、OLAP DML入力式の値を設定し、新しくSQL OPEN文を発行することによって変更できます。カーソルを解放して宣言しなおす必要はありません。

SQL DECLARE CURSOR

SQL DECLARE CURSORコマンドは、SELECT文またはプロシージャに関連付けることによって、明示的なSQLカーソルを定義します。SELECT文は、データの有効範囲(行および列)をカーソルで選択して指定します。SQL DECLARE CURSORコマンドは、アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピーで説明したように、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーする際、明示カーソルを使用するために他のSQLコマンドと組み合せて使用します。

SQLTABLESSQLCOLUMNSの2つの疑似プロシージャで、表と列に関する情報を取得できます。

構文

SQL DECLARE cursor CURSOR FOR {select-statement [FOR UPDATE]|table-info}

ここで、table-infoは、次のいずれかです。

  • PROCEDURE SQLTABLES [ownertable]
  • PROCEDURE SQLCOLUMNS [ownertablecolumn]

注意:

table-infoは、select-statementがSQL FETCH文である場合にカーソルを宣言するときのみ指定します。

パラメータ

cursor

定義するカーソルの名前。カーソル名は、1から18個のアルファベット文字および記号@_$#で構成されます。記号@$#を含む名前は、一重引用符で囲む必要があります。最初の文字は、数字およびアンダースコア以外でなければなりません。カーソル名はOracle OLAP内部で使用されます。SQL CLEANUP文を発行せずに、以前に宣言したカーソルと同じ名前のカーソルを別のSQL SELECT文で宣言しようとすると、エラーが発生します。

select-statement

カーソルに関連付けるデータを特定するSQL SELECT文。SQL SELECT文の構文については、『Oracle Database SQL言語リファレンス』を参照してください。

ヒント:

ANDおよびORは、OLAP DML構文とSQL構文のどちらでも使用できるため、Oracle OLAPがOLAP DML入力式の末尾を認識できるように句を記述します。Oracle OLAPが認識できないSQL演算子を使用する場合および、こうした状況では構文を明確にするためにカッコを使用します。

FOR UPDATE

SQL FETCHを使用して表にデータを書き込むことを示します。この句は、WHERE CURRENT OF cursor句を持つUPDATE文でカーソルを使用する場合に必要です。更新される列の名前は、OF句(たとえば、FOR UPDATE OF COL1, COL2, COL3)で指定できます。

注意:

FOR UPDATE句は、SQL IMPORTおよびSQL SELECTには無視されます。

PROCEDURE SQLTABLES

SQL FETCHで使用するカーソルを宣言する場合は、疑似プロシージャSQLTABLESをコールします。このプロシージャは、検索基準に一致する表ごとに次の値を返します(例10-133を参照)。

  • tableowner -- 表の所有者を特定するテキスト値

  • tablename -- 表の名前を特定するテキスト値

  • tabletype: TABLE、VIEW、SYSTEM TABLE、ALIAS、SYNONYM、LOCAL TEMPORARY、GLOBAL TEMPORARYまたはNA(認識されていない種類を指す)のいずれかで表の種類を特定するテキスト値

SQL IMPORTで使用するカーソルを宣言する場合は、この句を使用できません。

PROCEDURE SQLCOLUMNS

SQL FETCHで使用するカーソルを宣言する場合は、疑似プロシージャSQLCOLUMNSをコールします。このプロシージャは、検索基準に一致する列ごとに次の値を返します(例10-134を参照)。

  • tableowner -- 表の所有者を特定するテキスト値

  • tablename -- 表の名前を特定するテキスト値

  • colname -- 列の名前を特定するテキスト値

  • coltype -- 列のデータ型を特定するテキスト値

  • olaptype -- coltypeと最も一致するデータ型を特定するテキスト値

  • length: 列の値の長さを特定するINTEGER

  • precision: 数値列の値の精度を特定するINTEGER

  • scale: 列の値のスケールを特定するINTEGER

  • nullable: 列がNULL値を含むことができるかどうかを示すYまたはNのテキスト値

SQL IMPORTで使用するカーソルを宣言する場合、PROCEDURE SQLCOLUMNS句は使用できません。

owner

リテラル・テキスト、または1つ以上の所有者を指定する値を持つOLAP DML変数の名前。この式はフィルタとして機能し、指定した所有者に属する表にのみ結果を制限します。キーワードNULL、またはNA値を持つOLAP DML変数では、すべての表の所有者が結果に含まれます。

式は、'SCOTT'などのように具体的に示すことも、'S%T'(Sで始まりTで終わる名前のすべての所有者)のようにワイルドカード文字で示すこともできます。この値は、大文字と小文字を維持したままデータベースに渡されるため、値の大文字と小文字が正しく入力されているか確認してください。たとえば、Oracleのリレーショナル・データベースは、デフォルトですべての値を大文字で格納するため、'scott''Scott''SCOTT'とは一致しません。

table

リテラル・テキスト、または1つ以上の表を指定する値を持つOLAP DML変数の名前。この式はフィルタとして機能し、指定した名前を持つ表にのみ結果を制限します。キーワードNULL、またはNA値を持つOLAP DML変数では、すべての表が結果に含まれます。

式は'PAYROLL'などのように具体的に示すことも、'%ROLL'(ROLLで終わる名前を持つすべての表)のようにワイルドカード文字で示すこともできます。この値は、大文字と小文字を維持したままデータベースに渡されるため、値の大文字と小文字が正しく入力されているか確認してください。たとえば、Oracleのリレーショナル・データベースは、デフォルトですべての値を大文字で格納するため、'payroll''Payroll''PAYROLL'とは一致しません。

column

リテラル・テキスト、または1つ以上の列を指定する値を持つOLAP DML変数の名前。この式はフィルタとして機能し、指定した名前を持つ列にのみ結果を制限します。キーワードNULL、またはNA値を持つOLAP DML変数では、すべての列が結果に含まれます。

式は'SALARY'などのように具体的に示すことも、'SAL%'(SALで始まる名前を持つすべての列)のようにワイルドカード文字で示すこともできます。この値は、大文字と小文字を維持したままデータベースに渡されるため、値の大文字と小文字が正しく入力されているか確認してください。たとえば、Oracleのリレーショナル・データベースは、デフォルトですべての値を大文字で格納するため、'salary''Salary''SALARY'とは一致しません。

使用上の注意

SQL DECLARE CURSORに関する一般的な制約

SQL DECLARE CURSORコマンドには、次の制約があります。

  • プログラムでのみ使用できる

  • アンパサンド置換を使用できない。

SQL IMPORTで使用するカーソルを宣言する際の制約

SQL IMPORT文で使用するカーソルを宣言する場合は、次の簡略化構文のみを使用できます。

SQL DECLARE cursor CURSOR FOR select-statement

ここで、select-statement はカーソルに関連付けるデータを特定するSQL SELECT文です。FOR UPDATE句およびtable-info句は使用できません。

カーソルの結果セット

カーソルの結果セットは、カーソルがオープンされるときに決定され、後からは更新されません。このため、カーソルをオープンしてからOLAP DML入力式の値を変更しても、その変更はカーソルの結果セットに影響しません。カーソルはSQL CLOSE文が実行されるまで、またはSQL CLEANUP文ですべてのカーソルがクローズされるまでオープンのままです。カーソルは、オープンしたプログラムが終了しても自動的にクローズされません。

フェッチの最適化

値を多次元の入力変数にフェッチする場合は、SQL DECLARE CURSOR文の引数select-statementにORDER BY句でディメンションに対応する列を指定するとき、最も変化の遅いディメンションを最初に指定します。これにより、パフォーマンスが最適化されます。

例10-132 SQLCODEの値のテスト

カーソルc1が、ユーザーsqldbaが所有する表mktの3列について宣言されています。この3列から3つのアナリティック・ワークスペース・オブジェクトに値がフェッチされます。最初のOLAP DMLオブジェクトはmarketディメンションで、一時的に取得値に制限されています。marketの一時ステータスのため、他の列の値は他のOLAP DMLオブジェクトの適切なセルに割り当てられます。

この例では、SQLCODEの値を2か所でテストしています。完全なプログラムほど、多くのエラー・チェックが実行されます。

DEFINE market DIMENSION TEXT
DEFINE mkt.desc TEXT <market>
DEFINE mkt.abbrev ID <market>
DEFINE sql.market PROGRAM
PROGRAM
TRAP ON ERROR
SQL DECLARE c1 cursor FOR -
   SELECT mktcode, mktabbrev, mktdesc FROM sqldba.mkt
SQL OPEN c1
IF SQLCODE NE 0
   THEN SIGNAL SQLERR 'open cursor failed.'
WHILE SQLCODE EQ 0
   SQL FETCH c1 INTO :APPEND market, :mkt.abbrev, :mkt.desc
SQL CLOSE c1
   ...
RETURN
error:
   ...
END

例10-133 リレーショナル表に関する情報の検出

次のプログラムは、Scottが所有するすべての表に関する情報をフェッチします。ownername変数の値は、SQL DECLAREカーソル文の後で設定されていますが、これは、SQL OPEN文の前であればどこでも設定できます。tablename変数は設定されていませんが、自動的にNAに初期化されてNULL値として渡されます。

DEFINE ownername TEXT     "Search criteria
DEFINE tablename TEXT     "Search criteria
DEFINE tblowner TEXT      "Search results
DEFINE tblname TEXT       "Search results
DEFINE tbltype TEXT       "Search results
 
SQL DECLARE c1 CURSOR FOR PROCEDURE sqltables(:ownername, :tablename)
ownername = 'Scott'
SQL OPEN c1
WHILE SQLCODE EQ 0
   DO
   SQL FETCH c1 INTO :tblowner, :tblname, :tbltype
      ...     "Process fetched values
   DOEND

例10-134 リレーショナル表の列に関する情報の検出

次のプログラムは、Scottが所有するemployee表のすべての列に関する情報をフェッチします。SQLCOLUMNSの3番目の引数の値には、NULL(NAではない)が使用されていますが、これはOracle OLAPではなく、リレーショナル・マネージャで処理されるためです。

DEFINE tblname TEXT             "Search results
DEFINE tblowner TEXT            "Search results
DEFINE colname TEXT             "Search results
DEFINE coltype TEXT             "Search results
DEFINE olaptype TEXT            "Search results
DEFINE length INTEGER           "Search results
DEFINE precision INTEGER        "Search results
DEFINE scale INTEGER            "Search results
DEFINE nullable TEXT            "Search results
 
SQL DECLARE c1 CURSOR FOR PROCEDURE sqlcolumns('Scott', -
   'Employee', NULL)
SQL OPEN c1
WHILE SQLCODE EQ 0
   DO
   SQL FETCH c1 INTO :tblowner, :tblname, :colname, :coltype, -
   :olaptype, :length, :precision, :scale, :nullable
      ...  "Process fetched values
    DOEND 

SQL EXECUTE

SQL EXECUTEコマンドは、SQL PREPAREでコンパイルされたSQL文を実行します。一般に、プリコンパイルするSQL文は繰り返し実行される文であり、特に、OLAP DML入力式を含む INSERTUPDATEDELETEなどの文です。

注意:

SQL PREPAREおよびSQL EXECUTEコマンドは、同じDMLプログラム内でのみ使用できます。

構文

SQL EXECUTE statement-name

パラメータ

statement-name

SQL PREPAREを使用してプリコンパイルしたときに実行コードに付けた名前。

例10-135 アナリティック・ワークスペース・データによるリレーショナル表の更新

次の例は、Oracle OLAPに格納されているデータを使用した表の単純な更新を示します。marketディメンションは、FORループで一度に1つの値に制限されています。SQL句のWHERE s.market=:marketは、そのmarketの行にある売上値を変更する値として指定します。

FOR market
   SQL UPDATE mkt SET sales=:mkt.sales WHERE s.market=:market

UPDATE文は、SQL PREPARE文で使用し、FORループで実行します。

SQL PREPARE s2 FROM UPDATE mkt -
   SET sales=:mkt.sales WHERE s.market=:market
FOR market
   DO
      SQL EXECUTE s2
      IF SQLCODE NE 0
      THEN BREAK
   DOEND

SQL FETCH

SQL FETCHコマンドは、名前付きSQLカーソルで指定されたデータを取得して処理します。SQL FETCHは、取得したデータをOLAPオブジェクトに割り当てます。SQL FETCHコマンドは、アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピーで説明したように、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするために他のSQLコマンドと組み合せて使用します。

構文

SQL FETCH cursor [LOOP [loopcount]] -    INTO :targets... [THEN action-statements...]

ここで

  • targetsは、次のいずれか1つ以上です。

    • [MATCH] dimension|surrogate
    • APPEND [positiondimension
    • ASSIGN surrogate
    • variable | qualified data reference | relation | composite
  • positionは次のいずれかです。

    • AFTER dimension-value
    • BEFORE dimension-value
    • FIRST
    • LAST

パラメータ

cursor

宣言してオープンするカーソルの名前。

LOOP

リレーショナル表から取得した行に対してOracle OLAPが暗黙的にループ処理するように指定します。Oracle OLAPは、行ごとに、各フィールドのデータをターゲット・アナリティック・ワークスペース・オブジェクトとして指定されているオブジェクトにコピーします。LOOP句が含まれている場合、カーソルで指定されたアクティブ・セットの最後に達するまで、エラーが発生するまで、またはloopcountに達するまで、SQL FETCHは行処理を継続します。SQL FETCHのパフォーマンスを改善するために、ほとんどの場合でLOOP句を使用します。

LOOP句を指定しないときに、カーソルが指定するアクティブ・セットに複数の行が含まれている場合、SQL FETCH文はWHILEループ内でコーディングする必要があります。このループは、データの終了またはエラーを示す場合にゼロ以外の値を返すSQLCODEオプションの値に基づくようにします。

loopcount

LOOPキーワードに対するオプションのINTEGERの引数。loopcountは、SQL FETCHがリレーショナル表の行に対するループ処理の方法を制御します。loopcountには、リテラル値、OLAP DML変数またはNAを使用できます。loopcountが0以下の場合、ループは実行されず、データもフェッチされません。

loopcountの値を付けずにLOOP句を指定すると、SQL FETCHは行の読取りおよびその内容のターゲット・アナリティック・ワークスペース・オブジェクトへのコピーを、読み取る行がなくなるかエラーが発生するまで続けます。内部では、SQLCODEがゼロ以外の値になるまで各行が処理されます。

loopcountにリテラル値を指定すると、SQL FETCHはloopcountで指定された行数を、またはSQLCODEがゼロ以外の値になるまで処理を続けます。

loopcountに変数を指定する場合は、OLAP DML変数の形式にする必要があります(前にコロンを付けます)。この変数は、入力変数としても、出力変数としても機能します。loopcount の初期値は、SQL FETCHで処理しようとする行数を指定します。SQL FETCHを完了すると、loopcountには実際に処理された行数が含まれます。

loopcountNAを指定すると、SQL FETCHはSQLCODEがゼロ以外の値になるまで行を処理します。ただし、SQL FETCHを完了すると、loopcount には実際に処理した行数が含まれます。

targets

リレーショナル表から取得したデータを格納するアナリティック・ワークスペース・オブジェクトを特定します。このターゲット・アナリティック・ワークスペース・オブジェクトのリストは、その数およびデータ型が、カーソルを宣言するSQL DECLARE CURSORコマンドの引数select-statementで指定された表の列のリストに対応している必要があります。変数、修飾データ参照、リレーション、ディメンション、コンポジットまたは結合をターゲットにできます。

注意:

ターゲット・アナリティック・ワークスペース・オブジェクトを指定する順序は、ディメンション・ステータスに影響します。Oracle OLAPは、ディメンション値ごとに、ディメンションのステータスをフェッチされた値に一時的に制限します。値が次に割り当てられるアナリティック・ワークスペース・オブジェクトは、この一時的なステータスに従います。ターゲット・アナリティック・ワークスペース・オブジェクトにする結合ディメンションターゲット・アナリティック・ワークスペース・オブジェクトにするコンポジット・ディメンションを参照してください。

ターゲットには、前にコロンを付ける必要があります。ターゲットがディメンションの場合、MATCHおよびAPPENDキーワードでディメンションの処理を指定できますが、この場合、コロンはキーワードの前に付けます。

[MATCH] {dimension|surrogate}

(デフォルト)Oracle OLAPは、ターゲットのディメンションやサロゲートに対してディメンション・メンテナンスを実行しません。ディメンション化されたオブジェクトにフェッチされるデータの整列では、受け取る値を使用します。リレーショナル・データベースから受け取る値が、ディメンションまたはサロゲートの値に一致しない場合、エラーが通知されます。

APPEND [position] dimension

Oracle OLAPは、新しい値をディメンションに追加して、ターゲットのディメンションにディメンション・メンテナンスを実行します。ディメンション化されたオブジェクトにフェッチされるデータの整列には、新旧両方のディメンション値を使用します。デフォルトでは、新しい値がディメンションまたはサロゲートの最後に追加されます。

positionは、次のいずれか1つです。

  • AFTER dimension-value

    新しい値は、ステータス・リストのdimension-valueの後ろに追加されます。

  • BEFORE dimension-value

    新しい値は、ステータス・リストのdimension-valueの直前に追加されます。

  • FIRST

    新しい値はステータス・リストの最初に追加されます。

  • LAST

    新しい値はステータス・リストの最後に追加されます。

また、アクション文でディメンション値を処理する方法は、positionを使用しても制御できます。

ASSIGN surrogate

指定されたサロゲートに値を割り当てます。

THEN action-statements...

データの行をフェッチしてターゲット・アナリティック・ワークスペース・オブジェクトに割り当てるたびに実行するaction-statementsを必要なだけ指定します。action-statementは、次のいずれかです。

assignment-statement IF statement SELECT-statement ACROSS statement: action-statement <action-statement-group>

action-statementsの構文の詳細は、SQL IMPORTコマンドを参照してください。

使用上の注意

SQL FETCHのターゲットの順序がディメンション・ステータスに与える影響

Oracle OLAPは、ディメンション値ごとに、ディメンションのステータスをフェッチされた値に一時的に制限します。値が次に割り当てられるアナリティック・ワークスペース・オブジェクトは、この一時的なステータスに従います。

ターゲット・アナリティック・ワークスペース・オブジェクトにする結合ディメンション

結合ディメンションをターゲット・アナリティック・ワークスペース・オブジェクトとして使用できますが、必ず単純なベース・ディメンションと同じ数の列をリレーショナル表から選択する必要があります。Oracle OLAPが結合ディメンションであるターゲットにSQL FETCH文を実行する場合、その結合ディメンションが定義されたときに指定されたディメンション順を使用します。

ターゲット・アナリティック・ワークスペース・オブジェクトにするコンポジット・ディメンション

ディメンション化された変数と同じように、コンポジットとしてアナリティック・ワークスペース・オブジェクトを指定できます。たとえば、dim1およびdim2でディメンション化された変数var1にデータをフェッチするためには、次のようなターゲット・アナリティック・ワークスペース・オブジェクトのリストを指定します。

:dim1 :dim2 :var1

ディメンションdim1およびdim2を持つコンポジット・ディメンションでディメンション化された変数var2にデータをフェッチするためには、次のようなターゲット・アナリティック・ワークスペース・オブジェクトのリストを指定します。

:dim1 :dim2 :var2

NULL値

SQLのNULL値は、Oracle OLAPのNA値と同等であるため、ターゲット・アナリティック・ワークスペース・オブジェクトにフェッチされたNULL値はNA値になります。Oracle OLAPではこのようにNULL値を処理するため、SQLコマンドはSQL FETCH文のINTO句にある INDICATOR変数をサポートしません。ただし、NULL値をディメンションにフェッチすると、Oracle OLAPはその行全体の値を破棄します。

入力およびターゲット・オブジェクトとしてのブール変数の使用

OLAP SQLコマンドの入力およびターゲットのアナリティック・ワークスペース・オブジェクトにブール変数を使用できます。OLAP DML入力式の場合、Oracle OLAPはブール値を1(TRUE)または0(FALSE)の値を持つINTEGER値として扱います。

ターゲット・アナリティック・ワークスペース・オブジェクトの場合、ブール変数はリレーショナル表のあらゆる数値(またはビット)列の値を受け取ることができます。

テキスト・データのDATE変数へのフェッチ

テキスト・データをDATE変数にフェッチすると、DATEORDERオプションの現行の設定で値が解釈されます。たとえば、テキスト値12-08-96は、DATEORDERの設定によって、1996年12月8日にも1996年8月12日にも解釈できます。

転送できないデータ型

データ型がLONG RAW、ROWID、UROWID、BLOBおよびBFILEのデータは転送できません。

get_products_hierプログラムは、SQL FETCHコマンドおよびAPPENDキーワードを使用して、ディメンション表のデータをaw_products連結ディメンションのベース・ディメンションにコピーします。aw_productsのベース・ディメンションが移入されると、aw_productsそのものもOracle OLAPにより自動的に移入されます。SQL FETCH文のTHEN句が実行されると、Oracle OLAPはaw_productsの親子セルフ・リレーションにデータをフェッチします。このプログラムでは、aw_supplier_idディメンションおよびそのリレーションの移入も行われます。

例10-136 リレーショナル表からのデータのフェッチ -- 単純なSQL FETCH

次のプログラムの抜粋では、カーソルを宣言してオープンする基本的なステップとデータのフェッチを示します。Products表のProd_ID列およびProd_Name列のリレーショナル・データを、prodディメンションおよびprod_label変数にフェッチします。変数prod_labelは、prodでディメンション化されています。この例のSQL FETCH文にはLOOP句が含まれていないため、コールのたびに単一のデータ行が取得されます。

VARIABLE set_price SHORT
set_price = 20
     ...
SQL DECLARE highprice CURSOR FOR SELECT Prod_ID, Prod_Name -
   FROM Products WHERE suggested_price > :set_price
SQL OPEN highprice
WHILE SQLCODE EQ 0
     SQL FETCH highprice INTO :prod, :prod_label

例10-137 THEN句を使用したリレーショナル表からのデータのフェッチ

次のプログラムの抜粋は、前の例のSQL FETCH文にLOOPキーワードおよびTHEN句を追加しています。LOOPキーワードがあるため、このSQL FETCH文はWHILEループ内で実行する必要がありません。THENキーワードの後ろのアクション文は、文字Aで始まるprod_labelに格納されている製品名をa_productという複数行のテキスト変数にコピーします。

SQL FETCH highprice LOOP INTO :prod, :prod_label -
   THEN IF UPCASE(EXTCHARS(prod_label, 1, 1)) EQ 'a' -
      THEN a_product = JOINLINES(a_product prod_label)

例10-138 結合ディメンションをメンテナンスしながらのリレーショナル・データの移入

この例では、ターゲット・アナリティック・ワークスペース・オブジェクトとして(mptという名前の)結合ディメンションを使用します。結合ディメンションを移入するには、そのベース・ディメンションごとにリレーショナル・データベースから値を選択する必要があります。ここでは、3つのベース・ディメンション、marketproductおよびtimeがあります。このため、 SELECT文は3つに対応する列(MktcodePrdcodeおよびPercode)を指定します。このプログラムは、marketproductおよびtimeディメンションがすでに最新の値で移入済であるとするため、それらがターゲット・アナリティック・ワークスペース・オブジェクトとして明示的に指定されないかぎり、Oracle OLAPがベース・ディメンションを更新することはありません。

DEFINE mpt DIMENSION <market product time>
DEFINE sql.mpt PROGRAM
PROGRAM
   ...
SQL DECLARE c1 CURSOR FOR -
   SELECT Mktcode, Prdcode, Percode FROM Sqldba.Data
IF SQLCODE NE 0
   THEN SIGNAL sqlerrm
SQL OPEN c1
SQL FETCH c1 LOOP INTO :append mpt
SQL CLOSE c1
   ...
END

例10-139 ベース・ディメンションと結合ディメンションをメンテナンスしながらのデータの移入

ベース・ディメンションおよび結合ディメンションに現行値を取得する場合、または初めて値を取得する場合、ベース・ディメンションの値に続けて結合ディメンションの値をフェッチできます。次の例で、SQL DECLARE CURSORおよびSQL FETCHコマンドはベース・ディメンションおよび結合ディメンションの両方の値をフェッチするように変更されています。リレーショナル表から選択する列の数は、フェッチされたベース・ディメンションの数と一致する必要があります。このSELECT文では6つの列が指定されています。最初の3列が3つのベース・ディメンション、最後の3つが結合ディメンションに相当します。

SQL DECLARE c1 CURSOR FOR -
   SELECT Mktcode, Prdcode, Percode, Mktcode,  -
      Prdcode, Percode FROM Sqldba.Data
   ...
  SQL FETCH c1 LOOP INTO :APPEND market, :APPEND product, -
   :APPEND time, :APPEND mpt

例10-140 ディメンションをメンテナンスしながらの変数へのリレーショナル表データの移入

次の例で、変数dollars.mptは結合ディメンションmptでディメンション化され、その値には同じSQL FETCH文でディメンション値が移入されます。SQL DECLARE CURSORおよびSQL FETCHコマンドは再度変更され、新しい列とターゲット・アナリティック・ワークスペース・オブジェクトが追加されています。

DEFINE dollars.mpt DECIMAL <mpt>
SQL DECLARE c1 CURSOR FOR -
   SELECT Mktcode, Prdcode, Percode, Mktcode, Prdcode, -
      Percode, Dollars FROM Sqldba.Data
   ...
SQL FETCH c1 LOOP INTO :APPEND market, :APPEND product, -
   :APPEND time, :APPEND mpt, :DOLLARS.mpt 

例10-141 連結ディメンションへのデータのフェッチ

リレーショナル表に製品データの列が4つあるため、このデータを格納するProductという4レベルの階層をアナリティック・ワークスペースで作成するとします。階層の各レベル(prod_idprod_subcategoryprod_categoryおよびproducts_all)は、products表の列にマップされます。階層の最下位レベルはprod_id、最上位レベルはproducts_allです。また、表にはサプライヤ情報を含む列もあります。

アナリティック・ワークスペースでデータを保持するために、Product階層の各レベルについて定義したディメンション、階層自体の連結ディメンション、および階層の値間の親子関係を定義します。また、次の定義によって、サプライヤ・データのディメンション、およびサプライヤと製品の関係を保持するリレーションを定義します。

DEFINE aw_prod_id DIMENSION NUMBER (6)
DEFINE aw_prod_subcategory DIMENSION TEXT
DEFINE aw_prod_category DIMENSION TEXT
DEFINE aw_products_all DIMENSION TEXT
DEFINE aw_products DIMENSION CONCAT (aw_products_all -
                                  aw_prod_category -
                                  aw_prod_subcategory -
                                  aw_prod_id)
DEFINE aw_products.parents RELATION aw_products <aw_products>
DEFINE aw_supplier_id DIMENSION NUMBER (6)
DEFINE aw_prod_id.aw_supplier_id RELATION aw_supplier_id <aw_prod_id>

次のコードで構成されるget_products_hierというプログラムを記述します。

' get_products_hier Program
ALLSTAT
" Fetch values into the products hierarchy
SQL DECLARE grabprods CURSOR FOR SELECT prod_total, -
                                        prod_category, -
                                        prod_subcategory, -
                                        prod_id -
                                   FROM sh.products
SQL OPEN grabprods
SQL IMPORT grabprods INTO :APPEND aw_products_all -
                              :APPEND aw_prod_category -
                              :APPEND aw_prod_subcategory -
                              :APPEND aw_prod_id 
                         
SQL CLOSE grabprods 
SQL CLEANUP
" Update the analytic workspace and make the updates permanent
UPDATE
COMMIT
" Fetch values into supplier_id
SQL DECLARE grabsupid CURSOR FOR SELECT supplier_id -
                                 FROM sh.products
SQL OPEN grabsupid
SQL IMPORT grabsupid INTO :APPEND aw_supplier_id 
SQL CLOSE grabsupid 
SQL CLEANUP
" Update the analytic workspace and make the updates permanent
UPDATE
COMMIT

" Populate self-relation for concat dimension
" and relation between aw_prod_id and aw_supplier_id
SQL DECLARE makerels CURSOR FOR SELECT prod_total, -
                                       prod_category, -
                                       prod_subcategory, -
                                       prod_id, -
                                       supplier_id -
                                 FROM sh.products
SQL OPEN makerels
SQL FETCH makerels LOOP INTO :MATCH aw_products_all -
                             :MATCH aw_prod_category -
                             :MATCH aw_prod_subcategory -
                             :MATCH aw_prod_id -
                             :MATCH aw_supplier_id -
            THEN aw_products.parents(aw_products aw_prod_id) -
                = aw_products(aw_prod_subcategory aw_prod_subcategory) -
            aw_products.parents(aw_products aw_prod_subcategory) -
               = aw_products(aw_prod_category aw_prod_category) -
            aw_products.parents(aw_products aw_prod_category) -
               = aw_products(aw_products_all aw_products_all) -
            aw_prod_id.aw_supplier_id = aw_supplier_id         
SQL CLOSE makerels 
SQL CLEANUP
" Update the analytic workspace and make the updates permanent
UPDATE
COMMIT

SQL IMPORT

SQL IMPORTコマンドは、明示的なSQLカーソルで指定されたデータを取得して処理します。SQL IMPORTは、取得したデータをOLAPオブジェクトに割り当てます。SQL IMPORTコマンドは、アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピーで説明したように、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするために他のSQLコマンドと組み合せて使用します。SQL IMPORTは、リレーショナル表のファクト・データをアナリティック・ワークスペースの変数にコピーする場合に特に有効です。

注意:

データ型がLONG、BLOBおよびBFILEのデータは転送できません。

構文

SQL IMPORT cursor [:var-num-of-rows |num-of-rows[:var-num-of-processed-rows]]-        INTO :targets... [THEN action-statements...]

ここで

  • targetsは、次のいずれか1つ以上です。

    • MATCH | MATCHSKIPERR [position] {dimension | surrogate | valueset | relation}
    • APPEND dimension
    • ASSIGN surrogate
    • variable | relation | qualified data reference
  • action-statementsは次のいずれかです。

    • assignment-statement
    • IF-statement
    • SELECT-statement
    • ACROSS-statement: action-statement
    • <action-statement-group>

パラメータ

cursor

宣言されたカーソルの名前。

var-num-of-rows

SQL IMPORTによりインポートする行数を指定するための変数の名前。

num-of-rows

SQL IMPORTによりインポートする行数を指定する数値定数。

var-num-of-processed-rows

targetsパラメータにMATCHSKIPERRキーワードが含まれる場合に、SQL IMPORTによりアナリティック・ワークスペース・オブジェクトへインポートする実際の行数を指定するための変数の名前。

targets

リレーショナル表から取得したデータを格納するアナリティック・ワークスペース・オブジェクトを特定します。このターゲット・アナリティック・ワークスペース・オブジェクトのリストは、その数およびデータ型が、カーソルを宣言するSQL DECLARE CURSORコマンドの引数select-statementで指定された表の列のリストに対応している必要があります。変数、修飾データ参照、リレーション、ディメンションまたはコンポジットをターゲットにできます。

注意:

アナリティック・ワークスペース・オブジェクトを指定する順序は、ディメンション・ステータスに影響します。Oracle OLAPは、ディメンション値ごとに、ディメンションのステータスをフェッチされた値に一時的に制限します。値が次に割り当てられるアナリティック・ワークスペース・オブジェクトは、この一時的なステータスに従います。

MATCH

(デフォルト)Oracle OLAPは、対応するリレーショナル表の列からターゲットのディメンションまたはサロゲートに値をコピーしません。ディメンション化されたオブジェクトにフェッチされるデータの整列では、値のみを使用します。リレーショナル・データベースから受け取る値が、ディメンション値に一致しない場合、エラーが通知されます。

MATCHSKIPERR

Oracle OLAPは、対応するリレーショナル表の列からターゲットのディメンションまたはサロゲートに値をコピーしません。ディメンション化されたオブジェクトにフェッチされるデータの整列では、値のみを使用します。リレーショナル・データベースから受け取る値が、ディメンション値に一致しない場合、その値は無視されて処理が継続し、エラーは通知されません。

position

1から始まる数値で示す論理的な位置。

APPEND

Oracle OLAPは、対応するリレーショナル表の列から新しい値をディメンションに追加して、ターゲットのディメンションにディメンション・メンテナンスを実行します。ディメンション化されたオブジェクトにフェッチされるデータの整列には、新旧両方のディメンション値を使用します。新しい値はディメンションの最後に追加されます。

ASSIGN

Oracle OLAPは、対応するリレーショナル表の値を指定したサロゲートに割り当てます。

dimension

アナリティック・ワークスペース・ディメンションの名前。

surrogate

アナリティック・ワークスペース・サロゲートの名前。

valueset

アナリティック・ワークスペース値セットの名前。

relation

アナリティック・ワークスペース・リレーションの名前。

variable

変数の名前。

qualified_data_reference

QDRは、変数またはリレーションの1つ以上のディメンションを単一の値に制限する修飾子です。Oracle OLAPは、次のようにSQL IMPORT文のQDRを評価します。

  • QDRに式が含まれている場合、その式はデータを取得する前に1回のみ評価されます。つまり、この式は本質的に定数と言えます。

  • QDRがリレーション名として指定されている場合、QDRの値はそのリレーションのディメンションのステータスによって変化します。

THEN action-statements...

データの行をインポートしてアナリティック・ワークスペース・オブジェクトに割り当てるたびに実行するaction-statementsを必要なだけ指定します。アクション文には、単純な代入文、条件付き代入文および複数のディメンションに及ぶ代入文を含むことができます。

アクション文では、行ごとにフェッチされたデータを確認して処理できます。たとえば、一時オブジェクトをアナリティック・ワークスペース・オブジェクトに指定し、フェッチしたデータの行に対して一定のアクションを実行した後、永続オブジェクトのみを更新できます。ただし、アクション文がインポートされたデータを参照する必要はありません。たとえば、アクション文のいずれかをユーザー定義ファンクション(つまり、プログラム)を実行する代入文にして、複雑な処理を実行してから単純にカウンタを増分できます。

THEN句によって、SQL IMPORTの完了時に実行する後処理の必要がなくなるため、SQLのロード・パフォーマンスを向上できます。

注意:

SQL IMPORT内のアクション文の構文は、FILEREAD内のアクション文の構文と基本的に同じです。ただし、代入文の構文とVALUEキーワードの使用については例外があります。SQL IMPORTアクション文では、代入を明示的に行い、ソース、ターゲットおよび等号を含める必要があります。FILEREADアクション文では、暗黙的に代入を実行でき、ターゲットを指定するのみでかまいません。VALUEキーワードは、FILEREADアクション文ではサポートされていますが、SQL IMPORTアクション文ではサポートされていません。FILEREADに指定されたアクション文がすでにある場合は、代入文を修正し、必要に応じてVALUEキーワードを削除すると、そのコードをSQL IMPORTで再利用できます。ディメンション処理を制御する属性を除く大部分のFILEREAD属性は、SQLロードに対して意味がなく、SQL IMPORT内での実行の際に無視されます。

パフォーマンスの向上のために、THEN句ではインポートされた行内のデータのみを参照してください。

アクション文のリストでは、必ず変数の前にディメンションを処理してください。Oracle OLAPは、リレーショナル表の各行について左から右にアクション文を1つずつ処理します。アクション文でディメンション処理を実行すると、その結果得られたステータスは次のアクション文にも有効になります。変数のディメンションを制限するアクション文を最初に指定しない場合、Oracle OLAPはステータスにある最初の値を使用して変数のセルのターゲットとします。ACROSS句を指定しないかぎり、Oracle OLAPは行の単一の値をOracle OLAP変数の単一のセルに割り当てます。デフォルトでは、Oracle OLAPはデータを変数に割り当てる際に変数のディメンションをループ処理しません

assignment-statement

式の結果である値をOracle OLAPオブジェクトに代入する代入文(SET)。

IF-statement

ブール式がTRUEまたはFALSEのいずれであるかに従ってアクションを実行するIF...THEN...ELSEコマンド文。

SELECT-statement

SQL SELECT文では、式の値に基づいてアクションが実行されます。SELECT文の形式は次のとおりです。

  • SELECT select-expression
  • [WHEN expression1 action]
  • [WHEN expression2 action . . .]
  • [ELSE action]

SELECTはSELECT式を評価し、その結果をWHEN式と順次比較します。最初に一致が見つかったところで、関連付けられたactionが発生します。一致が見つからない場合、ELSE actionが指定されていれば発生します。

ACROSS-statement: action-statement

ACROSS文では、後に続くアクション文がACROSSディメンションのステータスにあるすべての値に対して1回ずつ実行されます。ループを複数のアクション文に適用するには、アクション文を山カッコで囲みます。ACROSS文の形式は次のとおりです。

      ACROSS dimension [limit]:

       action-statement

ACROSS文のlimitは、dimensionに対するFORループ時以外の場合、dimensionのステータスを一時的に変更します。新しいステータスはSQL FETCH文の間のみ有効です。limit-clauseの形式は、次のとおりです。

     [ADD|COMPLEMENT|KEEP|REMOVE|TO] limit-clause

一時的なステータスを指定するには、ディメンション値の適切なリストまたは関連ディメンションとともに、LIMITコマンドのキーワードのいずれか(デフォルトはTO)を挿入します。有効な制限句を使用できます(詳細は、LIMITコマンドを参照)。次の例は、monthの現行のステータスにかかわらず、monthを最近の6つの値に制限します。

   ACROSS month last 6: units
<action-statement-group>

複数のアクション文は山カッコで囲んでグループ化できます。action-statement-group の形式は次のとおりです。

   <action-statement1 -

   [action-statement2 . . .]>

アクション文のグループが使用されるのは、通常、ACROSS文の後です。山カッコの構文によって、ACROSSディメンションのステータスにあるすべての値に対して複数のアクション文を実行できます。

使用上の注意

SQL SELECTのターゲットの順序がディメンション・ステータスに与える影響

Oracle OLAPは、ディメンション値ごとに、ディメンションのステータスをフェッチされた値に一時的に制限します。値が次に割り当てられるアナリティック・ワークスペース・オブジェクトは、この一時的なステータスに従います。

ブール・データ型の変数の使用

OLAP SQLコマンドの入力およびターゲットのアナリティック・ワークスペース・オブジェクトにブール変数を使用できます。OLAP DML入力式の場合、Oracle OLAPはブール値を1(TRUE)または0(FALSE)の値を持つINTEGER値として扱います。

ターゲット・アナリティック・ワークスペース・オブジェクトの場合、ブール変数はリレーショナル表のあらゆる数値(またはビット)列の値を受け取ることができます。

テキスト・データのDATE変数へのインポート

テキスト・データをDATE変数にインポートすると、DATEORDERオプションの現行の設定で値が解釈されます。たとえば、テキスト値12-08-96は、DATEORDERの設定によって、1996年12月8日にも1996年8月12日にも解釈できます。

例10-142 単純なインポート

次のプログラムの抜粋では、カーソルを宣言してデータをインポートする基本的なステップを示します。販売履歴(sh)データベースのProductsリレーショナル表のProd_ID列およびProd_Name列の値を、prod_idディメンションおよびprod_labelアナリティック・ワークスペース変数にフェッチします。prod_label変数は、prod_idでディメンション化されています。

SQL DECLARE productcur CURSOR FOR SELECT Prod_ID, Prod_Name FROM sh.Products
SQL OPEN productdur
SQL IMPORT productcur INTO :prod_id, :prod_label
SQL CLOSE productcur
SQL CLEANUP 

SQL OPEN

SQL OPENコマンドは、明示的に宣言されたSQLカーソルをアクティブ化します。カーソルがオープンされると、SQLは指定されたカーソルの定義で使用されるOLAP DML入力式を判別し、カーソルの結果セットを確認し、SQL FETCHまたはSQL IMPORTが使用できるようにカーソルをオープン状態のままにします。カーソルは、結果セットの最初の行の前に配置されます。

SQL OPENコマンドは、アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピーで説明したように、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするために他のSQLコマンドと組み合せて使用します。

構文

SQL OPEN cursor

パラメータ

cursor

同じプログラム内で先に宣言されているカーソルの名前。アンパサンド置換は使用できません。

例10-143 SQL OPENによるカーソルのオープン

次のプログラムの抜粋は、geolabelsというカーソルを宣言してオープンします。

SQL DECLARE geolabels CURSOR FOR -
   SELECT Store_ID, Store_Name, City FROM Stores
IF SQLCODE NE 0
   THEN SIGNAL dclerror 'SQLERRM'
SQL OPEN geolabels
IF SQLCODE NE 0
   THEN SIGNAL operror 'SQLERRM' 

SQL PREPARE

SQL PREPAREコマンドは、後でプログラム内でSQL EXECUTEを使用して実行するSQL文を、同じプログラム内でプリコンパイルします。通常、SQL PREPAREは、何度も実行されるSQL文、特にOLAP DML入力式を含むINSERT、UPDATE、DELETEなどの文の処理を最適化するためにプログラム内で使用されます。

構文

SQL PREPARE statement-name FROM sql-statement [insert-options]

パラメータ

statement-name

sql-statementから生成された実行コードに付ける名前。statement-nameは、別のSQL PREPARE文を発行するのみで再定義できます。

sql-statement

実行効率を高めるためにプリコンパイルするSQL文。プログラムのコンパイル時にアンパサンド置換や未定義の変数を含むことはできません。

insert-options

次のオプションは、sql-statementINSERT文である場合に使用できます。

DIRECT=YES|NOでは、ダイレクト・パスINSERTを実行するかどうかを指定します。このオプションは、INSERT文のvalues句のすぐ後に最初に指定する必要があります。

YESに設定すると、ダイレクト・パスINSERTが実行されます。ダイレクト・パスINSERTを使用すると、INSERT操作時のパフォーマンスが向上します(これは、Oracleのダイレクト・パス・ローダー・ユーティリティのSQL*Loaderと同様の機能です)。 

デフォルト値はNOで、通常のINSERTが実行されます。

NOLOG=YES|NOは、ログを記録するかどうかを指定します。YESに設定すると、REDO情報がREDOログ・ファイルに記録されないため、ロード時間が速くなります。デフォルト値はNOで、ロギング・モードを指定します。

PARTITION=(sub)partition-nameは、名前付きパーティションまたはサブパーティションに関連するセグメントのみをロックするように指定します。このオプションを指定すると、同じ表の関係のないセグメントに別のセッションからデータを挿入できます。このオプションを指定しない場合(デフォルト)は、他のセッションから同じ表にデータを挿入できません。

使用上の注意

ダイレクト・パスINSERTの使用

ダイレクト・パスINSERTを実行すると、データは、バッファ・キャッシュを経由せず直接データ・ファイルに書き込まれます。既存データの空き領域は再利用されないため、挿入データは表の既存データの後ろに追加されます。

ダイレクト・パスINSERT使用時の制約

ダイレクト・パスINSERTには、いくつかの制約が適用されます。OLAP DMLを使用してダイレクト・パスINSERTを実行する場合、INSERTを正常に実行するには、ダイレクト・パスINSERTを発行するセッションのトランザクションをコミットする必要があります。(トランザクションは、SQLまたはOLAP DML COMMITを使用してコミットできます。)

さらに、SQLでダイレクト・パスINSERTを使用する際に適用される次の一般的な制約は、OLAP DML PREPARE文によるダイレクト・パスINSERTのプリコンパイルにも適用されます。

  • ターゲット表は、索引編成およびクラスタ化ができない。

  • ターゲット表には、オブジェクト型列およびLOB列を含むことができない。

  • ターゲット表には、トリガーおよび参照整合性制約を定義できない。

ダイレクト・パスINSERTを使用する際の制約の詳細は、『Oracle Database SQL言語リファレンス』INSERT文の説明を参照してください。

ダイレクト・パスINSERTによるデータ型の変換

次の表に、ダイレクト・パスINSERTの実行時に自動的に変換されるデータ型を示します。

表10-11 ダイレクト・パスINSERTによるデータ型の自動変換

Oracle RDBMS Oracle OLAP DML

CHAR(n)、VARCHAR(n)

TEXT

LONG

WIDEオプションを持つTEXT

CHAR(8)、VARCHAR(8)

ID

DATE

DATE

NUMBER(x,x)

DECIMAL (SHORTDECIMAL)

INTEGER (またはNUMBER(38))

INTEGER (SHORTINTEGER)

NUMBER(1)

BOOLEAN

DATEデータ型の列へのOLAPテキスト・データの挿入

Oracle OLAPのテキスト・データをDATEデータ型の列に挿入する場合は、デフォルトの日付書式であるDD MMM YYを使用する必要があります。セパレータとして、スラッシュ(/)、ハイフン(-)または空白を使用できます。データが異なる書式の場合、SQL INSERT文でOracle TO_DATEファンクションを使用できます。

CLOB列またはNCLOB列への大きなテキスト値の挿入

アナリティック・ワークスペースから2KBを超えるテキスト・データをCLOBまたはNCLOB列に挿入するには、OLAP DML入力式の名前の前にWIDEキーワードを使用します。OLAP DML入力式のデータ型がTEXTである場合、ターゲットのデータ型はCLOBです。入力式のデータ型がNTEXTである場合、ターゲットのデータ型はNCLOBです。

次に、WIDEキーワードを持つOLAP DML入力式の構文を示します。この例は、例10-146を参照してください。

:WIDE input-expression

この例は、例10-146を参照してください。

ターゲット表は、次のガイドラインに従う必要があります。

  • CLOBとNCLOB列の数と組合せが自由

  • LONG列がない

RDBMSでは、大きなデータ型にいくつかの制約があります。Oracle OLAPは、これらの制約に違反してもエラーを通知しません。ただし、予期しない結果になることがあります。ラージ・データ型に関する制約については、『Oracleアプリケーション開発者ガイド』を参照してください。

文字数の計算

Oracle OLAP変数からデータベース表に送信される文字数は、次の計算式で計算できます。

NUMCHARS(variable) + 2 * (NUMLINES(variable) - 1)

この計算式は、Oracle OLAPがデータベースにテキストを渡す際に行間に挿入する余分な改行およびライン・フィードをカウントします。

例10-144 FORループのプリコンパイル

salespersonディメンションからリレーショナル表に営業社員を自動的に追加する場合、FORループ内にSQL INSERT文を含むプログラムを記述できます。

FOR salesperson
   SQL INSERT INTO Sales VALUES (:Salesperson, :Dollars) DIRECT=YES

OLAP DML入力式が含まれる文をFORループなどで何度も実行する場合、SQL文を最初にプリコンパイルしておくと効率的にその文を実行できます。INSERT文はPREPARE文の一部になります。

SQL PREPARE s1 FROM INSERT INTO Sales VALUES -
   (:Salesperson, :Dollars) DIRECT=YES
FOR Salesperson
   DO
      SQL EXECUTE s1
      IF SQLCODE NE 0
      THEN BREAK
   DOEND

例10-145 表の更新

次の例は、アナリティック・ワークスペースに格納されているデータを使用した表の単純な更新を示します。marketディメンションは、FORループで一度に1つの値に制限されます。SQL句のWHERE S.Market=:marketは、そのmarketの行にある売上値を変更する値として指定します。

FOR market
   SQL UPDATE Mkt SET Sales=:Mkt.Sales WHERE S.Market=:market

前の例のINSERT文と同様に、UPDATE文はPREPARE文で使用し、ACROSS文またはFORループで実行します。

SQL PREPARE s2 FROM UPDATE mkt -
   SET Sales=:mkt.sales WHERE s.market=:market
ACROSS market DO 'SQL EXECUTE s1'

例10-146 WIDEキーワードの使用

次の両方の文で、WIDEはターゲット値について、var1TEXTの場合はCLOBvar1NTEXTの場合はNCLOBであることを示します。

SQL INSERT INTO CLOB_TEST values (:dim1 :WIDE var1)
SQL UPDATE CLOB_TEXT SET clob_col = :WIDE var1 WHERE key = 1

SQL PROCEDURE

SQL PROCEDUREコマンドは、RDBMSに格納されているプロシージャを実行します。

注意:

OLAP DMLを使用して、SQLストアド・プロシージャも作成できます。参照:

構文

SQL PROCEDURE procedure-name (parameters)

ここで、parametersは次のいずれか1つ以上で、複数の場合はカンマで区切ります。

  • sql-parameter
  • :dml-parameter

パラメータ

procedure-name

SQLストアド・プロシージャの名前。

sql-parameter

RDBMSの変数の名前。

:dml-parameter

OLAP DML式(OLAP DML変数など)。OLAP DML SQL文でのOLAP DML式の使用方法については、OLAP DML SQL文でのOLAP DML式の使用を参照してください。

使用上の注意

OLAP DMLによるSQLプロシージャの作成

OLAP DMLを使用してストアド・プロシージャを作成するには、SQL CREATE PROCEDURE文を引数としたOLAP DMLのSQL文を発行します。OLAP DMLのSQL文内でCREATE PROCEDUREを引数としてコーディングする構文は、本来のSQLでCREATE PROCEDUREをコーディングする構文と若干異なります。OLAP DML文の引数としてコーディングする場合、終端文字としてセミコロンのかわりにティルド(~)を、また代入文では1つではなく2つのコロンを使用します。例10-147を参照してください。

OLAP DMLでSQLプロシージャをコールする際の制約

OLAP DML SQL PROCEDURE文でコールされるストアド・プロシージャには、出力変数またはトランザクションを含むことができません。

例10-147 ストアド・プロシージャの作成

次の例は、new_productsというプロシージャを作成する構文を示します。

SQL CREATE OR REPLACE PROCEDURE new_products -
   (id CHAR, name CHAR, cost NUMBER) AS -
      price NUMBER~ -
   BEGIN -
      price ::= cost * 2.5~ -
      INSERT INTO products -
         VALUES(id, name, price)~ -
   END~

例10-148 ストアド・プロシージャの実行

次のFORループは、new_productsというSQLストアド・プロシージャを実行し、ディメンションおよび変数に格納されたデータをリレーショナル表に挿入します。この例で、prodはOracle OLAPディメンション、labels.pおよびcost.pprodでディメンション化された変数です。

FOR prod
   DO
      SQL PROCEDURE new_products(:prod, :labels.p, :cost.p)
      IF SQLCODE NE 0
         THEN BREAK
   DOEND 

SQL SELECT

SQL SELECTコマンドは暗黙カーソルを使用してリレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーします。暗黙カーソルを使用して、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするには、SQL SELECTコマンドを使用します。また、アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピーで説明したように、OLAP DMLコマンドで明示カーソルを使用してデータをコピーすることも可能です。

構文

SQL SELECT expressions FROM tables -

    [WHERE predicates] [GROUP BY expressions] -     [ORDER BY expressions] [HAVING predicates] -     INTO :targets... [THEN action-statements...]

ここで、targetsは、次のいずれか1つ以上です。

  • [MATCH] dimension|surrogate
  • APPEND [positiondimension
  • ASSIGN surrogate
  • variable|qualified data reference|relation|composite

パラメータ

SELECT expressions FROM tables-
 [WHERE predicates] [GROUP BY expressions] -
[ORDER BY expressions] [HAVING predicates]

カーソルに関連付けるデータを特定するSQL SELECT文。SQL SELECT文の構文については、『Oracle Database SQL言語リファレンス』を参照してください。

targets

リレーショナル表から取得したデータを格納するアナリティック・ワークスペース・オブジェクトを特定します。このターゲット・アナリティック・ワークスペース・オブジェクトのリストは、その数とデータ型がSELECT文で指定された表の列のリストに対応している必要があります。変数、修飾データ参照、リレーション、ディメンションまたはコンポジットをターゲットにできます。

注意:

アナリティック・ワークスペース・オブジェクトを指定する順序は、ディメンション・ステータスに影響します。Oracle OLAPは、ディメンション値ごとに、ディメンションのステータスをフェッチされた値に一時的に制限します。値が次に割り当てられるアナリティック・ワークスペース・オブジェクトは、この一時的なステータスに従います。ターゲット・アナリティック・ワークスペース・オブジェクトにする結合ディメンションターゲット・アナリティック・ワークスペース・オブジェクトにするコンポジット・ディメンションを参照してください。

ターゲットには、前にコロンを付ける必要があります。ターゲットがディメンションの場合、MATCHおよびAPPENDキーワードでディメンションの処理を指定できますが、この場合、コロンはキーワードの前に付けます。

ヒント:

ANDおよびORは、OLAP DML構文とSQL WHERE句のどちらでも使用できるため、Oracle OLAPがOLAP DML入力式の末尾を認識できるようにtargets句を記述します。

[MATCH] {dimension|surrogate}

(デフォルト)Oracle OLAPは、ターゲットのディメンションやサロゲートに対してディメンション・メンテナンスを実行しません。ディメンション化されたオブジェクトにフェッチされるデータの整列では、受け取る値を使用します。リレーショナル・データベースから受け取る値が、ディメンションまたはサロゲートの値に一致しない場合、エラーが通知されます。

APPEND [position] dimension

Oracle OLAPは、新しい値をディメンションに追加して、ターゲットのディメンションにディメンション・メンテナンスを実行します。ディメンション化されたオブジェクトにフェッチされるデータの整列には、新旧両方のディメンション値を使用します。デフォルトでは、新しい値がディメンションまたはサロゲートの最後に追加されます。また、アクション文でディメンション値を処理する方法は、positionを使用しても制御できます。

ASSIGN surrogate

指定されたサロゲートに値を割り当てます。

THEN action-statements

オプションでTHEN句を使用すると、データの行をフェッチしてアナリティック・ワークスペース・オブジェクトに割り当てるたびに実行するaction-statementをいくつでも指定できます。action-statementは、次のいずれかです。

  • assignment-statement
  • IF-statement
  • SELECT-statement
  • ACROSS-statementaction-statement
  • <action-statement-group>

action-statementの構文の詳細は、SQL IMPORTコマンドを参照してください。

使用上の注意

SQL SELECTに関する一般的な制約

SQL SELECT文にアンパサンド置換を含めることはできません。

コピーの最適化

値をリレーショナル表から多次元の入力変数にコピーする場合は、SQL SELECT文の引数select-statementのORDER BY句でディメンションに対応する列を指定するとき、最も変化の遅いディメンションを最初に指定します。これにより、パフォーマンスが最適化されます。

例10-149 単純な選択

たとえば、次の記述を持つsalesという名前のリレーショナル表があるとします。

PROD_ID                     NOT NULL NUMBER(6)
CUST_ID                     NOT NULL NUMBER
TIME_ID                     NOT NULL DATE
CHANNEL_ID                  NOT NULL CHAR(1)
PROMO_ID                    NOT NULL NUMBER(6)
QUANTITY_SOLD               NOT NULL NUMBER(3)
AMOUNT_SOLD                 NOT NULL NUMBER(10,2)

また、アナリティック・ワークスペースに、対応するアナリティック・ワークスペース・オブジェクトに関する次の定義があるとします。

DEFINE aw_prod_id DIMENSION NUMBER (6)
DEFINE aw_cust_id DIMENSION NUMBER (6) 
DEFINE aw_date DIMENSION TEXT
DEFINE aw_channel_id DIMENSION TEXT
DEFINE aw_promo_id DIMENSION NUMBER (6)
DEFINE aw_sales_dims COMPOSITE <aw_prod_id aw_cust_id -
     aw_channel_id aw_promo_id>
DEFINE aw_sales_quantity_sold VARIABLE NUMBER (3) <aw_date aw_sales_dims -
     <aw_prod_id aw_cust_id aw_date aw_channel_id aw_promo_id>>
DEFINE aw_sales_amount_sold VARIABLE NUMBER (10,2) <aw_date aw_sales_dims -
     <aw_prod_id aw_cust_id aw_date aw_channel_id aw_promo_id>>

製品415のデータをsales表からアナリティック・ワークスペース・オブジェクトにコピーするには、次の文をOLAP Worksheetで実行します。

SQL SELECT prod_id cust_id time_id channel_id promo_id quantity_sold -
amount_sold WHERE prod_id = 415 -
INTO :aw_prod_id, :aw_cust_id, :aw_date,  -
:aw_channel_id, :aw_promo_id, :aw_sales_quantity_sold, :aw_sales_amount_sold 

STATUS

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

1つ以上のディメンション、ディメンション・サロゲート、値セット名を指定する場合、Oracle OLAPはそれらのオブジェクトのみのステータスを生成します。AWキーワードを使用してアタッチされているアナリティック・ワークスペースの名前を指定すると、Oracle OLAPはそのアナリティック・ワークスペースのすべてのディメンションのステータスを生成します。引数を指定しない場合、STATUSは、現行アナリティック・ワークスペースにあるすべてのディメンション(ディメンション・サロゲートおよび値セットではない)の現行のステータスを生成します。ただし、STATUSは、STATUS NAMEを指定しないかぎり、NAMEディメンションのステータスを表示しません。

ヒント:

表示する幅または位置を制御する場合は、STATUSではなくSTATLISTを使用します。

戻り値

TEXT

構文

STATUS name... | AW [workspace-name]

パラメータ

name

アナリティック・ワークスペースのディメンションまたは値セットの名前。変数、計算式、リレーション、名前付きコンポジットなど、ディメンション化されたアナリティック・ワークスペース・オブジェクトの名前を指定することもできます。この場合、ディメンションが名前のないコンポジットに含まれないかぎり、nameの各ディメンションのステータスが生成されます。

AW [workspace-name]

workspace-nameに含まれるすべてのディメンションのステータスをSTATUSが生成するように指定します。workspace-nameは、アナリティック・ワークスペースの名前です。

使用上の注意

STATUSの出力

ディメンションのすべての値が現行のステータスまたは値セットに元の順序で存在する場合、STATUSはALLを表示します。元の順序で3つ以上の値が並んでいる場合、STATUSはvalue-1 TO value-nのように省略します。ただし、NAMEディメンションの場合、STATUSは3つ以上の値が並んでいても省略しません。

オブジェクトに値がない場合のSTATUS

ディメンション、ディメンション・サロゲートまたは値セットに値がない場合(たとえば、定義したばかりのオブジェクトでまだ値を入力していないなど)、STATUSはそのディメンション、ディメンション・サロゲートまたは値セットに対してNULLを返します。オブジェクトが定義されていないアナリティック・ワークスペースの場合、STATUSは「There are no dimensions in your current analytic workspace.」というメッセージを返します。

例10-150 ディメンションの現行のステータスの検出

STATUSを使用して、ディメンションmonthおよびdistrictの現行のステータスを生成します。

次の文

STATUS month district

によって、次の出力が生成されます。

The current status of MONTH is:
Jan95 TO Dec96
The current status of DISTRICT is:
Boston, Chicago, Denver

例10-151 変数のディメンションのステータスの検出

STATUSを使用して、変数salesのすべてのディメンションの現行のステータスを生成します。

次の文

STATUS sales

によって、次の出力が生成されます。

The current status of MONTH is:
Jan95 TO Dec96
The current status of PRODUCT is:
ALL
The current status of DISTRICT is:
Boston, Chicago, Denver 

STDHDR

STDHDRプログラムは、レポート出力の各ページの上部に、Oracle OLAP標準ヘッダーを生成するプログラムです。

現行のページの標準ヘッダーは、2つの行で構成されています。最初の行には、左側に日付と時刻が、右側にページ番号が含まれます。2行目は空白です。

ヘッダー出力は、現行の出力ファイルに送信されます。

構文

STDHDR

使用上の注意

LSIZEの設定

LSIZEは、STDHDRを使用する前に最低でも値を29に設定する必要があります。設定しない場合は、ヘッダーが完全に表示されません。26より小さい値を設定すると、エラーが生成されます。LSIZEのデフォルトは、80です。

カスタム・ヘッダーの作成

PAGINGがYESに設定されている場合、Oracle OLAPは標準ヘッダーを出力の各ページの上部に自動的に挿入します。別のヘッダーを使用するには、ヘッダーを生成するプログラムを作成し、PAGEPRGオプションをそのプログラムの名前に設定する必要があります。標準ヘッダーに戻すには、PAGEPRGを'STDHDR'に設定します。(詳細は、PAGEPRGオプションを参照してください。)

ヘッダー・プログラムにおけるSTDHDRの使用

PAGEPRGを使用してヘッダー・プログラムを指定する場合でも、プログラムの一部としてSTDHDRを実行することにより、カスタム・ヘッダーで標準ヘッダーを使用できます。通常、STDHDRはカスタマイズしたヘッダーを生成する文の前に配置します。例10-152を参照してください。

STDHDRプログラム

STDHDRでは、次のようにHEADINGコマンドとCONVERTコマンドを使用します。

HEADING L W 8 <CONVERT(TODAY, TEXT,'<DD><MTXTL><YY>') TOD> -
        R W LSIZE-25 'Page ' L W 6 D 0 PAGENUM
BLANK

例10-152 レポートのカスタム・ヘッダーの作成

レポートの各ページに、標準ヘッダーとカスタマイズしたタイトル「Annual Sales Report」を含めるとします。このために、report.headという小さいPAGEPRGプログラムを定義します。

DEFINE report.head PROGRAM
PROGRAM
CALL STDHDR
HEADING WIDTH LSIZE CENTER 'Annual Sales Report'
BLANK
END

レポート・プログラムで、PAGINGをYESに設定し、PAGEPRGオプションを'REPORT.HEAD'に設定することにより改ページごとにこのプログラムを実行するように指定します(詳細は、PAGEPRGオプションを参照)。レポートを実行すると、標準ヘッダーとカスタム・ヘッダーの次の組合せが各ページに生成されます。

18Jan97  15:05:16                                   PAGE 1
 
                   Annual Sales Report

SWITCHコマンド

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

注意:

単独のSWITCHコマンドと、式の条件演算子として使用されるSWITCHを混同しないでください。SWITCH式を参照してください。

構文

SWITCH control-expression    DO       CASE case-expression1:           statement 1.1            ...           statement 1.n            BREAK       CASE case-expression2:            statement 2.1            ...            statement 2.n            BREAK       [DEFAULT:            statement n.1            ...            statement n.n            BREAK]    DOEND

パラメータ

control-expression

control-expression引数は、SWITCH文によりプログラム制御を移行する先のCASEラベルを指定する引数です。SWITCH文が実行されると、control-expressionが評価され、プログラムの各CASEラベル式と比較されます。一致が見つかると、制御はそのCASEラベルに移行されます。一致が見つからない場合、制御はDEFAULTラベル(存在する場合)またはSWITCHのDOENDに続く文に移行されます。

CASE case-expression1, CASE case-expression2, ...

その式(case-expression1case-expression2、...)により、処理を行う複数のCASEを指定するCASEラベルです。control-expressioncase-expressionに一致する場合、プログラム制御はそのCASEラベルに移行されます。CASEラベル式はプログラムの実行時に、記述されている順序で、一致が見つかるまで評価されます。

DEFAULTラベルはオプションです。case-expressionsに一致するcontrol-expressionがない場合に制御が移行される、特別なCASEを指定します。DEFAULTを省略し、一致が見つからない場合は、制御はSWITCHのDOENDに続く文に移行されます。

SWITCH文のすべてのCASEラベル(DEFAULTを含む)は、SWITCH文の直後のDOとDOENDの間に含める必要があります。case-expressionはラベルであるため、末尾にコロン(:)を付ける必要があります。特定のCASEで実行する文は、ラベルの後に記述する必要があります。通常、CASEの最後の文はBREAKにしますが、これは、SWITCHからの制御を、SWITCHのDOENDに続く文に移行します。

CASEの終わりでBREAK(またはRETURN、SIGNALなど)を省略した場合、プログラムは次のCASEの文を同様に実行し始めます。通常、このような処理は必要ありません。しかし、2つのCASEで同じ文を実行する必要がある場合は、文の前に両方のCASEラベルを配置することによりこの処理方法を活用できます。

使用上の注意

control-expressionおよびcase-expression

SWITCH control-expressionには任意のデータ型を指定でき、case-expressionsも同様です。様々なcase-expressionsに、種々のデータ型を指定できます。control-expressionまたはcase-expressionとしてディメンションの名前(リテラル、非引用テキスト式として)を指定する場合、Oracle OLAPは一致を検索する際に、ディメンション名ではなくディメンションの現行のステータス・リストにある最初の値を使用します。ディメンションのステータス・リストに値がない場合、Oracle OLAPは値NAを使用します。NAcontrol-expressionは、最初のNAcase-expressionに一致します。

SWITCHでのアンパサンド置換

SWITCH control-expressionまたはCASEラベルcase-expressionでは、アンパサンド置換を使用しないようにします。アンパサンドは予測不可能な結果を生成し、その結果は多くの場合に適切ではありません。

複数のSWITCHコマンド

プログラムには、複数のSWITCH文を含めることができます。さらに、SWITCHコマンドをネストすることもできます。プログラムに複数のSWITCHコマンドが含まれている場合、SWITCHコマンドがネストされている場合でも、各コマンドにそれぞれのDEFAULTラベルを指定できます。

制御の移行

BREAKは、SWITCH文内でのプログラム制御の移行に一般的に使用される文ですが、他にも同じ目的で使用できる文があります。CONTINUEGOTORETURNおよびSIGNALなどの文も使用できます。SWITCH文がFORまたはWHILEループ内にある場合は、CONTINUEのみを使用できることに注意してください。それらの文や、DO ... DOENDの項も参照してください。

例10-153 プログラムにおけるSWITCHを使用した複数パスへの分岐

次のプログラム行では、複数タイプのレポートの中から1つのタイプのレポートが生成されます。SWITCH文の前で、プログラムはユーザーが必要とするレポートのタイプを判断し、変数userchoiceMarketまたはFinanceの値を配置します。プログラムは、その名前に一致するCASEラベルに切り替わり、レポートを生成します。レポートが完了すると、BREAK文によって制御がDOENDの後のクリーンアップ・セクションに移行されます。

SWITCH userchoice
    DO
         CASE 'Market':
            ...
            BREAK
         CASE 'Finance':
            ...
            BREAK
         DEFAULT:
            ...
            BREAK
    DOEND
cleanup:
...

TEMPSTAT

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

構文

TEMPSTAT dimension...      statement block

パラメータ

dimension(s)

FORループまたはREPORT文によって生成される自動ループ内でそのステータスが一時的に変更される1つ以上のディメンション。

statement block

ディメンションのステータスを変更する1つ以上の文。一時的なステータスの下で複数の文を実行するには、それらをDO ... DOENDで囲みます。

使用上の注意

TEMPSTAT文のネスト

TEMPSTATコマンドは、一方のコマンド内にもう一方のコマンドをネストでき、ネストされたTEMPSTATコマンド内では同じディメンションを繰り返すことができます。

TEMPSTATの配置

REPORTがループ処理する間にディメンションのステータスを変更する場合、TEMPSTAT文は、REPORT文の前ではなくそのREPORTのループ内に配置する必要があります。たとえば、monthのステータスを変更するmonthly_salesというユーザー定義ファンクションを作成し、monthly_salesmonthをループ処理するREPORT文の一部であるとします。この場合、ステータスの変更が行われるように、TEMPSTAT文をmonthly_salesファンクション内に配置する必要があります。(TEMPSTATEはmonthly_sales内に配置する必要があり、これは、REPORT文がMONTHをループ処理するFORループ内のTEMPSTAT DO/DOENDの間にある場合でも同様です。)

POPおよびPOPLEVELコマンド

TEMPSTAT文ブロックのDO/DOENDの間では、対応するPUSH文がブロックにないかぎり、POP文を使用してブロックのTEMPSTATで保護されているディメンションをポップすることはできません。

同様にTEMPSTAT文ブロックのDO/DOENDの間では、次の2つの条件のいずれかが満たされないかぎり、POPLEVEL文を使用してブロックのTEMPSTATが保護しているディメンションをポップできません。1つは、対応するPUSHLEVEL文もブロックにある場合、もう1つはPUSHLEVEL文の指定以降にディメンションのプッシュのみがブロック内にある場合です。

LIMITおよびCONTEXTコマンドのみの使用

TEMPSTAT文のDO/DOENDの間において、ディメンションのループ処理の中でディメンションのステータスを変更する唯一の方法は、LIMITまたはCONTEXT APPLYコマンドを使用することです。(詳細はLIMITコマンドおよびCONTEXTコマンドを参照してください。)POPまたはPOPLEVELを使用して、ディメンションのステータスを変更することはできません。さらに、値の追加によってもディメンションのステータスがALLに変更されるため、ディメンションに値を追加する演算を実行することもできません。たとえば、MAINTAIN ADD、FILEREAD APPENDおよびIMPORT(EIFファイルの新しい値を使用)は、ディメンションに値を追加します。

FORループ内のTEMPSTAT

次のプログラムの抜粋では、TEMPSTAT文を使用してFOR marketループ内のmarketディメンションが制限されています。

FOR market
DO
 TEMPSTAT market
  DO
   LIMIT market TO CHILDREN USING market.market
   REPORT market
  DOEND
DOEND

TRACE

TRACEコマンドは、個々のプログラム、モデルおよび計算式の実行中に、これらの開始、終了および実行に関する情報を現行の出力ファイルに記録するかどうかを指定します。

  • プログラムとモデルについては、各コード行の開始、終了および実行をトレースし、PRGTRACEまたはMODTRACEオプションがYESに設定されている場合と同様の出力を生成します。

  • 計算式については、開始時に名前とディメンション値を、また終了時には戻り値を出力します。

構文

TRACE [?|{object-name|*} [OFF] [begin-arguments] [end-arguments] [ TRACELINES | NOTRACELINES]] ここで、begin-argumentsには次の構文が必要です: IN [ARGS | NOARGS] end-arguments には次の構文が必要です: OUT [VALUE | NOVALUE]

パラメータ

?

?(疑問符)は、現行のTRACEリストを表示しますが、このリストには、実行時にトレースする各プログラム、モデルおよび計算式の名前が含まれます。また、グローバル・トレースがある場合は、TRACE ALLが含まれます。リストでは、各プログラム、モデルおよび計算式、さらにTRACE ALLに対して、現行のTRACE設定(begin-argumentsおよびend-argumentsの値)が表示されます。

object_name

トレースするプログラム、モデルまたは計算式の修飾されていない名前。アタッチされているデータベースに存在しない名前でも、プログラム、モデルまたは計算式の名前を指定できます。OFFキーワードを指定しないと、この引数によってオブジェクト固有のトレースが有効化され、指定したプログラム、モデルまたは計算式が実行されると、TRACEがこれらをトレースします。プログラム、モデルまたは計算式のTRACE設定を変更するために、これらのオブジェクト固有のトレースは複数回有効化できます。OFFキーワードを指定すると、この引数によってオブジェクト固有のトレースが無効化されます。

*[OFF]

*(アスタリスク)は、プログラムとモデルでのみ使用します。

  • OFFキーワードを指定しないかぎり、*(アスタリスク)によりTRACEリストにTRACE ALLが追加され、グローバル・トレースが有効になります。これは、実行するすべてのプログラムおよびモデル(express.dbの一部であるLISTNAMESなどのプログラムも含む)の実行をトレースすることを意味します。オブジェクト固有のトレースとグローバル・トレースの両方を指定した場合、指定したプログラムまたはモデルの実行時には、オブジェクト固有のトレース設定が優先されます。

  • OFFキーワードを指定すると、*(アスタリスク)によりTRACEリストからすべてのプログラム名、モデル名およびTRACE ALLが削除され、リストが空になります。これにより、グローバル・トレースが無効化されます。

ARGS
NOARGS

ARGSおよびNOARGSは、プログラムと計算式でのみ使用します。これらのキーワードは、プログラムの入力時または計算式のディメンション値の入力時に、TRACEが引数の値を表示する必要があるのかどうかを示します。デフォルトはARGSです。

VALUE
NOVALUE

VALUEおよびNOVALUEは、プログラムでのみ使用します。これらのキーワードは、プログラムの最後の行を実行した後にプログラムの戻り値を表示するかどうかを示します。戻り値のないプログラムの場合、値は表示されません。デフォルトはVALUEです。

TRACELINES
NOTRACELINES

TRACELINESおよびNOTRACELINESは、プログラムとモデルでのみ使用します。これらのキーワードは、プログラムまたはモデルの行を出力するかどうかを示します。デフォルトはTRACELINESです。

使用上の注意

ネストしたプログラムおよびモデル

ネストしたプログラム(1つのプログラムが別のプログラムをコールする)を実行する場合で、さらにすべてのネストしたプログラムをトレースする場合、TRACEはネストされたレベルをトラッキングします。プログラムの1つがモデルをコールする場合は、モデルもトレースでき、TRACEはネストしたプログラムのスタック内にあるモデルもトラッキングします。

TRACE設定の変更

プログラムやモデルのTRACE設定を変更するには、新しいTRACEコマンドを実行します。設定のうち1つだけを変更した場合、他の設定は以前の設定値のまま維持されます。

モデルのトレース

モデル内の連立方程式のブロックが指定した反復回数内で解決できない場合は、エラーが発生します。このような場合にTRACEが実行するアクションは、MODERRORオプションの値で決まります。

TRACKPRG

TRACKPRGコマンドは、トラッキングをオンにしている間に実行されるすべてのプログラムのパフォーマンス・コストを追跡するコマンドです。TRACKPRGによって意味のある情報を得るためには、Oracle OLAPで実行するセッションは1つのみにする必要があります。さらに、ホスト・コンピュータで多くのプロセスが起動されるほど、TRACKPRGの結果の精度が低下します。

TRACKPRGをオンにして、追跡するプログラムを実行し、再度TRACKPRGを使用して結果を取得します。各プログラムが実行されるたびに、TRACKPRGはそのコスト・データを1つのエントリとして、そのトラッキング・リストに格納します。別のプログラムを実行すると、新しいエントリがリストに追加され、Oracle OLAPメモリー(未使用の記憶域)に保持されます。

プログラムまたはコードの行は、実行に時間がかかる場合はパフォーマンス・コストが高いとみなされます。TRACKPRGで相対的にコストが高いプログラムを特定し、さらにMONITOR文を使用してそのプログラム内で所要時間の長い行を特定します。必要な場合は、両方のコマンドを同時に使用できます。

構文

TRACKPRG {ON|OFF|file|INIT}

ここで、fileの構文は次のとおりです。

  • FILE [APPEND] [file-name]

パラメータ

ON

実行するプログラムの検索を開始して、トラッキング・リストにタイミング・データを収集できるようにします。(トラッキングがすでにオンになっている場合は、中断せずに現行のトラッキング処理を継続し、トラッキングがオフになっている場合は間隔を置いて再開します。)

OFF

プログラムのトラッキングを停止し、現在トラッキング・リストにあるすべてのタイミング・データを固定します。これによりすぐに、またはセッションの後半で、リストを現行の出力ファイルまたはテキスト・ファイルに送信できます。

FILE

トラッキング・リストを送信する場所を指定します。TRACKPRG FILEはトラッキング・リストには影響を与えないため、異なる送信先に同じリストを繰返し送信できます。

APPEND

Oracle OLAPがトラッキング・リストを、file-nameにより示されるファイルと置き換えるのではなく、その内容に追加するように指定します。

file-name

Oracle OLAPがデータを送信する先のテキスト式。そのファイルがカレント・ディレクトリにない場合、ファイルの名前にディレクトリ・オブジェクトの名前を含める必要があります。

注意:

ディレクトリ・オブジェクトはデータベースで定義され、ディレクトリおよびディレクトリ内のファイルへのアクセスを制御します。CDA文を使用して、カレント・ディレクトリ・オブジェクトを特定および指定できます。使用するデータベース・ユーザー名で読取りおよび書込み可能なファイルがあるディレクトリ・オブジェクトへのアクセス権については、Oracle DBAに問い合せてください。

file-nameを省略すると、Oracle OLAPは現在トラッキング・リストにあるタイミング・データを現行の出力ファイルに送信します。

INIT

現行のトラッキング・リストにあるタイミング・データを廃棄し、そのリストに使用されていたOracle OLAPメモリーを解放します(メモリーを他の目的で使用する場合に役立ちます)。さらに、トラッキングがオンになっている場合は、プログラムの実行の待機を再開し、それらのデータを完全に新しいトラッキング・リストに収集できるようになります。

使用上の注意

単一の実行

トラッキング・リストの各エントリ(つまり、行)には、単一のプログラムの単一の実行に関する情報が記録されます。

コールの深さ

各エントリには、現行のプログラムに対するコール(存在する場合)の深さ、つまり現行の行で報告されたプログラムに対して行われたプログラム・コールの数が記録されます。TRACKPRGの出力では、コールの深さはプログラム名のインデントにより示されます。TRACKPRGは、インデントされた各プログラムについて、そのプログラムに対するコールを行ったプログラムの名前もエントリの終わりに記録します。

タイミング・データのタイプ

各エントリで、TRACKPRGは2つのタイプのタイミング・データを記録します。

  • 限定的コスト -- プログラムによってコールされた他のプログラムで消費された時間を除く、そのプログラムで消費された時間

  • 包括的コスト -- プログラムによってコールされた他のプログラムで消費された時間を含む、そのプログラムで消費された時間

これにより、両方のタイプのコストに関するレポートを生成するオプションを選択できます。

エントリのセクション

TRACKPRGの出力では、各エントリ(行)は次の4つのセクションに分けられます。

  • プログラム名: 文字の列1から38

  • 限定的な時間: 列39から49

  • 包括的な時間: 列50から60

  • コール側プログラムの名前: 列61から77

(MAINプログラムの)TRACKPRG出力のサンプルは次のとおりです。参照用の列番号が付いています。

1234567890123456789012345678901234567890123456789012345678901234567890
 
MAIN                                  39.6198425 225.551453
 COMM                                  43.793808  185.93161 MAIN
  _C.SYS.INFO                         .112533569 .112533569 COMM
  _C.SYS.INFO                         .087173462 .087173462 COMM
  _C.MAIN                             61.414505  141.938095 COMM
   _C.CON                             66.7147064 80.5235901 _C.MAIN
    _C.SYS.DORETURN                   .032287598 .032287598 _C.CON

TRACKREPORTプログラム

Oracle OLAPのレポート機能を使用して、TRACKPRGによって作成されるテキスト・ファイルのタイミング・データからレポートを生成する場合、TRACKREPORTプログラムを使用できます。構文は次のとおりです。

TRACKREPORT textfile-name

textfile-name引数は、レポート作成の元となる、TRACKPRGにより作成されたテキスト・ファイルのファイル名です。TRACKREPORTは、FILEREAD文を使用してデータをOracle OLAP変数に読み込んだ後、Oracle OLAPのレポート機能を使用して次のサンプルのようなレポートを生成します。

                     Exclusive  Inclusive  Number of 
    Program name        cost       cost      calls   
____________________ __________ __________ __________
 
COMM                 43.793808   185.93161          1
MAIN                 39.6198425 225.551453          1
_C.CON               66.7147064 80.5235901          1
_C.ENV.PUTOPTS       1.15296936 1.15296936          1
_C.ENV.XLATEIN       6.32765198 6.32765198          1
_C.MAIN               61.414505 141.938095          1
_C.SYS.DORETURN      .032287598 .032287598          1
_C.SYS.INFO          .289932251 .289932251          3
_C.SYS.NOF10         .038269043 .038269043          1
_CONNECT              5.3609314 6.16748047          1
_CONNNONE            .806549072 .806549072          1

TRACKPRGファイルからのデータをさらに処理する場合、モデルとしてTRACKREPORTプログラムを使用して独自のプログラムを作成できます。

対象外のサブプログラム

タイミング・データを収集しているプログラムがコールするすべてのサブプログラムについての個別のパフォーマンス・データが必要ない場合、プログラム全体で、対象外にするサブプログラムをコールする前にトラッキングをオフにし、対象とするプログラムをコールする前にトラッキングを再びオンにします。この操作は繰返し実行できます。ただし、TRACKPRGは対象外のサブプログラムを個別に追跡しないため、対象外のサブプログラムが消費する時間はプログラム全体の包括的な時間だけでなく、限定的な時間の合計にも割り当てられる点に注意してください。

非常に小さなプログラムでのTRACKPRGの使用

非常に小さいプログラムは、結果を正確に再現できないことがあります。CPUが処理を中断して他のタスクを実行すると、実行時間の合計に占めるその時間の割合が大きくなるからです。

TRACKPRGの測定単位

MONITORコマンドおよびTRACKPRGコマンドでは、実行時間を記録する単位としてミリ秒を使用します。実行時間には、I/Oの所要時間および次の文の待機時間は含まれません。

例10-154 TRCAKPRGを使用したタイミング・データの収集

この例では、mybjtプログラムとそのプログラムがコールするすべてのプログラムのタイミング・データが、mybjttim.datというファイルに収集されます。

TRACKPRG ON
mybjt
TRACKPRG OFF
TRACKPRG FILE mybjttim.dat
TRACKPRG INIT
TRACKREPORT mybjttim.dat

例10-155 INITキーワードおよびTRACKREPORTの使用

この例では、トラッキングをオンにしてprog1の実行に関するタイミング・データを収集し、データをprog1.trkという名前のファイルに送信します。その後、INITキーワードを使用して既存のトラッキング・リストを廃棄し、2番目のプログラムのデータを収集してファイルに送信できるようにします。過程の全体で、トラッキングはオンのままです。最後に、トラッキングをオフにし、INITキーワードを使用してトラッキング・リストで使用されていたメモリーを解放した後、TRACKREPORTプログラムをコールして2つのファイルに格納されたデータから生成された2つのレポートを出力します。

TRACKPRG ON
prog1
TRACKPRG FILE prog1.trk
TRACKPRG INIT
prog2
TRACKPRG FILE prog2.trk
TRACKPRG OFF
TRACKPRG INIT
TRACKREPORT prog1.trk
TRACKREPORT prog2.trk

TRAP

TRAPコマンドをOLAP DMLプログラムの内部で使用すると、プログラムにエラーが発生した場合やユーザーがプログラムを中断した場合に、プログラムの実行がラベルに分岐されます。実行がトラップ・ラベルに分岐した場合、そのトラップ・ラベルは非アクティブ化される。

関連項目:

プログラムおよびモデル内の宣言エラーがOracle OLAPによってどのように処理されるかについては、宣言エラーを参照してください。

構文

TRAP {OFF|ON errorlabel [NOPRINT|PRINT]}

パラメータ

OFF

トラップ・ラベルを非アクティブ化します。一度にアクティブ化できるトラップ・ラベルは1つのみであるため、TRAP OFFを設定する場合には、errorlabelは指定しないでください。ラベルとOFFを組み合せて指定すると、エラーが発生します。

注意:

トラップ・ラベルがあるプログラムでエラーが発生すると、実行はラベルに分岐し、トラップは非アクティブ化されます。TRAP OFF文を明示的に実行する必要はありません。したがって、実行がラベルに分岐した後でエラーが発生した場合は、同じラベルに再度分岐されることはありません。

ON errorlabel

トラップ・ラベル(errorlabel)をアクティブ化します。TRAPがアクティブになっている場合、プログラム内でエラーが発生すると実行はerrorlabelに分岐します。

errorlabel

ラベルの構成のガイドラインに従って構成された、プログラム中の他の位置にあるラベルの名前。プログラムの実行は、指定したラベルの直後の行に分岐します。

注意:

ONで指定するerrorlabelの後にはコロンを記述しないでください。ただし、プログラムの他の位置にある実際のラベルの後にはコロンを付けます。

errorlabelに対応する実際のトラップ・ラベルが同じプログラム内に存在しない場合は、エラーが発生して実行は停止します。

NOPRINT
PRINT

エラー・メッセージの出力を抑止するかどうかを指定します。NOPRINTを指定すると、エラー・メッセージは抑止されます。PRINT(デフォルト)を指定した場合は、エラー・メッセージが現行の出力ファイルに送られた後に実行がトラップ・ラベルに分岐します。OFFキーワードが指定されている場合、NOPRINTとPRINTを指定しても意味はなく、エラーが発生します。

例10-156 プログラムのエラー・トラップ

次のプログラムの抜粋では、TRAP文によって制御をラベルに移行できます。このラベルでは、オプションやディメンション・ステータスの設定値がプログラムの実行前に保持されていた値に戻り、エラーが通知されます。

PUSH month DECIMALS LSIZE PAGESIZE
TRAP ON haderror NOPRINT
LIMIT month TO LAST 1
   ...
POP month DECIMALS LSIZE PAGESIZE
RETURN
 
haderror:
POP month DECIMALS LSIZE PAGESIZE
SIGNAL ERRORNAME ERRORTEXT

例10-157 プログラム・エラー・メッセージの即時の表示

エラー・メッセージを即時に生成するには、ネストした各プログラムでTRAP文を使用しますが、NOPRINTキーワードは使用しないでください。エラーが発生すると、エラー・メッセージが即座に生成され、実行はトラップ・ラベルに分岐します。

トラップ・ラベルでは、内容を問わず必要なエラー処理コマンドを実行し、環境をリストアします。次に、PRGERRキーワードを指定したSIGNAL文を実行します。

SIGNAL PRGERR

PRGERRキーワードをSIGNAL文で使用すると、エラー・メッセージは生成されず、名前PRGERRがERRORNAMEに格納されません。SIGNAL文により、現行のプログラムの実行元であったプログラムに渡されるエラー状態が通知されます。コール側のプログラムにトラップ・ラベルがある場合、プログラムの実行はそのラベルに分岐します。

ネストしたプログラムの連鎖内の各プログラムがTRAPコマンドおよびSIGNALコマンドをこのように使用する場合は、エラー状態をプログラムの連鎖全体を経由して渡すことができます。各プログラムには、次のようなコマンドが記述されています。

TRAP ON error
   ...       "Body of program and normal exit commands
RETURN 
error:
   ...       "Error-handling and exit commands
SIGNAL PRGERR

例10-158 連鎖の最後でのプログラム・エラー・メッセージの生成

ネストしたプログラムの連鎖の最後にエラー・メッセージを生成するには、NOPRINTキーワードを指定したTRAP文を使用します。ネストしたプログラムでエラーが発生すると、実行はトラップ・ラベルに分岐しますが、エラー・メッセージは生成されません。

トラップ・ラベルでは、内容を問わず必要なエラー処理コマンドを実行し、環境をリストアします。その後、次のSIGNAL文を実行します。

SIGNAL ERRORNAME ERRORTEXT

このSIGNAL文には、ERRORNAMEとERRORTEXTが指定されています。ERRORNAMEオプションには、元のエラーの名前が記録され、ERRORTEXTオプションには、元のエラーのエラー・メッセージが記録されています。コール側のプログラムにトラップ・ラベルがあると、プログラムの実行はこのラベルに分岐します。その結果、元のエラー名とエラー・テキストは、SIGNAL文によってコール側のプログラムに渡されます。

ネストしたプログラムの連鎖内の各プログラムがTRAPコマンドおよびSIGNALコマンドをこのように使用する場合、元のエラー・メッセージはプログラムの連鎖の最後に生成されます。各プログラムには、次のようなコマンドが記述されています。

TRAP ON error NOPRINT
   ...       "Body of program and normal exit commands
RETURN
error:
   ...       "Error-handling and exit commands
SIGNAL ERRORNAME ERRORTEXT

TRIGGERコマンド

TRIGGERコマンドは、作成済のプログラムをオブジェクトに関連付け、プログラムを自動で実行するオブジェクト・イベントを識別したり、オブジェクトとトリガー・プログラムの関連付けを解除したりするコマンドです。

トリガー・プログラムをオブジェクトに割り当てるには、オブジェクトは最新の定義のもの、または現行のセッション中に検討されたものにする必要があります。そうでない場合は、最初にCONSIDER文を使用し、現行の定義にする必要があります。

構文

TRIGGER {event-name [program-name] }... | {DELETE event-name}... | DELETE  ALL

ここで、event-nameは、次のいずれかです。

  • MAINTAIN
  • DELETE
  • PROPERTY
  • ASSIGN
  • BEFORE_UPDATE
  • AFTER_UPDATE

1つのTRIGGER文には同じキーワードを何回でも使用できますが、この場合、Oracle OLAPは最後に使用したキーワード以外はすべて無視します。詳細は、同じキーワードの複数回の記述を参照してください。

パラメータ

MAINTAIN

プログラムのトリガーをMaintainイベントにすることを指定します。Maintainイベントとは、MAINTAIN文の実行のことです。表8-19に概要を示すように、Maintainイベントには、MAINTAINコマンドの主要キーワードに対応する複数のサブイベントがあります。Maintainイベントによってトリガーされるプログラムが実行される正確なタイミングは、プログラムをトリガーするMaintainサブイベントと、Maintainイベントの定義の対象となるオブジェクト・タイプによって決まります。

  • ディメンションおよびコンポジットのMaintain AddイベントおよびMaintain Mergeイベントによってトリガーされるプログラムは、全体のMAINTAIN文が実行されたに実行されます。

  • ディメンション・サロゲートのMaintain AddイベントおよびMaintain Mergeイベントによってトリガーされるプログラムは複数回、つまりそれぞれの値が追加またはマージされたに1回ずつ実行されます。

  • その他のMaintainサブイベントによってトリガーされるプログラムは、MAINTAIN文の実行に実行されます。

DELETE

プログラムのトリガーをDeleteイベントにすることを指定します。Deleteイベントとは、オブジェクトに対するDELETE文のことです。Oracle OLAPでは、DELETE文によってオブジェクトが削除される直前に、指定のプログラムが実行されます。

PROPERTY

Oracle OLAPがPropertyイベントに応答して指定のプログラムを実行することを指定します。Propertyイベントとは、オブジェクト・プロパティの作成、変更または削除を目的とするPROPERTY文の実行のことです。Propertyイベントによってトリガーされたプログラムは、このプログラムをトリガーした文より先に実行されます。

ASSIGN

Oracle OLAPがAssignイベントに応答して指定のプログラムを実行することを指定します。Assignイベントは、SETによって値が変数、リレーション、ワークシート・オブジェクトまたは計算式に代入されると実行されます。SETによってトリガーされるプログラムは、イベントが定義されたオブジェクトにOracle OLAPが値を代入するたびに実行されます。このため、Assignイベントでトリガーされるプログラムは通常、代入文がオブジェクトをループ処理して値を代入するときに繰り返し実行されます。

UPDATE

マルチライタ・モードでアタッチされているアナリティック・ワークスペースで、ACQUIREを使用してオブジェクトを取得した場合は、このオブジェクトの更新後、指定のプログラムがOracle OLAPによってただちに実行されることを指定します。

注意:

アナリティック・ワークスペース全体を更新するときの処理を指定するには、TRIGGER_AFTER_UPDATEプログラムまたはTRIGGER_BEFORE_UPDATEプログラムを作成します。

program-name

トリガー・プログラムの名前。イベントに対してこの名前を省略した場合、そのイベントはアクションをトリガーしません。

DELETE event-name

指定したオブジェクト・イベントのトリガーを削除します。Oracle OLAPは、指定したオブジェクト・イベントとトリガー・プログラムとの関連付けを解除します。

DELETE ALL

指定したオブジェクトのトリガーをすべて削除します。Oracle OLAPは、オブジェクトのすべてのイベントとトリガー・プログラムとの関連付けを解除します。

使用上の注意

同じキーワードの複数回の記述

1つのTRIGGER文には、すべてのキーワードを使用できます。ただし、1つのTRIGGER文に同じキーワードを2回使用すると、最後に使用したキーワードのみが認識され、もう一方のキーワードは無視されます。

たとえば、次のTRIGGER文を記述した場合を考えます。

TRIGGER PROPERTY progname1 PROPERTY progname2 PROPERTY progname3

このTRIGGER文を実行すると、Oracle OLAPは、オブジェクトのプロパティが作成、変更または削除される直前にprogname3を実行します。つまり、Oracle OLAPはprogname1progname2のいずれも実行しません

例10-159 トリガーの作成

アナリティック・ワークスペースにcityというTEXTディメンションが格納されており、cityに対してMAINTAIN文が実行されるか、cityのプロパティが作成または削除されると自動的に実行されるプログラムを作成するとします。これらのトリガーを作成するには、次の文を発行します。

"Define the trigger programs
DEFINE trigger_maintain_move_city PROGRAM BOOLEAN
DEFINE trigger_property_city PROGRAM BOOLEAN
"Associate the trigger programs to events for the city dimension
CONSIDER city
TRIGGER PROPERTY trigger_property_city
TRIGGER MAINTAIN trigger_maintain_move_city

例10-160 トリガーの説明

例10-159で説明したように、cityに対してトリガーを作成した場合を考えます後でトリガーの説明を参照するため、アナリティック・ワークスペースに対してDESCRIBE文を発行することはできません。そうではなく、FULLDSC文を発行する必要があります。

DEFINE CITY DIMENSION TEXT
TRIGGER MAINTAIN TRIGGER_MAINTAIN_MOVE_CITY -
        PROPERTY TRIGGER_PROPERTY_CITY
 
DEFINE TRIGGER_MAINTAIN_MOVE_CITY PROGRAM BOOLEAN
 
DEFINE TRIGGER_PROPERTY_CITY PROGRAM BOOLEAN

例10-161 トリガーの削除

例10-159で説明したトリガーを作成した場合を考えます。今度はcityのMAINTAINトリガーを削除します。このトリガーを削除するには、次の文を発行します。

CONSIDER city
TRIGGER DELETE MAINTAIN
 

FULLDSC文を発行したら、cityのMAINTAINトリガーは削除されているが、trigger_maintain_move_cityプログラムは残っていることを確認します。

DEFINE CITY DIMENSION TEXT
TRIGGER PROPERTY TRIGGER_PROPERTY_CITY
 
DEFINE TRIGGER_MAINTAIN_MOVE_CITY PROGRAM BOOLEAN
 
DEFINE TRIGGER_PROPERTY_CITY PROGRAM BOOLEAN

trigger_maintain_move_cityプログラムを実際に削除するには、次の文を発行する必要があります。

DELETE TRIGGER_MAINTAIN_MOVE_CITY 

例10-162 MAINTAINトリガー・プログラム

アナリティック・ワークスペースに、次のような定義を持つディメンションがあるとします。

DEFINE CITY DIMENSION TEXT
 

cityに対してMaintainトリガーを作成する手順は、次のとおりです。

  1. トリガー・プログラムをユーザー定義ファンクションとして定義します。このプログラムには、名前を自由に付けることができます。次の文では、trigger_maintain_cityという名前のプログラムが定義されます。

    DEFINE trigger_maintain_city PROGRAM BOOLEAN
     
  2. プログラムの内容を指定します。

    PROGRAM
    SHOW JOINCHARS ('calltype = ' CALLTYPE)
    SHOW JOINCHARS ('triggering event = ' TRIGGER(EVENT))
    SHOW JOINCHARS ('triggering subevent = ' TRIGGER(SUBEVENT))
    RETURN TRUE
    END
     
  3. TRIGGER文を発行し、Maintainイベントが発生したら実行されるプログラムとして、トリガー・プログラムとcityディメンションを関連付けます。CONSIDER文を使用して、cityの定義を現行の定義にすることを忘れないでください。

    CONSIDER city
    TRIGGER MAINTAIN TRIGGER_MAINTAIN_CITY
    

アナリティック・ワークスペースの完全な詳細を参照するためにFULLDSC文を発行すると、cityの定義(そのMaintainトリガーを含む)やtrigger_maintain_cityプログラムを参照できます。

DEFINE CITY DIMENSION TEXT
TRIGGER MAINTAIN TRIGGER_MAINTAIN_CITY
 
DEFINE TRIGGER_MAINTAIN_CITY PROGRAM BOOLEAN
PROGRAM
SHOW JOINCHARS ('calltype = ' CALLTYPE)
SHOW JOINCHARS ('triggering event = ' TRIGGER(EVENT))
SHOW JOINCHARS ('triggering subevent = ' TRIGGER(SUBEVENT))
RETURN TRUE
END
 

次の文および出力に示すように、cityに対してMAINTAIN文を発行すると、trigger_maintain_cityプログラムが実行されます。

MAINTAIN city ADD 'Boston' 'Houston' 'Dallas'

calltype = TRIGGER
triggering event = MAINTAIN
triggering subevent = ADD
 
REPORT city
 
CITY
--------------
Boston
Houston
Dallas
 
MAINTAIN city MOVE 'Dallas' to 2

calltype = TRIGGER
triggering event = MAINTAIN
triggering subevent = MOVE
 
REPORT city
 
CITY
--------------
Boston
Dallas
Houston

例10-163 変数のASSIGNトリガー

アナリティック・ワークスペースに次の定義を持つオブジェクトが格納されているとします。

DEFINE geog DIMENSION TEXT
DEFINE sales VARIABLE DECIMAL <geog>
DEFINE percent_sales VARIABLE INTEGER <geog>
 

sales変数には、次の値が格納されています。

GEOG             SALES
-------------- ----------
North America        0.59
Europe               9.35
Asia                   NA

percent_sales変数は空です。

値をpercent_salesに代入したら、値に特殊な処理をするとします。この処理を自動化するには、次の手順に従って、percent_salesのAssignトリガー・プログラムを作成します。

  1. 値をpercent_salesに代入するたびに実行されるトリガー・プログラムを作成します。

    DEFINE TRIGGER_EQ PROGRAM BOOLEAN
    PROGRAM
    ARGUMENT datavalue WORKSHEET
    show 'description of triggering object = ' 
    FULLDESCRIBE &TRIGGER(NAME)
    SHOW JOINCHARS ('calltype = ' CALLTYPE)
    SHOW JOINCHARS ('triggering event = ' TRIGGER(EVENT))
    SHOW JOINCHARS ('triggering subevent = ' TRIGGER(SUBEVENT))
    SHOW JOINCHARS ('value being assigned = ' datavalue)
    SHOW '  '
    END
     
  2. TRIGGER文を使用して、Assignトリガーをpercent_salesに追加します。最初にCONSIDER文を発行して、percent_sales変数の定義を現行の定義にすることを忘れないでください。

    CONSIDER percent_sales
    TRIGGER ASSIGN TRIGGER_EQ
    
  3. 値をpercent_salesに代入します。

    percent_sales = (sales/TOTAL(sales))*100
    

    値をpercent_salesに代入すると、trigger_eqプログラムの実行がトリガーされ、次の出力行が生成されます。

    description of triggering object = 
    DEFINE PERCENT_SALES VARIABLE INTEGER <GEOG>
    TRIGGER ASSIGN TRIGGER_EQ
    calltype = TRIGGER
    triggering event = ASSIGN
    triggering subevent = 
    value being assigned = 6
    
    description of triggering object = 
    DEFINE PERCENT_SALES VARIABLE INTEGER <GEOG>
    TRIGGER ASSIGN TRIGGER_EQ
    calltype = TRIGGER
    triggering event = ASSIGN
    triggering subevent = 
    value being assigned = 94
    
    description of triggering object = 
    DEFINE PERCENT_SALES VARIABLE INTEGER <GEOG>
    TRIGGER ASSIGN TRIGGER_EQ
    calltype = TRIGGER
    triggering event = ASSIGN
    triggering subevent = 
    value being assigned = 
    

    注意:

    出力から、Oracle OLAPがtrigger_eqプログラムを3回コールしていることがわかります。そのたびに値がpercent_salesに代入されます。

  4. salesおよびpercent_salesに対してREPORTコマンドを発行すると、計算の結果を参照できます。percent_sales変数には、大陸ごとの売上比率を表す値が格納されています。

    GEOG                  SALES
    -------------- --------------------
    North America                  0.59
    Europe                         9.35
    Asia                             NA
     
    GEOG              PERCENT_SALES
    -------------- --------------------
    North America                     6
    Europe                           94
    Asia                             NA

例10-164 ASSIGNトリガー・プログラムでの値の設定

アナリティック・ワークスペースに次のオブジェクトがあるとします。

DEFINE GEOGRAPHY DIMENSION TEXT WIDTH 12
LD Geography Dimension Values
 
DEFINE PRODUCT DIMENSION TEXT WIDTH 12
LD Product Dimension Values
 
DEFINE TIME DIMENSION TEXT WIDTH 12
LD Time Dimension Values
 
DEFINE CHANNEL DIMENSION TEXT WIDTH 12
LD Channel Dimension Values
 
DEFINE F.MARGIN FORMULA DECIMAL <CHANNEL GEOGRAPHY PRODUCT TIME>
LD Margin
EQ f.sales-f.costs
 
 
DEFINE F.COSTS VARIABLE SHORT <GEOGRAPHY PRODUCT CHANNEL TIME>
LD Costs
 
DEFINE F.SALES VARIABLE SHORT <GEOGRAPHY PRODUCT CHANNEL TIME>
LD Sales
 

f.costsf.salesおよび f.marginのディメンションは、すべて同じです。

ここで、t.marginというプログラムを実行するf.marginにAssignトリガーを追加します。f.marginの定義は次の定義に変更されます。

DEFINE F.MARGIN FORMULA DECIMAL <CHANNEL GEOGRAPHY PRODUCT TIME>
LD Margin
TRIGGER ASSIGN T.MARGIN
EQ f.sales-f.costs

今度は、t.marginプログラムを実際に作成します。f.margin計算式に式を代入すると、このプログラム(計算式)は、この値を使用してf.costsおよびf.salesの新しい値を計算します。

DEFINE T.MARGIN PROGRAM
PROGRAM
ARG newVal DECIMAL       " The value passed to the program by the Assign trigger
VARIABLE t.valDiff DECIMAL     " Difference between newVal and old value
VARIABLE t.costInc DECIMAL     " Amount the difference makes to costs
"show the value of newVal
SHOW 'newVal = ' NONL
SHOW newVal
" Compute the difference between the current value and the new one
t.valDiff = newVal - f.margin
" Now increase costs proportional to their existing amounts
t.costInc = (newVal - f.margin) * (f.costs/f.sales)
" Adjust the values of sales and costs to get the new value
SET1 f.costs = f.costs + t.costInc
 
SET1 f.sales =  f.sales + t.valDiff + t.costInc
 
SHOW geography NONL
SHOW ' ' NONL
SHOW product NONL
SHOW ' ' NONL
SHOW channel NONL
SHOW ' ' NONL
SHOW time NONL
SHOW ' f.costs = 'NONL
SHOW f.costs NONL
SHOW ' f.sales = 'NONL
SHOW f.sales
END
 

ここで、次のLIMIT文を発行してデータのサブセットを指定し、REPORT文を発行してf.marginの値に関するレポートを作成するとします。

LIMIT t0.hierdim TO 'STANDARD'
LIMIT time TO t0.levelrel EQ 'L2'
LIMIT geography TO FIRST 1
LIMIT channel TO FIRST 1
LIMIT product TO FIRST 5
REPORT DOWN time ACROSS product: f.margin
 
GEOGRAPHY: WORLD
CHANNEL: TOTALCHANNEL
               -----------------------F.MARGIN-----------------------
               -----------------------PRODUCT------------------------
TIME           TOTALPROD   AUDIODIV  PORTAUDIO    PORTCD     PORTST
-------------- ---------- ---------- ---------- ---------- ----------
Q1.96          54,713,974 29,603,546  5,379,661  2,480,914  1,615,708
Q2.96          63,919,784 34,594,087  6,331,848  2,869,265  1,931,785
Q3.96          58,303,490 31,543,152  5,792,725  2,616,515  1,795,701
Q4.96          71,197,892 38,383,878  7,059,581  3,163,804  2,232,880
Q1.97          55,489,723 29,989,262  5,368,237  2,491,475  1,607,344
Q2.97          41,687,908 22,532,979  4,070,725  1,855,992  1,245,161
 

今度は、f.marginの値を10%ずつ増加する次の代入文を発行し、レポートを作成します。

f.margin = f.margin * 1.1

この代入文の実行により、t.marginというAssignトリガー・プログラムの実行がトリガーされます。このプログラムの出力は次のとおりです。

newVal = 60,185,371.40
WORLD TOTALPROD TOTALCHANNEL Q1.96 f.costs = 1,298,474.00 f.sales = 61,483,840.00
newVal = 32,563,900.67
WORLD AUDIODIV TOTALCHANNEL Q1.96 f.costs = 664,226.90 f.sales = 33,228,130.00
newVal = 5,917,626.67
WORLD PORTAUDIO TOTALCHANNEL Q1.96 f.costs = 97,976.04 f.sales = 6,015,603.00
newVal = 2,729,005.43
WORLD PORTCD TOTALCHANNEL Q1.96 f.costs = 34,301.53 f.sales = 2,763,307.00
newVal = 1,777,278.95
WORLD PORTST TOTALCHANNEL Q1.96 f.costs = 25,160.72 f.sales = 1,802,440.00
newVal = 70,311,762.13
WORLD TOTALPROD TOTALCHANNEL Q2.96 f.costs = 1,504,051.00 f.sales = 71,815,820.00
newVal = 38,053,495.70
WORLD AUDIODIV TOTALCHANNEL Q2.96 f.costs = 768,788.10 f.sales = 38,822,280.00
newVal = 6,965,032.86
WORLD PORTAUDIO TOTALCHANNEL Q2.96 f.costs = 114,558.20 f.sales = 7,079,591.00
newVal = 3,156,191.20
WORLD PORTCD TOTALCHANNEL Q2.96 f.costs = 39,256.88 f.sales = 3,195,448.00
newVal = 2,124,963.02
WORLD PORTST TOTALCHANNEL Q2.96 f.costs = 29,780.54 f.sales = 2,154,744.00
newVal = 64,133,838.86
WORLD TOTALPROD TOTALCHANNEL Q3.96 f.costs = 1,350,733.00 f.sales = 65,484,570.00
newVal = 34,697,467.06
WORLD AUDIODIV TOTALCHANNEL Q3.96 f.costs = 691,887.10 f.sales = 35,389,360.00
newVal = 6,371,997.63
WORLD PORTAUDIO TOTALCHANNEL Q3.96 f.costs = 103,203.70 f.sales = 6,475,202.00
newVal = 2,878,166.40
WORLD PORTCD TOTALCHANNEL Q3.96 f.costs = 35,358.18 f.sales = 2,913,525.00
newVal = 1,975,270.68
WORLD PORTST TOTALCHANNEL Q3.96 f.costs = 27,339.77 f.sales = 2,002,611.00
newVal = 78,317,681.06
WORLD TOTALPROD TOTALCHANNEL Q4.96 f.costs = 1,618,915.00 f.sales = 79,936,590.00
newVal = 42,222,265.94
WORLD AUDIODIV TOTALCHANNEL Q4.96 f.costs = 826,923.40 f.sales = 43,049,190.00
newVal = 7,765,539.34
WORLD PORTAUDIO TOTALCHANNEL Q4.96 f.costs = 123,269.50 f.sales = 7,888,809.00
newVal = 3,480,184.35
WORLD PORTCD TOTALCHANNEL Q4.96 f.costs = 41,998.90 f.sales = 3,522,183.00
newVal = 2,456,168.00
WORLD PORTST TOTALCHANNEL Q4.96 f.costs = 33,357.19 f.sales = 2,489,525.00
newVal = 61,038,695.03
WORLD TOTALPROD TOTALCHANNEL Q1.97 f.costs = 1,423,963.00 f.sales = 62,462,660.00
newVal = 32,988,187.65
WORLD AUDIODIV TOTALCHANNEL Q1.97 f.costs = 679,477.80 f.sales = 33,667,660.00
newVal = 5,905,060.56
WORLD PORTAUDIO TOTALCHANNEL Q1.97 f.costs = 158,854.40 f.sales = 6,063,915.00
newVal = 2,740,622.56
WORLD PORTCD TOTALCHANNEL Q1.97 f.costs = 53,144.41 f.sales = 2,793,767.00
newVal = 1,768,078.14
WORLD PORTST TOTALCHANNEL Q1.97 f.costs = 40,784.62 f.sales = 1,808,863.00
newVal = 45,856,698.46
WORLD TOTALPROD TOTALCHANNEL Q2.97 f.costs = 1,070,465.00 f.sales = 46,927,160.00
newVal = 24,786,276.35
WORLD AUDIODIV TOTALCHANNEL Q2.97 f.costs = 512,435.60 f.sales = 25,298,710.00
newVal = 4,477,797.64
WORLD PORTAUDIO TOTALCHANNEL Q2.97 f.costs = 118,791.70 f.sales = 4,596,590.00
newVal = 2,041,591.56
WORLD PORTCD TOTALCHANNEL Q2.97 f.costs = 39,287.77 f.sales = 2,080,879.00
newVal = 1,369,677.57
WORLD PORTST TOTALCHANNEL Q2.97 f.costs = 30,038.08 f.sales = 1,399,716.00

例10-165 計算式に関するASSIGNトリガー

Oracle OLAPが値の計算式への代入をどのように処理するかは、Assignトリガーが計算式の定義の一部として計算式に存在するかどうかによって異なります。

アナリティック・ワークスペースに次の定義と値を持つオブジェクトが格納されているとします。

DEFINE geog.d DIMENSION TEXT
DEFINE time.d DIMENSION TEXT
DEFINE sales VARIABLE DECIMAL <time.d geog.d>
DEFINE f_modified_sales FORMULA DECIMAL <time.d geog.d>
  EQ sales+20
 

salesのレポートでは、ベース値が表示されます。

               -------------------SALES-------------------
               ------------------TIME.D-------------------
GEOG.D          Jan2004    Feb2004    Mar2004      2004
-------------- ---------- ---------- ---------- ----------
Boston               4.00       4.66       5.91       NA
Medford              4.37       5.80       4.45       NA
San Diego            4.97       5.95       4.75       NA
Sunnydale            5.85       5.26       4.08       NA

f_modified_sales計算式のレポートでは、この計算式によって計算された値が含まれる次のレポートが表示されます。

               -------------F_MODIFIED_SALES--------------
               ------------------TIME.D-------------------
GEOG.D          Jan2004    Feb2004    Mar2004      2004
-------------- ---------- ---------- ---------- ----------
Boston              24.00      24.66      25.91         NA
Medford             24.37      25.80      24.45         NA
San Diego           24.97      25.95      24.75         NA
Sunnydale           25.85      25.26      24.08         NA

f_modified_sales計算式には、現在、これに関するAssignトリガーは存在しません。したがって、次のコードに示すように、f_modified_salesに値を代入しようとすると、エラーが発生します。

f_modified_sales = 3
ORA-34142: You cannot assign values to a FORMULA.

f_modified_salesのAssignトリガーを作成する手順は、次のとおりです。

  1. トリガー・プログラムを定義します。

    DEFINE TRIGGER_ASSIGN_MODIFIED_SALES PROGRAM
    PROGRAM
    ARGUMENT datavalue NUMBER
    SHOW 'description of triggering object = '
    DESCRIBE &TRIGGER(NAME)
    SHOW JOINCHARS ('calltype = ' CALLTYPE)
    SHOW JOINCHARS ('triggering event = ' TRIGGER(EVENT))
    SHOW JOINCHARS ('value being assigned = ' datavalue)
    SHOW '  '
    END
     
  2. 次の文を使用して、Assignトリガーを計算式の定義に追加します。

    CONSIDER f_modified_sales
    TRIGGER ASSIGN trigger_assign_modified_sales
     

    FULLDSC f_modified_sales文を発行すると、f_modified_salesの新しい定義がすべて表示されます。

    DEFINE F_MODIFIED_SALES FORMULA DECIMAL <TIME.D GEOG.D>
    TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES
    EQ sales+20
    
  3. 次の文を発行してf_modified_salesに値を代入しても、今度はエラーが発生しません。かわりに、trigger_assign_modified_salesトリガー・プログラムが、salesのディメンション値ごとに1回ずつ、計16回実行されます。

    f_modified_sales = 3
     
    description of triggering object = 
    DEFINE F_MODIFIED_SALES FORMULA DECIMAL <TIME.D GEOG.D>
    TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES
    EQ sales+20
    calltype = TRIGGER
    triggering event = ASSIGN
    value being assigned = 3.00
    description of triggering object = 
    ... 
    description of triggering object = 
    ... 
    description of triggering object = 
    ... 
    description of triggering object = 
    ... 
    description of triggering object = 
    ... 
    description of triggering object = 
    ... 
    description of triggering object = 
    ... 
    description of triggering object = 
    ... 
    description of triggering object = 
    ... 
    description of triggering object = 
    ... 
    description of triggering object = 
    ... 
    description of triggering object = 
    ... 
    description of triggering object = 
    ... 
    description of triggering object = 
    ... 
    description of triggering object = 
    ...
     
  4. ただし、次に示すように、 f_modified_salesについてREPORT文を発行すると、計算式を単純に実行することによって計算される値は変更されていないことがわかります。

    report f_modified_sales
    
                   -------------F_MODIFIED_SALES--------------
                   ------------------TIME.D-------------------
    GEOG.D          Jan2004    Feb2004    Mar2004      2004
    -------------- ---------- ---------- ---------- ----------
    Boston              24.00      24.66      25.91         NA
    Medford             24.37      25.80      24.45         NA
    San Diego           24.97      25.95      24.75         NA
    Sunnydale           25.85      25.26      24.08         NA

TRIGGERASSIGN

オブジェクトのAssignイベントによってトリガーされたプログラムの内部で、トリガー・オブジェクトに値を代入します。

注意:

TRIGGERASSIGNを実行するには、USETRIGGERSオプションをそのデフォルト値であるTRUEに設定する必要があります。

データ型

Oracle OLAPによる値の代入先となるオブジェクトのデータ型。

構文

TRIGGERASSIGN value

パラメータ

value

代入する値。

例10-166 Assignトリガーを使用した代替値の代入

アナリティック・ワークスペースに、次のような記述を持つオブジェクトがあるとします。

DEFINE GEOG.D DIMENSION TEXT
DEFINE TIME.D DIMENSION TEXT
DEFINE TIME.PARENTREL RELATION TIME.D <TIME.D>
DEFINE SALES VARIABLE DECIMAL <GEOG.D TIME.D>
DEFINE MODIFIED_SALES VARIABLE DECIMAL <GEOG.D TIME.D>

次のレポートに示す値をsales変数に移入したが、modified_sales変数にはまだ移入していないとします。

             -----------------------SALES-----------------------
             ----------------------GEOG.D-----------------------
TIME.D          Boston      Medford     San Diego    Sunnydale
------------ ------------ ------------ ------------ ------------
Jan76            1,000.00     2,000.00     3,000.00     4,000.00
Feb76            2,000.00     4,000.00     6,000.00     8,000.00
Mar76            3,000.00     6,000.00     9,000.00    12,000.00
76Q1                   NA           NA           NA           NA
 

ここで、様々な式を使用して、modified_sales変数に値を代入しますが、値は1,000以下にならないようにします。この処理を確実に実行するには、次の手順に従います。

  1. 1000以下の値という条件を調べる次のプログラムを作成します。

    DEFINE TRIGGER_ASSIGN_MODIFIED_SALES PROGRAM
    PROGRAM
    ARGUMENT datavalue DECIMAL
    IF datavalue LE 1000
     THEN TRIGGERASSIGN 1000
    show 'description of triggering object = '
    DESCRIBE &TRIGGER(NAME)
    SHOW JOINCHARS ('calltype = ' CALLTYPE)
    SHOW JOINCHARS ('triggering event = ' TRIGGER(EVENT))
    SHOW JOINCHARS ('triggering subevent = ' TRIGGER(SUBEVENT))
    SHOW JOINCHARS ('value passed to program = ' datavalue)
    SHOW '  '
    END
     
  2. 次の文を発行して、Assignトリガーをmodified_sales変数に追加します。trigger_assign_modified_salesプログラムはトリガー・プログラムです。

    CONSIDER modified_sales
    TRIGGER ASSIGN trigger_assign_modified_sales
    
  3. 値をmodified_salesに代入します。

    modified_sales = sales - 1000
    
  4. この文は、Oracle OLAPによって代入された値ごとにtrigger_assign_modified_salesプログラムの実行をトリガーします。

    description of triggering object = 
    DEFINE MODIFIED_SALES VARIABLE DECIMAL <GEOG.D TIME.D>
    TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES
    calltype = TRIGGER
    triggering event = ASSIGN
    triggering subevent = 
    value passed to program = 0.00
      
    description of triggering object = 
    DEFINE MODIFIED_SALES VARIABLE DECIMAL <GEOG.D TIME.D>
    TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES
    calltype = TRIGGER
    triggering event = ASSIGN
    triggering subevent = 
    value passed to program = 1,000.00
      
    description of triggering object = 
    DEFINE MODIFIED_SALES VARIABLE DECIMAL <GEOG.D TIME.D>
    TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES
    calltype = TRIGGER
    triggering event = ASSIGN
    triggering subevent = 
    value passed to program = 2,000.00
      
    description of triggering object = 
    DEFINE MODIFIED_SALES VARIABLE DECIMAL <GEOG.D TIME.D>
    TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES
    calltype = TRIGGER
    triggering event = ASSIGN
    triggering subevent = 
    value passed to program = 3,000.00
      
    description of triggering object = 
    DEFINE MODIFIED_SALES VARIABLE DECIMAL <GEOG.D TIME.D>
    TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES
    calltype = TRIGGER
    triggering event = ASSIGN
    triggering subevent = 
    value passed to program = 1,000.00
      
    description of triggering object = 
    DEFINE MODIFIED_SALES VARIABLE DECIMAL <GEOG.D TIME.D>
    TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES
    calltype = TRIGGER
    triggering event = ASSIGN
    triggering subevent = 
    value passed to program = 3,000.00
      
    description of triggering object = 
    DEFINE MODIFIED_SALES VARIABLE DECIMAL <GEOG.D TIME.D>
    TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES
    calltype = TRIGGER
    triggering event = ASSIGN
    triggering subevent = 
    value passed to program = 5,000.00
      
    description of triggering object = 
    DEFINE MODIFIED_SALES VARIABLE DECIMAL <GEOG.D TIME.D>
    TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES
    calltype = TRIGGER
    triggering event = ASSIGN
    triggering subevent = 
    value passed to program = 7,000.00
      
    description of triggering object = 
    DEFINE MODIFIED_SALES VARIABLE DECIMAL <GEOG.D TIME.D>
    TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES
    calltype = TRIGGER
    triggering event = ASSIGN
    triggering subevent = 
    value passed to program = 2,000.00
      
    description of triggering object = 
    DEFINE MODIFIED_SALES VARIABLE DECIMAL <GEOG.D TIME.D>
    TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES
    calltype = TRIGGER
    triggering event = ASSIGN
    triggering subevent = 
    value passed to program = 5,000.00
      
    description of triggering object = 
    DEFINE MODIFIED_SALES VARIABLE DECIMAL <GEOG.D TIME.D>
    TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES
    calltype = TRIGGER
    triggering event = ASSIGN
    triggering subevent = 
    value passed to program = 8,000.00
      
    description of triggering object = 
    DEFINE MODIFIED_SALES VARIABLE DECIMAL <GEOG.D TIME.D>
    TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES
    calltype = TRIGGER
    triggering event = ASSIGN
    triggering subevent = 
    value passed to program = 11,000.00
      
    description of triggering object = 
    DEFINE MODIFIED_SALES VARIABLE DECIMAL <GEOG.D TIME.D>
    TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES
    calltype = TRIGGER
    triggering event = ASSIGN
    triggering subevent = 
    value passed to program = 
      
    description of triggering object = 
    DEFINE MODIFIED_SALES VARIABLE DECIMAL <GEOG.D TIME.D>
    TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES
    calltype = TRIGGER
    triggering event = ASSIGN
    triggering subevent = 
    value passed to program = 
      
    description of triggering object = 
    DEFINE MODIFIED_SALES VARIABLE DECIMAL <GEOG.D TIME.D>
    TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES
    calltype = TRIGGER
    triggering event = ASSIGN
    triggering subevent = 
    value passed to program = 
      
    description of triggering object = 
    DEFINE MODIFIED_SALES VARIABLE DECIMAL <GEOG.D TIME.D>
    TRIGGER ASSIGN TRIGGER_ASSIGN_MODIFIED_SALES
    calltype = TRIGGER
    triggering event = ASSIGN
    triggering subevent = 
    value passed to program = 
    
  5. modified_salesの次のレポートでは、すべての値が1,000以上になっています。

     
                 ------------------MODIFIED_SALES-------------------
                 ----------------------GEOG.D-----------------------
    TIME.D          Boston      Medford     San Diego    Sunnydale
    ------------ ------------ ------------ ------------ ------------
    Jan76            1,000.00     1,000.00     2,000.00     3,000.00
    Feb76            1,000.00     3,000.00     5,000.00     7,000.00
    Mar76            2,000.00     5,000.00     8,000.00    11,000.00
    76Q1                   NA           NA           NA           NA

UNHIDE

UNHIDEコマンドは、HIDE文によって非表示になっていたプログラムのテキストを表示するように設定するコマンドです。UNHIDEを使用するには、プログラムを非表示にしたときに、HIDE文とともに使用したシード式がわかっている必要があります。

注意:

HIDEコマンドは、単純なエンコードを実行します。セキュアな暗号化の使用方法や、その他のOracleのセキュリティ機能については、『Oracle Databaseセキュリティ・ガイド』Oracle Databaseセキュリティの概要に関する項を参照してください。

構文

UNHIDE prog-name seed-exp

パラメータ

prog-name

テキストがHIDE文によって非表示になっているプログラムの名前。プログラム名は引用符で囲まないでください。

seed-exp

「prog-name」が非表示になっていたときにHIDE文に使用した1行のテキスト式。シード式は、HIDE文で使用した式と1バイト単位で同じ値にする必要があります。さらに、シード式は大文字と小文字を区別するため、大文字と小文字は慎重に指定してください。

使用上の注意

シード式を忘れた場合

UNHIDE文をプログラムに対して使用するときにシード式を忘れてしまった場合は、Oracleサポート・サービスに連絡して、問題の解決に役立ててください。連絡する前にOLAP WorksheetからOracle OLAPに接続し、そこで非表示のプログラムが格納されているアナリティック・ワークスペースをアタッチしてください。

例10-167 プログラム・テキストの再表示

次の例では、sales_rptというプログラムのテキストを表示するように設定します。シード式crystalは、このプログラムをHIDEを使用して非表示にしたときに使用したものです。

UNHIDE sales_rpt 'crystal'

UPDATE

UPDATEコマンドは、アナリティック・ワークスペースの変更内容を、一時領域からワークスペースが格納されているデータベース表に移動するコマンドです。通常、UPDATE文は、アナリティック・ワークスペースでの変更作業が終了してから使用しますが、進捗に応じて定期的に指定することもできます。

変更内容は、Oracle OLAPまたはSQLのどちらかでCOMMIT文を実行するまで保存されません。UPDATEおよびCOMMITコマンドを使用しなかった場合、セッション中に行ったアナリティック・ワークスペースの変更内容は、Oracleセッションの終了時に廃棄されます。

注意:

変更がコミットされていない場合でも、その変更を維持したままでアナリティック・ワークスペースをデタッチおよび再アタッチできます。これは、デタッチおよび再アタッチが単一のデータベース・セッション内で行われるためです。

構文

UPDATE [MULTI [acquired_objects]] [analytic_workspaces]

パラメータ

パラメータを指定しなかった場合、このコマンドによって更新されるのは、読取り/書込み非排他モードおよび読取り/書込み排他モードでアタッチされているすべてのアナリティック・ワークスペース、マルチライタ・モードでアタッチされているすべてのアナリティック・ワークスペースに存在するすべての取得したオブジェクト(つまり、取得したすべての変数、リレーション、値セットおよびディメンション)です。

acquired_objects

マルチライタ・モードでアタッチされているアナリティック・ワークスペースに存在する、取得済オブジェクトの名前をカンマで区切ったリスト。これらのオブジェクトは、ACQUIRE文を使用して取得した任意のオブジェクトです。

パーティション変数の個々のパーティションを指定するには、次の構文を使用します。

variable_name (PARTITION partition_name [, PARTITION partition_name ]...)

注意:

取得して保持したディメンションによってオブジェクトをディメンション化した場合は、このディメンションを最初に更新しないかぎり、オブジェクトを更新することはできません。

workspaces

読取り/書込みモードまたはマルチライタ・モードでアタッチした1つ以上のワークスペースの、カンマで区切られた名前のリスト。

使用上の注意

自動によるCOMMIT

ユーザーの多くは、SQL*PlusまたはOLAP Worksheetを使用してDML文を実行します。これらのツールはどちらも、セッションの終了時に自動でCOMMIT文を実行します。

UPDATE実行時におけるプログラム実行のトリガー

TRIGGERコマンドを使用すると、UPDATE文を、OLAP DMLプログラムを自動的に実行するイベントにすることができます。詳細は、トリガー・プログラムを参照してください。

共有ワークスペース

共有ワークスペースをアタッチし、別のユーザーが読取り/書込みアクセス権を保持している場合、別のユーザーのUPDATEおよびCOMMITコマンドは、使用中のワークスペース・ビューには影響しません。データのビューは、ワークスペースをアタッチした時点と同じままです。別のユーザーが行った変更にアクセスするには、ワークスペースをいったんデタッチしてから再アタッチします。

ROLLBACK文の影響

OLAP DMLには、SQL ROLLBACK文を発行するための手段が用意されていませんが、セッション中にOracle OLAPの外部から(たとえば、PL/SQLを介して)これを実行できます。セッション中にROLLBACK文を実行すると、Oracle OLAPは、アタッチされたワークスペースに未コミット状態の更新内容があるかどうかを確認します。

  • 未コミット状態の更新内容があると(つまり、変更してUPDATE文を実行したが、その後にCOMMIT文を実行していない場合)、Oracle OLAPは変更内容を廃棄してワークスペースをデタッチします。

  • 未コミット状態の更新内容がない場合、Oracle OLAPはROLLBACK文に応答した処理を行いません。そのため、最後に発行したCOMMIT文以降にUPDATE文を発行していない場合、Oracle OLAPでは何の処理も実行されず、セッション中の変更内容はすべてワークスペースに保持されます。

セーブポイントにロールバックし、このセーブポイント以降に発生した未コミット状態の更新内容がある場合、Oracle OLAPはこれらの更新内容を廃棄して、ワークスペースをデタッチします。セーブポイント以前に発生した未コミット状態の更新内容はワークスペース内に保持されているため、同じセッションでワークスペースを再アタッチすると、これらの更新内容を参照できます。

例10-168 アナリティック・ワークスペースの変更内容の保存

次の文では、現行のワークスペース・セッションの変更内容を、ワークスペースが格納されているデータベース表に移動します。

UPDATE

変更内容をデータベースに保存するには、UPDATE文の後にCOMMIT文を発行する必要があります。

UPDATE_ATTRIBUTE_VALUE

UPDATE_ATTRIBUTE_VALUEプログラムを実行すると、OLAPキューブ・ディメンション・メンバーの属性が変更されます。

このプログラムは、次のような属性を更新する場合に特に役立ちます。

  • 基礎となるリレーションまたは索引付けされたディメンションを持つ属性では、指定する必要があるのはディメンション・メンバーと値のみです。索引付けされたディメンションの管理は、リレーション内での値の設定とともに行われます。

  • 複数のレベルに適用される属性。すべてのレベルに適用される属性に対して属性値を設定した場合、その値はコンパイル時に下位レベルに広がります。

注意:

キューブ・ディメンションまたはそのキューブ・ディメンションを含むキューブに対してマテリアライズド・ビューが存在する場合は、キューブ・ディメンションの変更に、このプログラムを使用できません。

関連項目:

キューブ対応のOLAP DML文

構文

CALL UPDATE_ATTRIBUTE_MEMBER(dim_member_id, attribute_name, attribute_value -

           [, auto_compile ])

パラメータ

CALL

UPDATE_ATTRIBUTE_VALUEは引数を持つOLAP DMLプログラムであるため、OLAP DML CALL文を使用して起動します。

dim_member_id

属性を変更するキューブ・ディメンション・メンバーの値を示すテキスト式。

logical_dim

dim_member_idがメンバーとなっているキューブ・ディメンションのOracleデータ・ディクショナリ名を示すテキスト式。

attribute_name

属性のOracleデータ・ディクショナリ名を示すテキスト式。

attribute_value

attribute_nameの値を指定するテキスト式。

auto_compile

関連するアナリティック・ワークスペース・オブジェクトを即時更新するかどうかを指定するブール式。

デフォルト値はTRUEです。この値を指定すると、アナリティック・ワークスペースの変更内容のうち、キューブ・ディメンション・メンバーの属性の更新に必要のあるものはすべて即座に更新されます。

パフォーマンス上の理由から、FALSEはコンパイルの実行前に大量の変更を行う場合のみ指定してください。この場合、アナリティック・ワークスペース・オブジェクトの値が有効になる前に、キューブ・ディメンションを明示的にコンパイルする必要があります(キューブ・ディメンションの明示的なコンパイルを参照)。

注意:

この引数に対して指定した値に関係なく、ディメンション・メンバーの属性は常に即時更新されます。これは、コンパイル中にエラーが通知された場合でも同様です。

例10-169 OLAPキューブ・ディメンションの属性の更新

この例では、OLAP DMLで提供されているUPDATE_ATTRIBUTE_VALUEプログラムを使用し、L1-2およびL1-2の子孫に対してmy_timeキューブ・ディメンションの属性を更新します。OLAP DMLで提供されているUPDATE_ATTRIBUTE_VALUEプログラムへのコールは、ユーザー作成のADD_L1_2_DATEというOLAP DMLプログラム内にあります。

  1. 次のPL/SQL文を発行して、ADD_L1_2_DATEというユーザー作成のOLAP DMLプログラムを実行し、L1_2およびその子孫のtime属性値を設定します

    exec dbms_aw.execute('call my_util_aw!add_l1_2_dates');
    

    ユーザー作成のOLAP DMLプログラムADD_L1_2_DATEの定義を次に示します。OLAP DMLから提供されるUPDATE_ATTRIBUTE_VALUEプログラムへのコールに注意してください。

    DEFINE ADD_L1_2_DATES PROGRAM
    PROGRAM
      VARIABLE _aw_dim       text
      VARIABLE _start_date   text
      VARIABLE _timespan     text
    
      _aw_dim = OBJORG(DIM 'my_time')
      _start_date = OBJORG(ATTRIBUTE 'my_time' 'start_date')
      _timespan = OBJORG(ATTRIBUTE 'MY_TIME' 'timespan')
    
      " Updates the time attribute of L1_2, L2_3, L3_6, but does not compile
      CALL UPDATE_ATTRIBUTE_VALUE('L1_2', 'my_time', 'start_date', -
                                  &_start_date(&_aw_dim 'L1_1')+365, NO)
      CALL UPDATE_ATTRIBUTE_VALUE('L1_2', 'my_time', 'timespan', -
                                  &_timespan(&_aw_dim 'L1_1'), NO)
    
      CALL UPDATE_ATTRIBUTE_VALUE('L2_3', 'my_time', 'start_date', -
                                  &_start_date(&_aw_dim 'L1_2'), NO)
      CALL UPDATE_ATTRIBUTE_VALUE('L2_3', 'my_time', 'timespan', -
                                  &_timespan(&_aw_dim 'L2_1'), NO)
    
      CALL UPDATE_ATTRIBUTE_VALUE('L3_6', 'my_time', 'start_date', -
                                  &_start_date(&_aw_dim 'L1_2'), NO)
      CALL UPDATE_ATTRIBUTE_VALUE('L3_6', 'my_time', 'timespan', -
                                  &_timespan(&_aw_dim 'L3_1'), NO)
      UPDATE
      COMMIT
    END
    
  2. 次のSQL文を発行して、my_timeキューブ・ディメンションの属性を確認します。

    select dim_key||'  '||start_date||'  '||lpad(timespan, 3) 
        from my_time_view 
        order by dim_key asc;
    
    
    DIM_KEY||''||START_DATE||''||LPAD(TIMESPAN,3)
    ----------------------------------------------------------------------------
    L1_0  01-JAN-09  365
    L1_1  01-JAN-10  365
    L1_2  01-JAN-11  365
    L2_1  01-JAN-10   90
    L2_2  01-APR-10   61
    L2_3  01-JAN-11   90
    L3_1  01-JAN-10   31
    L3_2  01-FEB-10   28
    L3_3  01-MAR-10   31
    L3_4  01-APR-10   30
    L3_5  01-MAY-10   31
    L3_6  01-JAN-11   31
    
    12 rows selected.
    
  3. 次のSQL文を発行して、my_timeキューブ・ディメンションのコンパイルsalesおよびmoving_salesメジャーの値に関するレポートを生成します。メジャーの計算ではmy_timeキューブ・ディメンションの新しい属性が計算対象とならないことに注意します。

    select my_time||'  '||lpad(sales, 2)||'  '||lpad(moving_sales, 2)
    from my_cube_view
    order by my_time asc;
    
    MY_TIME||''||LPAD(SALES,2)||''||LPAD(MOVING_SALES,2)
    --------------------------------------------------------------------
    L1_0  24  27
    L1_1  14  38
    L1_2   3   3
    L2_1   2   5
    L2_2  12  14
    L2_3   3   3
    L3_1   1   4
    L3_2   1   2
    L3_3  10  11
    L3_4   1  11
    L3_5   1   2
    L3_6   3   3
    
    12 rows selected.
    
  4. 次のSQL文を発行し、my_timeキューブ・ディメンションをコンパイルします。

    exec dbms_cube.build('MY_TIME USING (COMPILE)');
    
  5. 次のSQL文を発行して、my_timeキューブ・ディメンションのコンパイルsalesおよびmoving_salesメジャーの値に関するレポートを生成します。今回のメジャーの計算ではmy_timeキューブ・ディメンションの新しい属性が計算対象となることに注意します。

    select my_time||'  '||lpad(sales, 2)||'  '||lpad(moving_sales, 2)
           from my_cube_view
           order by my_time asc;
    
    MY_TIME||''||LPAD(SALES,2)||''||LPAD(MOVING_SALES,2)
    --------------------------------------------------------------------
    L1_0  24  24
    L1_1  14  38
    L1_2   3  17
    L2_1   2   2
    L2_2  12  14
    L2_3   3  15
    L3_1   1   1
    L3_2   1   2
    L3_3  10  11
    L3_4   1  11
    L3_5   1   2
    L3_6   3   4
    
    12 rows selected.

UPDATE_DIMENSION_MEMBER

UPDATE_DIMENSION_MEMBERプログラムを実行すると、1つ以上の階層でOLAPキューブ・ディメンション・メンバーのレベルと親が設定されます。

注意:

キューブ・ディメンションまたはそのキューブ・ディメンションを含むキューブに対してマテリアライズド・ビューが存在する場合は、キューブ・ディメンションの変更に、このプログラムを使用できません。

関連項目:

キューブ対応のOLAP DML文

構文

CALL UPDATE_DIMENSION_MEMBER(member_id, logical_dim, hier_list,  level_name,  -

     parent-member_id [, auto_compile ])

パラメータ

CALL

UPDATE_DIMENSION_MEMBERは引数を持つOLAP DMLプログラムであるため、OLAP DML CALL文を使用して起動します。

member_id

レベルと親の情報を設定するメンバーを示すテキスト式。

logical_dim

変更するキューブ・ディメンションのOracleデータ・ディクショナリ名を示すテキスト式。

hier_list

ディメンション・メンバーのレベルと親を設定する全階層のOracleデータ・ディクショナリ名で構成された複数行のテキスト式。1行ごとに1つの階層を指定します。

キューブ・ディメンションの全階層でメンバーの情報を指定する場合は、NAを指定します。

level_name

レベル階層の場合に、プログラムによってキューブ・ディメンションのメンバーが設定される階層レベルを指定するテキスト値。レベル階層の場合、level_nameに指定する値は、次の条件を満たしている必要があります。

  • parent_member_idに指定する値と互換性があること。

  • 既存のキューブ・ディメンション・メンバーと同じ階層レベルであること(キューブ・ディメンション・メンバーはすべての階層で同じレベルに追加する必要があります)。

メンバーが値階層に含まれている場合(つまりレベルが存在しない場合)は、NAを指定します。

parent_member_id

キューブ・ディメンションの階層に追加するディメンション・メンバーの親メンバーの値を指定するテキスト式。ディメンション・メンバーを最上位メンバーとして追加する場合は、NAを指定します。

auto_compile

変更をすぐに有効にするかどうかを指定するブール式。デフォルト値であるTRUEを指定すると、アナリティック・ワークスペースの変更内容のうち、キューブ・ディメンション・メンバーに追加する必要のあるものはすべて即座に更新されます。パフォーマンス上の理由から、FALSEはコンパイルの実行前に大量の変更を行う場合のみ指定してください。この場合、アナリティック・ワークスペース・オブジェクトの値が有効になる前(たとえば、属性値が下位レベルに広がる前や時間ディメンションの値セットを更新する前など)に、キューブ・ディメンションを明示的にコンパイルする必要があります(キューブ・ディメンションの明示的なコンパイルを参照)。

例10-170 OLAPキューブ・ディメンションの階層の変更

my_timeという階層キューブ・ディメンションがあり、その階層を変更するために値L3_2を最上位レベルからL2_2の子になるレベルに移動するとします。

  1. 次のSQL文を実行して、移動前のmy_timeキューブ・ディメンションの値についてレポートを生成します。

    select dim_key||'  '||level_name||'  '||parent
        from my_time_lvl_hier_view
        order by dim_key asc;
     
    DIM_KEY||''||LEVEL_NAME||''||PARENT
    --------------------------------------------------------------------------------
    L1_0  L1
    L1_1  L1
    L2_1  L2  L1_1
    L2_2  L2  L1_1
    L3_1  L3  L2_1
    L3_2  L3  L2_1
    L3_3  L3  L2_1
    L3_4  L3  L2_2
    L3_5  L3  L2_2
     
    9 rows selected.
     
  2. 次のPL/SQL文を発行し、ユーザー作成のMOVE_L3_3プログラムをコールして移動を実行します。

    exec dbms_aw.execute('call my_util_aw!move_l3_3');
    

    次に示すMOVE_L3_3プログラムの定義から確認できるように、実際の移動はOLAP DMLから提供されるPDATE_DIMENSION_MEMBERプログラムをコールすることで実行されます。

    DEFINE MOVE_L3_3 PROGRAM
    PROGRAM
     
      " Change the parent of L3_2 to L2_2
      CALL UPDATE_DIMENSION_MEMBER('L3_3', 'my_time', NA, 'L3', 'L2_2')
      UPDATE
      C0MMIT
    END
    
  3. 次の文を発行して、移動後のmy_timeディメンションの値についてレポートを生成します。

    select dim_key||'  '||level_name||'  '||parent
         from my_time_lvl_hier_view
         order by dim_key asc;
     
    DIM_KEY||''||LEVEL_NAME||''||PARENT
    --------------------------------------------------------------------------------
    L1_0  L1
    L1_1  L1
    L2_1  L2  L1_1
    L2_2  L2  L1_1
    L3_1  L3  L2_1
    L3_2  L3  L2_1
    L3_3  L3  L2_2
    L3_4  L3  L2_2
    L3_5  L3  L2_2
     
    9 rows selected.
     
  4. 次の文を発行し、my_timeの新しい階層でmy_cubeを解決します。

    exec dbms_cube.build(script => 'MY_CUBE USING (SOLVE)', add_dimensions => false);
     
  5. my_timeの階層が新しくなったので、次の文を発行して、salesおよびmoving_sales(my_cubeのメジャー)の値に関するレポートを生成します。

    select my_time||'  '||lpad(sales, 2)||'  '||lpad(moving_sales, 2)
         from my_cube_view
         order by my_time asc;
     
    MY_TIME||''||LPAD(SALES,2)||''||LPAD(MOVING_SALES,2)
    --------------------------------------------------------------------
    L1_0  24  24
    L1_1  14  38
    L2_1   2   2
    L2_2  12  14
    L3_1   1   1
    L3_2   1   2
    L3_3  10  11
    L3_4   1  11
    L3_5   1   2
     
    9 rows selected.

VARIABLE

OLAP DMLプログラムの内部では、VARIABLEコマンドは、OLAP DMLプログラムの内部で使用するローカル変数や値セットを宣言するコマンドです。ローカル変数はディメンションを保持できず、プログラムの実行中にのみ存在します。

関連項目:

DEFINE VARIABLEコマンド

構文

VARIABLE name {datatype|dimension|VALUESET dim}

パラメータ

name

ローカル変数または値セットの名前。既存のアナリティック・ワークスペース・オブジェクトと同じ名前を使用すると、アナリティック・ワークスペース・オブジェクトよりもローカル変数や値セットの方が優先されます。変数または値セットに値を割り当てると、その値はVARIABLE文が出現するプログラムの内部で使用できるようになります。変数または値セットに名前を付ける場合は、アナリティック・ワークスペース・オブジェクトのネーミング規則に従います(DEFINEコマンドを参照)。

datatype

格納されるデータの種類を示す変数のデータ型。DEFINE VARIABLEの項にリストおよび説明されている任意のデータ型を指定できます。また、プログラムが引数を特定のデータ型に変換することなく受け取ることができるようにする場合、そのデータ型のWORKSHEETを指定することもできます。

dimension

nameが、指定したディメンションの単一の値を保持するリレーション変数であることを示します。この変数には、ディメンションの値または指定したディメンションの位置(INTEGER)を格納できます。現在ディメンションに存在しない値を代入すると、エラーが発生します。

VALUESET dim

nameが値セットであることを示します。dim引数には、値セットが値を保持するディメンションの名前を指定します。

使用上の注意

ローカル変数の永続性

ローカル変数または値セットは、これを指定したプログラムが実行されている間のみ存在します。プログラムが終了すると、変数または値セットは存在しなくなり、その値は失われます。プログラムが終了するのは、RETURN文、SIGNAL文、プログラムの最後の行のいずれかが実行されたときです。プログラムが別のプログラムをコールすると、元のプログラムは一時的に停止しますが、変数や値セットはコールされたプログラムが終了しても存在し続け、元のプログラムに制御が戻されます。自身を再帰的にコールするプログラムには、プログラムの実行時コピーごとに個別のローカル変数または値セットがあります。

プログラム開始時の宣言

ローカル変数または値セットは、すべてプログラムの先頭、つまり実行可能な文の前に指定する必要があります。

ローカル変数または値セットの初期値

ローカル変数または値セットの初期値はNAです。

アナリティック・ワークスペース・オブジェクト名との重複

ローカル変数または値セットにアナリティック・ワークスペース・オブジェクトと同じ名前を付けると、プログラムの内部でローカル変数または値セットを参照しているものとみなされます。アナリティック・ワークスペース・オブジェクトが優先されるのは、アナリティック・ワークスペース・オブジェクトを引数として要求する文の場合のみです。

OBJファンクションおよびEXISTSファンクションは、引数としてアナリティック・ワークスペース・オブジェクトを必要としますが、ローカル・テキスト変数または値セットを使用してオブジェクトの名前を指定できます。

計算式およびモデル

計算式またはモデルではローカル変数や値セットを使用できません。

EXPORTコマンドとIMPORTコマンド

プログラム内でEXPORT(EIF)文を使用するとEIFファイルにローカル変数や値セットの値を格納できます。変数や値セットにアナリティック・ワークスペース・オブジェクトの名前を付けるには、ASキーワードを使用する必要があります。この名前は、ローカル変数や値セットの名前と同じでも構いません。IMPORT(EIF)を使用して値を取得すると、値はアナリティック・ワークスペース・オブジェクトとして格納されます。値をローカル変数や値セットにインポートすることはできません。

例10-171 ファイル・ユニット番号の保存

Data Reader文を使用して入力ファイルからデータを読み取るためのプログラムを作成するとします。最初にファイルを開いて、ファイルに割り当てられたファイル・ユニット番号の値を保存する必要があります。プログラムの先頭でunitというローカル変数を指定すると、ファイル・ユニット番号を保持できます。

DEFINE read.file PROGRAM
LD Read monthly sales data into the analytic workspace
PROGRAM
VARIABLE unit INTEGER
TRAP ON error
unit = FILEOPEN('sales.data' READ)
...

例10-172 ディメンション値を戻すプログラム

各地区の売上を分析し、売上が最高の地域の名前を返すプログラムを作成するとします。分析のために、このプログラムでは地区名を格納するローカル変数を定義します。プログラムが終了すると、ローカル変数の値が返されます。

DEFINE highsales PROGRAM
PROGRAM
VARIABLE districtname district
... "(statements that find the highest district)
RETURN districtname
END 

VNF

VNFコマンドは、日付のみのデータ型(DATE)を持つオブジェクト(DAY、WEEK、MONTH、QUARTERまたはYEAR型のディメンションを含む)の定義に値名書式(VNF)を割り当てるコマンドです。VNFは、日付のみの値の入力書式および表示書式を制御するテンプレートです。テンプレートには、期間を特定する構成要素(日、月、暦年、会計年度および会計年度内の期間)の書式を指定できます。

注意:

この文は、DATEデータ型のディメンション(つまり、DAY、WEEK、MONTH、QUARTERまたはYEAR型のディメンション)についてのみ使用できます。SQLの日時データ型に対応する日時データ型を持つ時間ディメンションや、TEXT型の階層ディメンションとして実装されているディメンションには使用できません

VNFを割り当てる定義は、最新の定義または現行のセッション中に検討された定義である必要があります。そうでない場合は、最初にCONSIDER文を使用し、現行の定義にする必要があります。

構文

VNF [template]

パラメータ

template

現行のディメンションの値を入力および表示するための書式を指定するテキスト式。templateを省略すると、現行の定義の既存のVNFは削除され、デフォルトのVNFが適用されます(「日付のみのディメンション値」の「DWMQYディメンションに対するデフォルトのVNF」表を参照)。

注意:

VNFに準拠しないディメンション値を入力すると、Oracle OLAPは値を日付として解釈しようとします。ディメンション値の日付としての入力を参照してください

テンプレートには、現行のディメンションの期間を説明するために使用する構成要素ごとにコードが記述されています。各構成要素のコードは、左の山カッコと右の山カッコで囲む必要があります。テンプレートのコーディングに関する基本的な情報は、表10-12表10-13および表10-14を参照してください。

次の表には、期間の構成要素に関する基本コードが記載されています。6月に終了するQUARTERディメンションである、MYQTRというサンプル・ディメンションを使用しています。この例は、1995年7月1日から9月30日までの四半期を基にしています。期間コード(P)は、会計年度内の期間の数値的な位置を指定します。Pコードはすべてのディメンションに使用できますが、FFコードまたはFFBコードと組み合せて使用する場合に限定されます。Bコードは、開始期間を指定します。

表10-12 VNFテンプレートの構成要素の基本コード

コード 意味 値の例

<D>

期間が終了する日付

30

<M>

期間が終了する月

9

<YY>

期間が終了する暦年

95

<FF>

会計年度が終了する暦年で指定する、対象期間を含む会計年度

96

<DB>

期間が開始される日付

1

<MB>

期間が開始される月

7

<YYB>

期間が開始される暦年

95

<FFB>

会計年度が開始される暦年で指定する、対象期間を含む会計年度

95

<P>

対象期間の会計年度内における数値的な位置

1

<NAME>

ディメンションの名前

MYQTR

次の表には、DAY、WEEK、MONTH、QUARTERまたはYEAR型のディメンションごとに、VNFで組み合せることが可能な構成要素の組合せが記載されています。会計年度コード(FFまたはFFB)は、DAY、WEEK、MONTH、QUARTERまたはYEAR型のどのディメンションのテンプレートにも使用できます。ただし、会計年度コードは、WEEKディメンションや、フェーズ化されたMONTH、QUARTERおよびYEARディメンションでは特別な意味を持っています。その他のディメンションの場合、会計年度は暦年と同一です。WEEK型のディメンションの会計年度MONTH、QUARTERまたはYEAR型のディメンションの会計年度」およびDAY型のディメンションの会計年度を参照してください。

表10-13 VNFテンプレートで許可されている構成要素の組合せ

ディメンションの型 構成要素の組合せ 値の例

DAY、WEEK、MONTH、QUARTER、YEAR

<D> <M> <YY>

<DB> <MB> <YYB>

<P> <FF>

<P> <FFB>

31 3 96

1 4 95

1 96

1 95

MONTH、QUARTER、YEAR

<M> <YY>

<MB> <YYB>

<M> <FF>

<M> <FFB>

<MB> <FF>

<MB <FFB>

3 96

4 95

3 96

3 95

4 96

4 95

YEAR

<YY>

<FF>

<FFB>

96

96

95

表10-13に記載されている基本コードのかわりに、表10-14に記載されているいずれかの書式スタイルを代用できます。表10-13に記載されている構成要素のすべての組合せに<NAME>構成要素を追加できます。

構成要素の数が少なすぎるか多すぎるテンプレートは指定できません。VNFには、あいまいな部分のないディメンション値を入力できるようにする必要があります。あいまいさを排除するためのVNFのコーディングを参照してください。

ただし、特定の型のディメンションに使用できる構成要素の組合せのみを指定し、VNFで入力値の明確な解釈が可能な場合は、次に示すようにかなり柔軟にVNFテンプレートを指定できます。

  • 構成要素を任意の順序で指定できます。

  • 構成要素の前後や構成要素間にテキストを挿入できます。

表10-13に記載されている日、月、暦年、会計年度および期間の基本コードのかわりに、表10-14表10-15表10-16および表10-17に記載されている書式スタイルを代用できます。

表10-14 VNFテンプレートで使用可能な日の書式スタイル

書式 意味 1995年1月3日 2051年11月12日

<D>

1桁または2桁

3

12

<DD>

2桁

03

12

<DS>

空白詰め、2桁

3

12

表10-15 VNFテンプレートで使用可能な月の書式スタイル

書式 意味 1995年1月3日 2051年11月12日

<M>

1桁または2桁

1

11

<MM>

2桁

01

11

<MS>

空白詰め、2桁

1

11

<MTXT>

先頭の3文字、大文字

JAN

NOV

<MTXTL>

先頭の3文字、小文字

jan

nov

<MTEXT>

完全名、大文字

JANUARY

NOVEMBER

<MTEXTL>

完全名、小文字

january

november

MTXTMTXTLMTEXTおよびMTEXTLの場合、表示される実際の値は、次に示すようにMONTHNAMESオプションで指定した値によって異なります。

  • MTXTおよびMTEXTでは、MONTHNAMESオプションで指定した名前がすべて小文字の場合、名前全体が大文字に変換されます。そうでない場合は、最初の文字が大文字に変換され、2番目以降の文字は元のままです。

  • MTXTLおよびMTEXTLでは、MONTHNAMESオプションで指定した名前がすべて大文字の場合、名前全体が小文字に変換されます。そうでない場合は、最初の文字が小文字に変換され、2番目以降の文字は元のままです。

表10-16 VNFテンプレートで使用可能な年の書式スタイル

書式 意味 1995年1月3日 2051年11月12日

<YY>

2桁または4桁

95

2051

<YYYY>

4桁

1995

2051

<FF>

2桁または4桁

95

2051

<FFFF>

4桁

1995

2051

表10-17 VNFテンプレートで使用可能な期間の書式スタイル

書式 意味 1995年1月3日 2051年11月12日

<P>

1桁、2桁または3桁

3

316

<PP>

2桁または3桁

03

316

<PS>

空白詰め、2桁または3桁

3

316

<PPP>

3桁

003

316

<PPS>

空白詰め、3桁

3

316

使用上の注意

VNFの廃棄

あるディメンションのVNFを廃棄してデフォルトのVNFを使用するには、CONSIDER文を使用してディメンションの定義を現行の定義に設定してから、引数を指定せずにVNF文を使用します。

VNFテンプレートで山カッコをテキストとして指定する方法

テンプレート内に追加テキストとして山カッコを挿入するには、テキストとして挿入する山カッコごとに2つの山カッコを追加して指定します(たとえば、値全体を山カッコで囲んで表示するには、<<<D> <M> <YY>>>と指定します)。

月の名前

MTXTMTXTLMTEXTおよびMTEXTL書式の月の構成要素に使用される名前は、MONTHNAMESオプションの現行の設定から読み取ります。

会計年度コード

会計年度コード(FFまたはFFB)は、DAY、WEEK、MONTH、QUARTERまたはYEAR型のどのディメンションのテンプレートにも使用できます。

WEEK型のディメンションの会計年度

WEEK型のディメンションの場合、会計年度は、新しい暦年に終了する最初の期間(単一週または複数週)の開始日に始まります。会計年度は、期間全体が暦年に含まれる最終期間の最終日に終了します。

この定義は、WEEKディメンションの定義時にこのディメンションに指定した開始日または終了日にかかわらず有効です。ただし、会計年度では、(曜日または日付として)指定した開始日または終了日の曜日が考慮されます。

たとえば、myweekというWEEK型のディメンションを定義し、これに終了日が1995年6月2日(金曜日)の単一週の期間を設定したとします。1995年6月2日を含む会計年度は、1994年12月31日(日曜日)に始まり、1995年12月29日(金曜日)に終わります。myweekのVNFにFFコードがある場合、この会計年度は1995年と認識されます。VNFにFFBコードがある場合、会計年度は1994年と認識されます。

MONTH、QUARTERまたはYEAR型のディメンションの会計年度

開始フェーズや終了フェーズのないMONTH、QUARTERまたはYEAR型のディメンションの場合、会計年度は暦年と同一です。

開始フェーズや終了フェーズの設定されているMONTH、QUARTERまたはYEAR型のディメンションの場合、ディメンションの各会計年度は、開始フェーズの開始月から始まり、終了フェーズの終了月に終わります。

たとえば、MONTH型のディメンションであるmymonthを、3月に終了する4か月の期間と定義したとすると、各会計年度は4月1日に始まり3月31日に終わります。MYMONTHのVNFにFFコードを使用すると、1995年4月1日に始まり1996年3月31日に終わる会計年度は1996年と認識されます。FFBコードを使用すると、この会計年度は1995年と認識されます。

DAY型のディメンションの会計年度

DAY型のディメンションの場合、会計年度は暦年と同一です。

VNFにおける有効範囲外の年

VNFにYYYYBFFFFBのいずれかの書式が指定され、1950から2049年の範囲外となる年が表示の対象になっている場合、該当する年は4桁で表示されます。年を入力するときも、4桁すべてを入力する必要があります。

あいまいさを排除するためのVNFのコーディング

VNFテンプレートには、あいまいさを排除したディメンション値を入力できる必要があります。あいまいさを排除するには、VNFテンプレートをコーディングするときに次の制限事項を順守する必要があります。

  • 長さが指定されていないテキスト構成要素(たとえば、任意の長さの月の完全名を指定する<MTEXT>)の直後に文字を配置することは(構成要素のコードとリテラル・テキストのどちらの場合でも)できません。

  • 長さが指定されていない数値の構成要素(たとえば、1桁または2桁になる<M>や、2桁または4桁になる<YY>)の直後に数字を配置することは(構成要素のコードとリテラル・テキストのどちらの場合でも)できません。

モデル・ディメンションに対するVNFのコーディング

DAY、WEEK、MONTH、QUARTERまたはYEAR型のディメンションに基づく方程式を含むモデルを定義した場合、このディメンションのVNFには、次の書式特性(値は文字で始まり、値には文字、数字、アンダースコアおよびピリオドのみが使用できる)を持つディメンション値を指定する必要があります。

ディメンション値の入力

VNFをDAY、WEEK、MONTH、QUARTERまたはYEAR型のディメンションに割り当てると、このディメンションに値を入力するためにデフォルトのVNFを使用することはできなくなります。設定したVNFの書式か、または日付として値を入力する必要があります。

VNF書式でのディメンション値の入力

VNF書式でディメンション値を入力する場合は、次のような柔軟性があります。

  • 文字は、(構成要素のコードとリテラル・テキストのどちらの場合でも)VNFに指定されている大文字の使用法に厳密に合せる必要はなく、大文字と小文字を自由に使用できます。

  • 月の名前の先頭の3文字を示す<MTXT>または<MTXTL>をテンプレートに指定した場合は、先頭の3文字から完全名まで、必要な文字数の月の名前を入力できます。長さが不定の月の名前を示す<MTEXT>または<MTEXTL>をテンプレートに指定した場合は、先頭の文字から完全名まで、必要な文字数の月の名前を入力できます。ただし、いずれの場合も、MONTHNAMESオプションで名前を一意に識別するために十分な文字数を入力する必要があります。たとえば、AprilとAugustを区別するには、少なくともこれらの名前の先頭の2文字を入力する必要があります。

  • ディメンション値の構成要素間やテキスト要素間には、空白を必要なだけ挿入できます。

  • 特定のディメンションの期間を指定するために必須ではない日付の構成要素がテンプレートに含まれる場合は、目的の期間内の任意の日付を指定できます。たとえば、テンプレート<DD><MTXT><YY><DD>構成要素は、MONTHディメンションの期間を指定するために必須の構成要素ではありません。したがって、1995年6月の場合、01JUN95から30JUN95までの任意の日付を指定できます。

ディメンション値の日付としての入力

DAY、WEEK、MONTH、QUARTERまたはYEAR型のディメンションの値を日付として入力する場合は、DATEORDERの項に記載されているいずれかの入力スタイルを使用できます。日付として年月日をすべて指定すると、Oracle OLAPはDATEORDERオプションを使用してあいまいさを解消します。ただし、指定する必要があるのは、使用しているディメンションの型に該当する日付構成要素のみです。

  • DAYまたはWEEKディメンションの場合は、すべての構成要素(年、月、日)を入力する必要があります。

  • MONTHまたはQUARTERディメンションの場合は、月と年の構成要素のみを入力する必要があります。'0106'のようなあいまいな値を入力すると、あいまいさを解消するために、DATEORDERオプションの先頭の2文字が使用されます。したがってこの状況では、DATEORDERオプションをMYDまたはYMDにする必要があります。

  • YEARディメンションの場合、入力する必要があるのは年のみです。

VNFの変更

DAY、WEEK、MONTH、QUARTERまたはYEAR型のディメンションの値を表示する場合の柔軟性として、VNF引数を指定したCONVERTファンクションを使用して、ディメンションのVNF(およびディメンションに独自のVNFがない場合はデフォルトのVNF)を変更できることがあげられます。

CONVERTにVNF引数を指定すると、VNF文のテンプレート内で使用できるすべてのテンプレート・コードを記述できますが、この引数を指定しても、値の識別に必要な数よりも構成要素を過度に少なく指定したり多く指定したりすることができなくなるわけではありません。さらに、VNF引数を指定すると、VNFテンプレートでは許可されない追加コードを使用できます。

例10-173 MONTH型のディメンションへのVNFの割当て

次の文を実行すると、monthというMONTH型の既存のディメンションに対してVNFが割り当てられます。

CONSIDER month
VNF <mtextl>, <yyyy>

例10-174 MONTH型のディメンションへの値の追加

次の文を実行すると、VNFの<MTEXTL>コードで指定した完全名ではなく、月の名前を識別するのに必要十分な文字数を使用して、新しいVNFのスタイルでディメンション値が追加されます。

MAINTAIN month ADD 'JA, 1995' 'MAR, 1995'
Limit month TO LAST 3
REPORT month

これらの文によって生成される出力は次のとおりです。

MONTH
--------------
January, 1995
February, 1995
March, 1995

Oracle OLAPでは、MAINTAIN文で指定した期間の間にある期間が自動的に追加されます。

例10-175 VNFのWEEKへの割当て

次の文を実行すると、weekというWEEK型のディメンションが定義され、VNFがweekの定義に追加されて、値がweekディメンションに追加されます。

DEFINE week DIMENSION WEEK
VNF Week <p>.<ff>
MAINTAIN week ADD '01JAN95' '30JAN95'
REPORT week

これらの文によって生成される出力は次のとおりです。

WEEK
--------------
Week 1.95
Week 2.95
Week 3.95
Week 4.95
Week 5.95

MAINTAIN文を使用して値をweekディメンションに追加する場合は、新しい値をVNFに準拠する値ではなく、日付として指定できます。ただし、目的の書式で出力を表示するためにVNFが使用されます。

WHILE

WHILEコマンドは、ブール式が返す値がTRUEの間、文を繰り返し実行するコマンドです。WHILEは、プログラムの内部でのみ使用できます。

構文

WHILE boolean-expression     statement block

パラメータ

boolean-expression

文を実行するための条件として機能します。この式がTRUEの間、は繰り返し実行されます。この式がFALSEになると、の実行は終了し、プログラムは引き続き次の行の実行に移ります。(または複数の文)の記述によって、ブール式が最終的にはFALSEになる必要がありますが、そうしないと、このコードは無限ループになります。

statement block

ブール式がTRUEの間に実行される1つ以上の文。DO ... DOENDの間に文を記述することにより、複数の文を実行できます。DO文はWHILE文の直後に記述する必要があります。

使用上の注意

WHILEとIFとの比較

WHILE文は、主にIF...THEN...ELSEコマンドのかわりに使用されます。ブール式がTRUEの間、プログラム内の1つ以上の文を繰り返し実行する場合は、WHILEを使用します。ブール式がTRUEのときに一度のみ実行する場合は、IFを使用します。

ブール定数

ブール式には定数を指定できます。文がWHILE TRUEの場合は、プログラムがループを終了できるように、DO ... DOENDの間にBREAK、RETURNまたはEXIT文を必ず記述してください。

ループ内での分岐

BREAK、CONTINUE、GOTOの各コマンドを使用すると、WHILEループの内部または外部に分岐し、それによって文の実行順序を変更できます。

例10-176 プログラム内でのWHILEループの使用

次のプログラム行では、DOの後の文は、ブール式count LT 10TRUEである場合に実行されます。ループの内部で、このコードはある条件のインスタンスを検索し、見つかるとcount1を追加します。count10に到達すると、ループは終了します。ループ内のコードでは、countがいつかは必ず10になるようにします。そうしないと、ループは永遠に終了しません。

WHILE count LT 10
   DO
    ..." (statements)
    IF ....
      count = count + 1
   DOEND

ZEROTOTAL

ZEROTOTALコマンドは、指定したレポート列の1つまたはすべての小計をゼロにリセットするコマンドです。ZEROTOTALコマンドは、ROWコマンドを使用してレポートを生成するときに使用します。

注意:

ZEROTOTALは、RUNTOTALファンクションおよびSUBSTRファンクションから返される結果に影響します。

構文

ZEROTOTAL [{n|ALL} [column1 columnN]]

パラメータ

引数を指定しないでZEROTOTALを実行すると、すべての列のすべての小計がゼロにリセットされます。

n

レポートの数値列ごとに累計された32の小計(1から32まで)のうち1つを指定するINTEGER式。指定した列では、この小計はゼロに設定されます。

ALL

指定した列の32の小計すべてをゼロに設定します。引数が指定されていない場合、ALLはデフォルトになります。特定の列のすべての小計をゼロにリセットするには、文にALLを記述する必要があります。

ZEROTOTAL ALL 1 4 7
column

レポート列の列数。列番号1とは、その列に格納されているデータの型にかかわらず、レポートの左端列のことを指します。列番号の引数を指定しなかった場合、レポートのすべての列を対象に、指定した小計(またはすべての小計)がゼロに設定されます。

使用上の注意

列の小計の初期化

ROWコマンドを使用してレポートを作成する場合は、レポート・プログラムの冒頭にZEROTOTAL文を使用して、すべての列の32の小計すべてをゼロに初期化してください。REPORT文は、出力を生成する前に、自動的にすべての小計をゼロにリセットします。

列の小計のリセット

一部の小計のみをリセットする場合や、これまでに累計した小計を挿入せずに新しい小計の累計を開始する場合にも、レポート・プログラムにZEROTOTALを使用できます。SUBSTRファンクションを使用して小計自体の列で小計にアクセスすると、小計は自動的にゼロにリセットされます。ただし、RUNTOTALファンクションを使用して小計にアクセスした場合は、ゼロにリセットされません。

例10-177 すべてのレポート列の小計のリセット

あるレポートで、総売上高(ドル単位)と、その後に各地区ごとの売上数量の詳細サマリーを表示するとします。さらに、レポートの最後に売上数量の合計を表示しますが、この合計には売上高(ドル単位)の数字は含まれないようにします。総売上高(ドル単位)を算出したら、ZEROTOTALを使用してすべての小計をゼロにリセットします。こうすると、後でこのレポートでSUBTOTAL(1)を使用したときに、地区ごとの売上数量のみが合計されます。

次のステートメント行がプログラムにあるとします。

LIMIT product TO 'Footwear'
LIMIT month TO 'Jul96' TO 'Sep96'
ROW 'Total Dollar Sales' ACROSS month: -
   DECIMAL 0 TOTAL(sales month)
BLANK
ROW 'Unit Sales'
ZEROTOTAL ALL
FOR district
   ROW INDENT 5 district ACROSS month: units
ROW 'Total Unit Sales' ACROSS month: -
   OVER '-' SUBTOTAL(1)

これらの文によって生成される出力は次のとおりです。

Total Dollar Sales      607,552    581,229    658,850
 
Unit Sales
     Boston               3,538      3,369      3,875
     Atlanta              4,058      3,866      4,251
     Chicago              3,943      3,509      4,058
     Dallas                 814        824        867
     Denver               1,581      1,532      1,667
     Seattle              2,053      2,193      2,617
                     ---------- ---------- ----------
Total Unit Sales      15,987.00  15,293.00  17,335.00