SETコマンド(代入文または=コマンドともいう)は、1つ以上の値を変数、オプション、リレーションまたはディメンション・サロゲートに代入するコマンドです。オブジェクトに1つ以上のディメンションがある場合、SETコマンドはターゲット・オブジェクトの各ディメンションについてステータスにある値をループ処理し、ターゲット・オブジェクトの対応するセルにデータ値を代入します。
ターゲット・オブジェクトがディメンション・リストのコンポジットで定義されている場合、非NA
値が代入されるターゲット・セルが欠落していると、Oracle OLAPはそれを自動的に作成します。このステップでは、その新しいセルに対応するすべてのディメンション値の組合せもコンポジットに追加されます。したがって、ターゲット・オブジェクトおよびコンポジットは、代入後にサイズが大きくなることがあります。ターゲットにすでに存在しているセルにのみ値を代入する場合は、ACROSSキーワードを使用します。
注意: SETとともにUNRAVELを使用すると、式のディメンションが変数のディメンションと異なる場合に、その式の値を変数のセルに代入できます。 |
パラメータ
SETはオプションです。この機能の古いコマンド形式であり、互換性を維持するために対応しています。
データを代入して格納するターゲット・オブジェクトの名前。ターゲット・オブジェクトにすることができるアナリティック・ワークスペース・オブジェクトのリストは、表10-9「代入文でのオブジェクトの使用」を参照してください。
=(代入または等号)演算子は、1つ以上の値を変数、オプションまたはリレーションに代入します。「代入演算子」も参照してください。
ターゲット・オブジェクトに代入するデータ値のソース。表10-9「代入文でのオブジェクトの使用」を参照してください。
コンポジットでディメンション化された変数にデータを代入する場合、デフォルトの動作はオブジェクトの各ベース・ディメンションのステータスにあるすべての値をループ処理します。Oracle OLAPは、非NA
値が代入されるターゲット・セルが欠落している場合、それを自動的に作成し、必要なディメンション値の組合せをコンポジットに追加します。
コンポジットで定義されている変数の既存のセルにのみ値を代入する場合は、ACROSSキーワードを使用しますが、このキーワードは、コンポジットの一部であるターゲットのディメンションに対して=がループを実行する方法を変更します。=は、そのディメンションのステータスにある値の可能なすべての組合せをループするのではなく、コンポジットにすでに存在するステータスにある値の組合せのみをループします。
ACROSSキーワードは、コンポジットを指定するために使用します。ただし、コンポジットではなく、コンポジットのベース・ディメンションを指定する場合は、代入文によってコンポジットに多数の値が追加されることがあるので注意してください。
使用上の注意
代入文実行時におけるプログラム実行のトリガー
TRIGGERコマンドを使用すると、SET文を、OLAP DMLプログラムを自動的に実行するイベントにすることができます。詳細は、「トリガー・プログラム」を参照してください。
ディメンション性とパフォーマンス
ターゲットに複数のディメンションがある場合、=文は、デフォルトのステータスで反映される論理的な順序に関係なく、追加された順序でディメンション値をループします。多次元の場合、複合ディメンションに対してループされます。定義にリストされている最初のディメンションが最も速く変化します。ターゲットを式の値に設定する場合、ソースの式がターゲットと同じディメンションで同じ順序であると、Oracle OLAPのパフォーマンスはさらに向上します。
式中の異なるディメンションの変数
代入文に異なるディメンションのオブジェクトが複数含まれる場合、計算が複雑になります。複雑な代入文の処理を次にまとめます。A = Bという文において、Aは式Bに設定されるオブジェクトですが、Oracle OLAPは最初にAのディメンションを判別します。次にそのディメンションのステータスを判別します。ディメンションのステータスにあるディメンション値の組合せごとに、次のように処理されます。
Oracle OLAPは、設定するAの単一の値(セルともいう)を決定します。
式Bの各構成要素(変数、計算式、ファンクション、修飾データ参照またはリテラル)について、Oracle OLAPは設定するAのセルに対応する単一の値を決定します。式の構成要素がディメンション化されていない場合またはリテラルである場合、Oracle OLAPは単純にその値を使用します。式の構成要素がAとは異なるディメンションを持つ場合、Oracle OLAPはそのディメンションのステータスにある最初の値を使用します。
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_id
のTEXT
型のサロゲートであり、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
という名前の変数の値がBoston
、Tents
および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
次の例は、time
、product
および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
についてのみディメンション値の組合せを作成します。