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

前
 
次
 

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「代入文でのオブジェクトの使用」に、代入文で使用できるオブジェクトと、それらがターゲット式またはソース式として使用可能かどうかを示します。

表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はそのディメンションのベース・ディメンション値に対する関係を使用してデータを正しいセルに代入します。結合ディメンションでディメンション化されている変数の値は、ベース・ディメンションのいずれかでディメンション化されている式に代入できます。その逆も当てはまります。「データの緻密化」を参照してください。

モデルでの方程式のルール

モデルの方程式は、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_Chapter 9, "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についてのみディメンション値の組合せを作成します。