この章では、次の項目について説明します。
他の言語と同様、OLAP DMLのデータ型は、値や値に対して1つ以上の演算を定義したものの種類です。
Oracle OLAP DMLでは、表2-1「OLAP DMLのデータ型の一覧」に示すデータ型をサポートしています。
表2-1 OLAP DMLのデータ型の一覧
データ型 | 略称 | 説明 |
---|---|---|
|
BOOL |
|
|
なし |
同じ名前のSQLのデータ型には対応しません。OLAP DML固有の古いデータ型です。 A.D.1000年1月1日からA.D.9999年12月31日までの範囲の日、月および年のデータ(時と分のデータは含みません)。 |
|
なし |
SQLの B.C.4712年1月1日からA.D.9999年12月31日までの日付を指定します。デフォルトの書式は、 |
|
なし |
SQLの 日付値(年、月および日)と時刻値(時、分および秒)で、 |
|
なし |
SQLの
|
|
SQLの
デフォルトの書式は、 |
|
|
なし |
SQLの 日、時、分および秒で期間を格納します。 |
|
なし |
SQLの 年と月で期間を格納します。 |
|
INT |
(-2**31)から(2**31)-1の整数。 |
|
SHORTINT |
(-2**15)から(2**15)-1の整数。 |
|
LONGINT |
(-2**63)から(2**63)-1の整数。 |
|
DEC |
-(10**308)から+(10**308)の小数(最大有効桁数15桁)。 |
|
SHORT |
-(10**38)から+(10**38)の小数(最大有効桁数7桁)。 |
|
なし |
-(10**125)から+(10**125)の小数(最大有効桁数38桁)。 |
|
なし |
データベース・キャラクタ・セットで1行に最大32,767バイト。このデータ型は、データベースの |
|
なし |
UTF-8文字コードで1行に最大32,767バイト。このデータ型は、データベースの |
|
なし |
データベース・キャラクタ・セットで1行にシングルバイト文字で最大8文字。( |
|
なし |
長さがsizeバイトのRAWバイナリ・データ。最大サイズは2000バイト。RAW値に対してサイズの指定が必須です。ただし、このデータ型の変数を定義する際は、変数値に対する最大文字数を |
|
なし。 |
表の行のアドレスを一意に表すBASE64文字列。主に、ROWID疑似列によって返される値のためのデータ型です。 |
|
なし |
索引編成表の行の論理アドレスを表すBASE64文字列。オプションのsizeは、UROWID型の列のサイズです。最大サイズおよびデフォルトは4,000バイトです。 |
|
値を特定のデータ型に変換せずに引数を処理する場合に、OLAP DMLプログラムの引数および一時変数に指定します。WKSDATAファンクションを使用して、 |
データ型のカテゴリ
通常、データ型が属するカテゴリとデータ型は、次のとおりです。
数値データ型: INTEGER
、SHORTINTEGER
、LONGINTEGER
、DECIMAL
、SHORTDECIMAL
およびNUMBER
テキスト・データ型: TEXT
、NTEXT
およびID
日時データ型と期間データ型: 日時データ型はDATETIME
、TIMESTAMP
、TIMESTAMP_TZ
およびTIMESTAMP-LTZ
、期間データ型はDSINTERVAL
およびYMINTERVAL
。
日付のみのデータ型: OLAP DML固有のDATE
データ型
ブール・データ型: BOOLEAN
行識別子データ型: ROWIDとUROWID
各OLAP DMLデータ・オブジェクトで使用できるデータ型の種類
オブジェクトの種類により、その値で使用されるデータ型が異なります。
変数では、すべてのデータ型がサポートされています。
ディメンションとサロゲートでは、INTEGER
、NUMBER
、TEXT
、ID
(単純なディメンションのみ)、NTEXT
、DATETIME
、TIMESTAMP
、TIMESTAMP_TZ
、TIMESTAMP-LTZ
、DSINTERVAL
およびYMINTERVAL
のデータ型がサポートされています。また、DEFINE DIMENSION(DWMQY)文を使用してDAY、WEEK、MONTH、QUARTERおよびYEAR型のディメンションを定義する場合、そのディメンションの値のデータ型は、日付
のみになります。
表2-2「OLAP DMLの数値データ型」に示す数値データ型がサポートされています。
表2-2 OLAP DMLの数値データ型
データ型 | データ値 |
---|---|
|
(-2**31)から(2**31)-1の整数。 |
|
(-2**15)から(2**15)-1の整数。 |
|
(-2**63)から(2**63)-1の整数。 |
|
-(10**308)から+(10**308)の小数(最大有効桁数15桁)。 |
|
-(10**38)から+(10**38)の小数(最大有効桁数7桁)。 |
|
-(10**125)から+(10**125)の小数(最大有効桁数38桁)。 |
データを入力する場合、これらのデータ型のどの値も、プラス記号(+)またはマイナス記号(-)で始めることができますが、カンマを含めることはできません。ただし、他の数式に続く負の数の前にはカンマが必要で、カンマがない場合は、マイナス記号は減算演算子として解釈されることに注意してください。また、小数値には小数点を使用できます。データを表示する際、桁区切りおよび小数点は、NLS_NUMERIC_CHARACTERSオプションによって制御されます。
ほとんどの数値データ型は、値が範囲外の場合、NA
を返します。ただし、LONGINTEGER
データ型にはオーバーフロー保護機能がないため、計算結果が範囲外の数値になるような場合、不適切な値が返されます。このことが問題になる場合は、LONGINTEGER
のかわりにNUMBER
データ型を使用してください。
NUMBER
変数を定義する場合、必要以上に大きくない適切なその精度(p)およびスケール(s)を指定できます。精度とは有効桁数を指します。スケールには正または負を指定できます。正のスケールは小数点の右側の桁数を識別し、負のスケールは小数点の左側の桁数を識別しますが、この部分は四捨五入される場合があります。
NUMBER
データ型は、Oracle Databaseの標準ライブラリによってサポートされ、SQLでの動作と同様に動作します。テキスト・データ型またはINTEGER
データ型が適切でない場合に、ディメンションおよびサロゲートに使用されます。通常、計算(予測および集計など)に使用されない変数に代入され、データベースの丸め処理に一致する必要がある変数、または高い精度が要求される変数に使用されます。変数にNUMBER
データ型を割り当てるかどうかを判断する場合、パフォーマンスを最適化するために次の点に注意してください。
NUMBER
値はハードウェア(速度優先)ではなくソフトウェア(精度優先)で計算されるため、アナリティック・ワークスペースにおけるNUMBER
変数の計算は、他の数値データ型より遅くなります。
アナリティック・ワークスペースからNUMBER
データ型が含まれるリレーショナル列にデータがフェッチされる場合、アナリティック・ワークスペースでデータにNUMBER
データ型が含まれている場合には、変換手順が不要なため、パフォーマンスが最適化されます。
Oracle OLAPでは、表2-3「OLAP DMLのテキスト・データ型」に示すテキスト・データ型がサポートされています。
表2-3 OLAP DMLのテキスト・データ型
データ型 | データ値 |
---|---|
|
データベース・キャラクタ・セットで1行に最大32,767バイト。このデータ型は、データベースの |
|
UTF-8文字コードで1行に最大32,767バイト。このデータ型は、データベースの |
|
データベース・キャラクタ・セットで1行にシングルバイト文字で最大8文字。( |
テキスト・リテラルは、一重引用符で囲む必要があります。Oracle OLAPは、引用符で囲まれていない英数字をオブジェクト名として認識し、二重引用符はコメントの開始として認識します。
引用符付き文字列内に引用符付き文字列を埋め込むことができますが、これは、コンポジットまたは結合ディメンションのベース・ディメンション値を指定する場合、または値にアポストロフィが含まれている場合に必要となる処理です。Oracle OLAPでは、テキスト文字列であることを示すために一重引用符が使用されるため、一重引用符は、テキスト文字列の中で使用される場合は特殊記号とみなされます。したがって、テキスト文字列内で一重引用符のリテラル値を指定する場合は、引用符の前にバックスラッシュを付けます。
たとえば、New
York
およびApple
Sauce
がmarkprod
結合ディメンションのベース・ディメンション値の有効な組合せであるかどうかを確認するとします。次の文によって、YESまたはNO
の結果が返されます。
SHOW ISVALUE(markprod, '<\'New York\' \'Apple Sauce\'>')
埋込みの引用符付き文字列にさらに次のレベルの埋込みがある場合、次の文に示すように、「Joe's Deli」のアポストロフィや、その前に置く必要があるバックスラッシュなどの特殊文字の前にはそれぞれ、バックスラッシュを使用する必要があります。
SHOW ISVALUE(markprod, '<\'Joe\\\'s Deli\' \'Apple Sauce\'>')
表2-4「認識されるエスケープ・シーケンス」は、Oracle OLAPによって認識されるエスケープ・シーケンスを示しています。
表2-4 認識されるエスケープ・シーケンス
シーケンス | 意味 |
---|---|
|
バックスペース。 |
|
改ページ。 |
|
ライン・フィード(改行)。 |
|
キャリッジ・リターン(改行)。 |
|
水平タブ。 |
|
二重引用符。 |
|
一重引用符。 |
|
バックスラッシュ。 |
|
ASCIIコードnnn(10進)の文字。 |
|
ASCIIコードnn(16進)の文字。 |
|
Unicode nnnnの文字で、 |
Oracle OLAP DMLのDATEデータ型は、同じ名前のSQLのデータ型に対応しません。むしろ、OLAP DML固有の古いデータ型です。OLAP DMLのDATE
データ型は、変数と、DAY、WEEK、MONTH、QUARTERおよびYEAR型のディメンションに対して有効なデータ型です(DEFINE DIMENSION(DWMQY)コマンドの項を参照)。A.D.1000年1月1日からA.D.9999年12月31日までの日、月および年のデータ(時と分のデータは含まない)を格納するのに使用されます。OLAP DMLのDATE
データ型は時と分のデータは含まないため、通常、日付のみのデータ型と呼ばれます。
DATE型の有効な入力リテラル値は、数値、パック数値または月名という3つのスタイルのいずれか1つに従う必要があります。これらのスタイルは、セッション全体で混在していても構いません。
数値スタイル
次のルールに基づき、日、月、年を3つのINTEGER
値と1つ以上のセパレータを使用して指定します。
日および月の構成要素には、1桁または2桁を使用できます。
すべての年について、年の構成要素として4桁を使用できます(1997など)。1950から2049年の範囲内の年については、年の構成要素として2桁も使用できます(50は1950を表す、など)。
各要素間のセパレータには、空白、ダッシュ(-
)、スラッシュ(/
)、コロン(:
)またはカンマ(,
)を使用できます。
例: '24/4/97'
または'24-04-1997'
パック数値スタイル
次のルールに基づき、日、月、年を3つのINTEGER
値を使用して指定します。ここではセパレータは使用しません。
日および月の構成要素は、2桁である必要があります。日または月が10より小さい場合は、前にゼロを付けます。
すべての年について、年の構成要素として4桁を使用できます(1997など)。1950から2049年の範囲内の年については、年の構成要素として2桁も使用できます(50は1950を表す、など)。
日付の構成要素間にセパレータは使用できません。
例: '240497'
または'04241997'
月名スタイル
次のルールに基づき、日および年をINTEGER
値で、月をテキストで指定します。
月の構成要素は、MONTHNAMESオプションでリストされている名前の1つに一致する必要があります。MONTHNAMES内の名前の先頭に一意で一致するのに十分な文字数である場合に、月の名前は1文字またはそれ以上の数の文字に略すことができます。月の構成要素の大文字/小文字は、MONTHNAMESの大文字/小文字と一致している必要はありません。
日の構成要素には、1桁または2桁を使用できます。
すべての年について、年の構成要素として4桁を使用できます(1997など)。1950から2049年の範囲内の年については、年の構成要素として2桁も使用できます(50は1950を表す、など)。
日と年の構成要素が隣接しているときは、それらの構成要素間に少なくとも1つのセパレータが必要です。セパレータには、空白、ダッシュ(-
)、スラッシュ(/
)、コロン(:
)またはカンマ(,
)を使用できます。必要に応じて、日と月の間、または年と月の間に1つ以上のセパレータを配置できます。
例: '24APR97'
、'24 ap 97'
または'April 24, 1997'
DAY型、WEEK型、MONTH型、QUARTER型またはYEAR型のディメンションについて、日付
のみの値の書式は、オブジェクトに関連付けられたVNF(値名書式)によって決定されます。VNFは、日付
のみの値の入力書式および表示書式を制御するテンプレートです。テンプレートには、期間を特定する構成要素(日、月、暦年、会計年度および会計年度内の期間)の書式を指定できます。VNFをオブジェクトと関連付けるには、VNF文をその定義に追加します。VNFをオブジェクトのディメンションに追加しない場合、オブジェクトではデフォルトのVNFが使用されます(表2-5「DWMQYディメンションに対するデフォルトのVNF」を参照)。
表2-5 DWMQYディメンションに対するデフォルトのVNF
ディメンションの型 | デフォルトのVNF | 例 |
---|---|---|
DAY |
<DD><MTXT><YY> |
01JAN95 |
WEEK |
W<P>.<FF> |
W1.95 |
複数のWEEK |
<NAME><P>.<FF> |
MYWEEK1.95 |
MONTH |
<MTXT><YY> |
JAN95 |
複数のMONTH |
<NAME><P>.<FF> |
MYMONTH1.95 |
QUARTER |
Q<P>.<FF> |
Q1.95 |
YEAR |
YR<YY> |
YR95 |
日付
のみの値では、入力書式と出力書式を個別に指定できます。あるスタイルで日付
のみの値を入力し、別のスタイルでそれらの値をレポートできます。
出力で日付
のみの変数値を表示する場合、書式はDATEFORMATオプションに基づきます。デフォルトの書式は、2桁の日付、3文字の月、および2桁の年です(たとえば、03MAR97
)。月名のテキストは、MONTHNAMESオプションに基づきます。月、日および年の構成要素の順序を変更するには、DATEORDERオプションを参照してください。
OLAP DMLには、SQLの日時データ型と期間データ型に対応するデータ型があります。表2-6「OLAP DMLの日時データ型および期間データ型と、対応するSQLのデータ型」に示されているように、データ型の名前はOLAP DMLとSQLでは異なります。
表2-6 OLAP DMLの日時データ型および期間データ型と、対応するSQLのデータ型
OLAP DMLのデータ型 | 対応するSQLのデータ型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
OLAP DMLの日時データ型は、DATETIME
、TIMESTAMP
、TIMESTAMP
_TZおよびTIMESTAMP
_LTZです。期間データ型は、YMINTERVAL
およびDSINTERVAL
です。日時と期間は両方ともフィールドで構成されています(「日時フィールドと期間フィールド」を参照)。
日時と期間は両方ともフィールドで構成されています。これらのフィールドの値によってデータ型の値が決まります。表2-7「日時フィールドと値」に、日時フィールドと、日時および期間で使用できる値を示します。
ヒント: 日時データの操作で予期しない結果を回避するには、DBTIMEZONEとSESSIONTIMEZONEを使用してデータベースとセッションのタイムゾーンを確認できます。タイムゾーンを手動で設定しなかった場合、Oracle Databaseではデフォルトでオペレーティング・システムのタイムゾーンが使用されます。オペレーティング・システムのタイムゾーンがOracleで有効でない場合は、Oracleは、協定世界時(UTC)(以前のグリニッジ標準時)をデフォルトの値として使用します。 |
表2-7 日時フィールドと値
日時フィールド | 日時データ型の有効な値 | 期間データ型の有効な値 |
---|---|---|
|
-4712から9999(0年を除きます) |
任意の正および負の整数 |
|
01から12 |
0から11 |
|
01から31(現行のNLS暦年のパラメータのルールに基づき、 |
任意の正および負の整数 |
|
00から23 |
0から23 |
|
00から59 |
0から59 |
|
00から59.9(n)(「9(n)」は秒の小数部の精度)。9(n)部分は |
0から59.9(n)。ただし、9(n)は期間の小数秒の精度。 |
|
-12から14(この範囲は夏時間の変更を保存します)。 |
適用なし |
(表の終わりの注意を参照) |
00から59。 |
適用なし |
|
すべてのタイムゾーン地域の完全なリストは、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。 |
適用なし |
|
|
適用なし |
注意: TIMEZONE_HOUR
とTIMEZONE_MINUTE
の両方を指定すると、書式+|- hh:mmのエンティティ(値は-12:59から+14:00の範囲)として解釈されます。
日時書式テンプレートは、文字列に格納する日時データの書式を示すテンプレートです。書式モデルによってデータベース内に格納された値の内部表現は変更されません。文字列を日付に変換する場合、書式モデルによってOracle Databaseによる文字列の解釈方法が決定されます。OLAP DML文では、書式モデルをTO_CHAR
およびTO_DATE
ファンクションの引数として使用して次を指定できます。
Oracleがデータベースから値を戻す場合に使用する書式
Oracleがデータベースに格納するために指定した値の書式
日時書式テンプレートは、次のファンクションで使用できます。
デフォルト書式以外の書式の文字値を日時値に変換するTO_*
日時ファンクション(TO_
*日時ファンクションとは、TO_CHAR
、TO_DATE
、TO_TIMESTAMP
、TO_TIMESTAMP_TZ
、TO_YMINTERVAL
およびTO_DSINTERVAL
です。)
TO_CHAR
ファンクション。このファンクションは、デフォルトの書式以外の書式の日時値を文字列に変換する場合(アプリケーションから日付を出力する場合など)に使用します。
デフォルトの日時書式は、NLS_DATE_FORMAT
初期化パラメータを使用すると明示的に、NLS_TERRITORY
初期化パラメータを使用すると暗黙的に指定されます。セッションのデフォルトの日時書式は、ALTER
SESSION
文で変更できます。このデフォルトを変更して、特定のOLAP DMLオブジェクトで使用する日時書式を指定するには、DATE_FORMATコマンドを使用して、オブジェクトの定義に日時書式を追加します。
次の書式設定のルールは、文字列値を日時値に変換する場合に適用されます(ただし、書式モデルで修飾子FX
またはFXFM
を使用して完全一致の書式検査を制御した場合は適用されません)。
先行ゼロを含む数値書式要素の桁がすべて指定されている場合は、日付文字列の書式文字列に含まれる句読点を省略できます。たとえば、MM、DD、YYなどの2桁の書式要素で、2ではなく02を指定する場合です。
日付文字列の書式文字列で最後にある時刻フィールドを省略できます。
日時書式要素と日付文字列内の対応する文字の一致に失敗した場合、かわりの書式要素が適用されます(表2-8「Oracleの書式一致」を参照)。
OLAP DMLのDATETIMEデータ型は、SQLのDATE
データ型に対応します。DATETIME
値の書式および言語は、NLS_DATE_FORMATオプションおよびNLS_DATE_LANGUAGEオプションの設定によって制御されます。DATETIME
データ型は、Oracle Databaseの標準ライブラリによってサポートされ、OLAP DMLではSQLのDATE
データ型の動作と同様に動作します。
DATETIME
値は文字列リテラルとして指定できます。また、TO_DATE
ファンクションを使用すると、文字または数値を日付値に変換できます。
DATETIME
値をリテラルとして指定するには、グレゴリオ暦を使用する必要があります。次の例のように、ANSIリテラルを指定できます。
DATETIME '1998-12-25'
ANSI日付リテラルには時刻部分がなく、'YYYY-MM-DD
'書式で正確に指定する必要があります。
または、次の例に示すように、TO_DATEファンクションを使用してDATETIME値を指定することもできます。
TO_DATE('98-DEC-25 17:30','YY-MON-DD HH24:MI')
OracleのDATETIME
値のデフォルトの日付書式テンプレートは、NLS_DATE_FORMAT
初期化パラメータで指定されます。この例の日付書式には、日を表す2桁の数値、月名の略称、年の最後の2桁および24時間指定が含まれています。
デフォルトの日時書式の文字値が日時式に使用されている場合は、日時値に自動的に変換されます。
時刻要素を含めずに日時値を指定すると、デフォルトの時刻として午前0時(24時間制で00:00:00または12時間制で12:00:00)に設定されます。日付を含めずに日時値を指定すると、デフォルトの日付として現在の月の第1日に設定されます。
DATETIME
の値には、常に日付と時刻の両方のフィールドが含まれます。したがって、式でDATETIME
値を使用する場合、問合せで時刻フィールドを指定するか、DATETIME
値の時刻フィールドが午前0時に設定されていることを確認する必要があります。そうでない場合、Oracleは、正しい結果を戻さない場合があります。TRUNC
(日付)ファンクションを使用して、時刻フィールドを午前0時に設定でき、または、問合せに、等価条件や非等価条件のかわりに大/小条件を含めることもできます。ただし、式に午前0時以外のDATETIME値が含まれる場合、正しい結果を得るためには、問合せで時刻フィールドを排除する必要があります。
SYSDATE
日付ファンクションは、現在のシステムの日付および時刻を返します。CURRENT_DATE
ファンクションは、現行のセッションの日付を返します。SYSDATE
、TO_*
日時ファンクション、およびデフォルトの日付書式の詳細は、「日時ファンクション」およびDATE_FORMATコマンドを参照してください。
TIMESTAMP
データ型は、DATETIME
データ型の拡張です。DATETIME
データ型の年、月および日に加えて、時、分および秒の値が格納されます。このデータ型は、正確な時刻値を格納する場合に有効です。
SHOW SYSDATE 26-JUL-06 DEFINE mytimestamp VARIABLE TIMESTAMP mytimestamp = SYSDATE COLWIDTH = 30 REPORT mytimestamp MYTIMESTAMP ------------------------------ 26-JUL-06 10.44.42 AM
TIMESTAMP
データ型には、年、月、日、時、分、秒および小数秒の値が格納されます。TIMESTAMP
をリテラルとして指定する場合、小数秒の精度値は次のように最大9桁の数になります。
TIMESTAMP '1997-01-31 09:26:50.124'
TIMESTAMP_TZ
は、SQLのTIMESTAMP WITH TIMEZONE
データ型に対応します。値にタイムゾーン・オフセットを含むTIMESTAMP
のバリアントです。タイムゾーン・オフセットは、ローカルの時刻とUTC(時および分)との差異です。このデータ型は、複数の地理的地域にまたがって日付情報を収集および評価する場合に役立ちます。
Oracleのタイムゾーン・データは、http://www.iana.org/time-zones
から入手できるパブリック・ドメイン情報に基づいています。ただし、このサイトから入手できる最新情報を反映しているとは限りません。
TIMESTAMP_TZ
データ型は、タイムゾーン・オフセットを含むTIMESTAMP
のバリアントです。TIMESTAMP_TZ
をリテラルとして指定する場合、小数秒の精度値は最大9桁の数になります。次に例を示します。
TIMESTAMP '1997-01-31 09:26:56.66 +02:00'
2つのTIMESTAMP_TZ値がUTCで同じ時刻を表している場合は、データに格納されているTIME
ZONE
のオフセットに関係なく同一とみなされます。たとえば、
TIMESTAMP '1999-04-15 8:00:00 -8:00'
前述の場合と次の場合は同等です。
TIMESTAMP '1999-04-15 11:00:00 -5:00'
つまり、太平洋標準時の午前8:00は、東部標準時の午前11:00と同等です。
UTCオフセットはTZR
(タイムゾーン・リージョン)書式要素で置き換えることができます。たとえば、次の例は上述の例と同じ値を示しています。
TIMESTAMP '1999-04-15 8:00:00 US/Pacific'
夏時間への切替時の境界を明確にするには、TZR
書式要素および対応するTZD
書式要素の両方を使用します。次のように指定すると、上述の例で確実に夏時間の値が返されます。
TIMESTAMP '1999-10-29 01:30:00 US/Pacific PDT'
日時式を使用してタイムゾーン・オフセットを表現することもできます。
ERROR_ON_OVERLAP_TIME
セッション・パラメータをTRUE
に設定していて、TZD
書式要素を追加しない場合、日時値が不明確であると、エラーが返されます。そのパラメータがFALSE
に設定されている場合、不明確な日時は、指定されている地域の標準時間として解釈されます。
TIMESTAMP_LTZ
は、SQLのTIMESTAMP WITH LOCAL TIMEZONE
データ型に対応します。値にタイムゾーン・オフセットを含むTIMESTAMP
のもう1つのバリアントです。これは、TIMESTAMP_LTZ
とは異なり、データベースに格納されるデータはデータベース・タイムゾーンに対して正規化され、タイムゾーン・オフセットは列データの一部として格納されません。ユーザーがデータを検索すると、Oracleはユーザーのローカル・セッション・タイムゾーンのデータを戻します。タイムゾーン・オフセットは、ローカルの時刻とUTC(時および分)との差異です。このデータ型は、2層アプリケーションのクライアント・システムでタイムゾーンの日付情報を表示する場合に有効です。
Oracleのタイムゾーン・データは、http://www.iana.org/time-zones
から入手できるパブリック・ドメイン情報に基づいています。ただし、このサイトから入手できる最新情報を反映しているとは限りません。
TIMESTAMP_LTZ
データ型は、TIMESTAMP_TZ
とは異なり、データベースに格納されるデータはデータベースのタイムゾーンに対して正規化されます。タイムゾーン・オフセットは列データの一部として格納されません。TIMESTAMP_LTZ
用のリテラルはありません。このデータ型の値は、その他の有効な日時リテラルを使用して表します。次の表に、TIMESTAMP_LTZ
値をオブジェクトに追加する場合に使用できる書式と、SHOWコマンドなどのOLAP DML文で返される各値の対応を示します。
値の追加時に指定する値 | 戻り値 |
---|---|
'19-FEB-2004' |
19-FEB-2004.00.00.000000 AM |
SYSTIMESTAMP |
19-FEB-04 02.54.36.497659 PM |
TO_TIMESTAMP('19-FEB-2004', 'DD-MON-YYYY')); |
19-FEB-04 12.00.00.000000 AM |
SYSDATE |
19-FEB-04 02.55.29.000000 PM |
TO_DATE('19-FEB-2004', 'DD-MON-YYYY')); |
19-FEB-04 12.00.00.000000 AM |
TIMESTAMP'2004-02-19 8:00:00 US/Pacific'); |
19-FEB-04 08.00.00.000000 AM |
指定した値に時刻コンポーネントがない場合(明示的または暗黙的に)、デフォルトの午前0時の値が戻されます。
YMINTERVAL
は、SQLのINTERVAL YEAR TO MONTH
データ型に対応します。YEAR
およびMONTH
日時フィールドを使用して期間が格納されます。このデータ型は、年および月の値のみが重要な場合に、2つの日時の値の正確な違いを表す場合に有効です。
YMINTERVAL
期間リテラルは、次の構文を使用して指定します。
INTERVAL 'integer [- integer ]' YEAR|MONTH [(precision) ] [TO YEAR | MONTH ]
ただし、
'integer [-integer]'
には、先行および後続のフィールドにリテラルの整数値を指定します。先行のフィールドがYEAR
で後続のフィールドがMONTH
の場合、月フィールドの整数値の範囲は0から11になります。
precision
は、先行フィールドの最大桁数です。先行フィールドの精度の有効範囲は0から9で、デフォルト値は2です。
後続のフィールドを指定する場合、先行のフィールドよりも下位の単位を指定する必要があります。たとえば、INTERVAL
'0-1
' MONTH
TO
YEAR
は無効です。
次のYMINTERVAL
リテラルは、123年2か月の期間を示します。
INTERVAL '123-2' YEAR(3) TO MONTH
リテラルの他の書式の例を次に示します。簡略バージョンも一部含みます。
期間リテラルの書式 | 解釈 |
---|---|
INTERVAL '123-2' YEAR(3) TO MONTH |
123年2か月の期間。先行のフィールドの精度がデフォルトの2桁を超える場合、精度を指定する必要がある。 |
INTERVAL '123' YEAR(3) |
123年0か月の期間。 |
INTERVAL '300' MONTH(3) |
300か月の期間。 |
INTERVAL '4' YEAR |
INTERVAL '4-0' YEAR TO MONTH にマップされ、4年を示す。 |
INTERVAL '50' MONTH |
INTERVAL '4-2' YEAR TO MONTH にマップされ、50か月または4年2か月を示す。 |
INTERVAL '123' YEAR |
エラーを返す。デフォルトの精度が2で、'123'は3桁であるため。 |
あるINTERVAL
YEAR
TO
MONTH
リテラルを別のリテラルに加算または減算して、新しいINTERVAL
YEAR
TO
MONTH
リテラルを作成できます。次に例を示します。
INTERVAL '5-3' YEAR TO MONTH + INTERVAL'20' MONTH = INTERVAL '6-11' YEAR TO MONTH
DSINTERVALは、SQLのINTERVAL DAY TO SECOND
データ型に対応します。日、時、分および秒で期間が格納されます。このデータ型は、2つの日時の値の正確な違いを表す場合に有効です。
DSINTERVAL
期間リテラルは、次の構文を使用して指定します。
INTERVAL 'integer|integer time_expr|time_expr
DAY|HOUR|MINUTE [(leading_precision)] | SECOND [leading_precision[, fractional_seconds_precision ])]
[ TO DAY|HOUR|MINUTE|SECOND [(fractional_seconds_precision) ]]
ただし、
integer
には日数を指定します。この値は、先行の精度で指定される数より桁数が大きいと、エラーが返されます。
time_expr
には、HH[:MI[:SS[.n]]]
、MI[:SS[.n]]
またはSS[.n]
書式で時間を指定します(ここで、n
は秒の小数部を指定します)。n
の桁数が、fractional_seconds_precision
で指定した数より多い場合、n
はfractional_seconds_precision
値で指定した数に丸められます。先行フィールドがDAY
の場合にのみ、1桁の整数および1つの空白の後にtime_expr
を指定できます。
leading_precision
は、先行フィールドの桁数です。有効範囲は0から9です。デフォルトは2です。
fractional_seconds_precision
は、SECOND
日時フィールドの小数部の桁数です。有効範囲は1から9です。デフォルトは6です。
後続のフィールドを指定する場合、先行のフィールドよりも下位の単位を指定する必要があります。たとえば、INTERVAL
MINUTE
TO
DAY
は無効です。この制限のため、SECOND
が先行のフィールドの場合、期間リテラルは後続のフィールドを指定できません。
後続フィールドの値の有効範囲は、次のとおりです。
HOUR
: 0から23
MINUTE
: 0から59
SECOND
: 0から59.999999999
DSINTERVAL
リテラルの様々な書式の例を次に示します。簡略バージョンも一部含みます。
期間リテラルの書式 | 解釈 |
---|---|
INTERVAL '4 5:12:10.222' DAY TO SECOND(3) |
4日5時間12分10秒222ミリ秒。 |
INTERVAL '4 5:12' DAY TO MINUTE |
4日5時間12分。 |
INTERVAL '400 5' DAY(3) TO HOUR |
400日5時間。 |
INTERVAL '400' DAY(3) |
400日。 |
INTERVAL '11:12:10.2222222' HOUR TO SECOND(7) |
11時間12分10.2222222秒。 |
INTERVAL '11:20' HOUR TO MINUTE |
11時間20分。 |
INTERVAL '10' HOUR |
10時間。 |
INTERVAL '10:22' MINUTE TO SECOND |
10分22秒。 |
INTERVAL '10' MINUTE |
10分。 |
INTERVAL '4' DAY |
4日。 |
INTERVAL '25' HOUR |
25時間。 |
INTERVAL '40' MINUTE |
40分。 |
INTERVAL '120' HOUR(3) |
120時間。 |
INTERVAL '30.12345' SECOND(2,4) |
30.1235秒。小数秒'12345'は精度が4であるため、'1235'に丸められる。 |
DAY
TO
SECOND
期間リテラルを別のDAY
TO
SECOND
期間リテラルに加算または減算できます。次に例を示します。
INTERVAL'20' DAY - INTERVAL'240' HOUR = INTERVAL'10-0' DAY TO SECOND
BOOLEAN
データ型は、論理値を表します。コードでは、BOOLEAN
値は「no」および「yes」を示す値(大文字および小文字の任意の組合せ)により表されます。Oracle OLAPの使用しているリリースで認識される実際の値は、NLS_LANGUAGEオプションによって指定される言語で決まります。読取り専用のNOSPELLおよびYESSPELLオプションを使用して、BOOLEAN
値を表す値を取得できます。英語の言語コードでは、次の語を使用してBOOLEAN
値を表すことができます。
YES
、TRUE
、ON
NO
、FALSE
、OFF
BOOLEAN
式の使用については、「ブール式」を参照してください。
RAW
データ型には、Oracle Databaseにより解釈されない(つまり、異なるシステム間でデータを移動する際に明示的に変換されない)データが格納されます。RAW
データ型は、バイナリ・データまたはバイト文字列用として使用されます。
RAW
データを指定するための構文は次のとおりです。
RAW(size)
最大2000バイトまでのサイズを指定する必要があります。
RAW
は可変長のデータ型ですが、Oracle Net(ユーザー・セッションをインスタンスに接続する)およびOracle Databaseユーティリティでは、RAW
データを転送する際に文字変換が実行されません。
Oracleでは、RAW
データとテキスト・データ間の変換が自動的に実行され、バイナリ・データは16進形式で表され、1つの16進文字がRAWデータの各4ビットを表しています。たとえば、ビット11001011
の1バイトのRAWデータは、CB
として表示および入力されます。
行識別子データ型は、リレーショナル表の行のアドレスを格納するために使用されます。OLAP DMLでは、リレーショナル表のデータをアナリティック・ワークスペース内のオブジェクトにコピーするのに使用できる、次の2つの異なるデータ型がサポートされています。
ROWID疑似列を問い合せることで、リレーショナル表の行のアドレスを調べることができます。この疑似列の値は、各行のアドレスを表す文字列です。これらの文字列はROWIDデータ型を持ちます。
注意: ROWIDデータ型の実際の列を含むリレーショナル表およびクラスタを作成できます。Oracle Databaseでは、このような列の値が有効なROWIDであることは保証されません。 |
ユーザー列に格納された拡張ROWIDデータ型には、制限付きROWIDのデータとデータ・オブジェクト番号が含まれます。データ・オブジェクト番号は、各データベース・セグメントに割り当てられた識別番号です。データ・オブジェクト番号は、データ・ディクショナリ・ビューUSER_OBJECTS、DBA_OBJECTSおよびALL_OBJECTSから取得できます。同じセグメントを共有するオブジェクト(同じクラスタ内のクラスタ化された表など)は、同じオブジェクト番号を持ちます。
拡張ROWIDは、文字AからZ、aからz、0から9、プラス記号(+)およびスラッシュ(/)を含めることが可能なBASE64値として格納されます。拡張ROWIDは直接取得できません。拡張ROWIDの内容を解釈するには、提供されるDBMS_ROWIDパッケージを使用します。このパッケージ・ファンクションを使用すると、制限付きROWIDから直接取得できる可能性のある情報および拡張ROWID固有の情報が抽出および提供されます。
関連項目: 『Oracle Database SQL言語リファレンス』のROWID疑似列についての説明。 |
一部のリレーショナル表の列は、物理的でないアドレスや永続的でないアドレス、あるいはOracle Databaseによって生成されたものではないアドレスを持ちます。たとえば、索引編成表の行のアドレスは、移動可能な索引リーフに格納されます。外部表(ゲートウェイを介してアクセスされるDB2表など)のROWIDは、Oracle標準のROWIDではありません。
Oracleでは、索引編成表と外部表のアドレスはユニバーサルROWID(UROWID)を使用して格納されます。索引編成表は論理UROWIDを持ち、外部表は外部UROWIDを持ちます。どちらのタイプのUROWIDも、ヒープ編成表の物理ROWIDと同様にROWID疑似列に格納されます。
論理ROWIDは表の主キーに基づいて作成されます。主キーに変更がない場合、論理ROWIDは変更されません。索引編成表のROWID疑似列は、UROWIDデータ型です。この疑似列には、ヒープ編成表のROWID疑似列と同様に(SELECT ... ROWID文を使用して)アクセスできます。索引編成表のROWIDを格納するには、表に対してUROWID型の列を定義し、その列にROWID疑似列の値を取り出します。
関連項目: 『Oracle Database SQL言語リファレンス』のUROWIDについての説明。 |
多くの場合、Oracle OLAPではデータ型の変換が自動的に実行されます(「テキスト・データ型の自動変換」および「数値データ型の自動変換」を参照)。また、OLAP DMLには値のデータ型変換に使用できるファンクションが数多くあります。
NTEXT
値をOLAP DML文に引数として指定した場合、Oracle OLAPはそれらの値を自動的にTEXT
に変換します。NTEXT
値をデータベース・キャラクタ・セットで表すことができない場合、データの損失が発生します。
Oracle OLAPは、SHORTINTEGER
変数およびINTEGER
変数(1バイト固定幅)をINTEGER
(4バイト幅)に自動的に変換して計算します。SHORTINTEGER
変数の合計を計算すると、32,767より大きいか-32,768より小さい結果を取得および報告できます。1バイトのINTEGER
変数の合計を計算すると、127より大きいか-128より小さい結果を取得および報告できます。しかし、それらの結果をそれぞれSHORTINTEGER
変数または1バイトのINTEGER
変数に代入しようとすると、変数はNA
に設定されます。
Oracle OLAPでは、次のルールに従って数値データ型が自動的に変換されます。
SHORTINTEGER
またはSHORTDECIMAL
データ型の値を式で使用する場合、値は使用される前に長い方に変換されます。比較式でSHORTDECIMAL
およびDECIMAL
データ型を混在させる場合に発生する可能性のある問題の詳細は、「ブール式」を参照してください。
計算の結果をSHORTINTEGER
データ型の値として保存する場合、結果がSHORTINTEGER
の範囲(-32768から32767まで)外である場合はNAが格納されます。
DECIMAL
式の値をINTEGER
データ型のオブジェクトに代入する場合、格納または使用する前に値が丸められます。
注意: DECIMAL 値がINTEGER 値の範囲を超える場合はNAが格納されます。 |
INTEGER
データ型の値が必要な場所で小数値を使用する場合、格納または使用する前に値が丸められます。
注意: DECIMAL値がINTEGER値の範囲を超える場合はNAが格納されます。 |
10進表現の値を、SHORTDECIMAL
データ型の変数に代入すると、有効桁の最初の7桁のみが格納されます。
NUMBER
値を他の数値データ型と組み合せると、すべての値がNUMBER
に変換されます。
これらの変換とは異なる変換が必要な場合、CONVERT、TO_CHAR、TO_NCHAR、TO_NUMBERまたはTO_DATEファンクションを使用して別の結果を取得できます。
演算子は、値を変換したり、なんらかの方法で値を別の値と組み合せるための記号です。表2-9「OLAP DML演算子」に、OLAP DML演算子のカテゴリを示します。
表2-9 OLAP DML演算子
カテゴリ | 説明 |
---|---|
算術 |
数式で数値データとともに使用され、数値結果を生成する演算子。一部の算術演算子は、結果を日付または数値のいずれかで返す、日付データと数値データが混在した日付式で使用可能。算術演算子のリストは、「算術演算子」を参照。数式の詳細は、「数式」を参照。 |
比較 |
基本型(数値型、テキスト型、日付型、または、ごくまれにブール型)が同じである2つの値を比較し、 |
論理 |
論理演算を使用して |
代入 |
式の結果をオブジェクトに代入したり、値をOLAP DMLオプションに代入したりするための演算子。代入文の使用の詳細は、SETコマンド、SET1コマンドおよび「代入演算子」を参照。 |
条件 |
条件に基づいて値を選択する |
置換 |
式を評価し、結果の値を置換する |
表2-10「算術演算子」は、OLAP DMLの算術演算子、その演算内容および優先順位(演算子が評価される順序)を示します。優先順位が同じ演算子は、左から右に評価されます。数式で複数の演算子を使用する場合、式は算術の標準ルールに従って評価されます。他の数式に続く負の数の前にはカンマが必要で、カンマがない場合は、マイナス記号は減算演算子として解釈されます。たとえば、intvar,-4
となります
比較演算子および論理演算子は、算術演算子とほぼ同じ方法で式を作成できます。各演算子には優先順位があり、その順位によって評価の順序が決定されます。カッコで評価の順序を変更しないかぎり、優先順位の等しい演算子は、左から右に評価されます。ただし、真の値が確定した時点で、評価は停止されます。
表2-11「比較演算子および論理演算子」は、OLAP DMLの比較演算子および論理演算子(AND
、OR
およびNOT
)を示しています。この表は、演算子、演算内容、例および優先順位(演算子が評価される順序)をまとめたものです。優先順位が同じ演算子は、左から右に評価されます。
表2-11 比較演算子および論理演算子
演算子 | 演算 | 例 | 優先順位 |
---|---|---|---|
|
|
|
1 |
|
等しい |
|
2 |
|
等しくない |
|
2 |
|
より大きい |
|
2 |
|
より小さい |
|
2 |
|
以上 |
|
2 |
|
以下 |
|
2 |
|
日付が期間に含まれているかどうか |
|
2 |
|
テキスト値が指定したテキスト・パターンに一致するかどうか |
|
2 |
|
どちらの式も真 |
|
3 |
|
どちらか1つの式が真 |
|
4 |
OLAP DMLでは、他の多くのプログラミング言語と同様、代入演算子として記号=(等号)を使用します。
式では一時データが作成され、結果の値は表示できますが、セッション中にアナリティック・ワークスペースに自動的に格納されて後で参照されるということはありません。代入文を使用して、式の結果を、その式と同じデータ型およびディメンションを持つオブジェクトに格納します。オブジェクトを更新およびコミットすると、次回のセッションでその値を使用できます。
他のプログラミング言語と同様、OLAP DMLの代入文はソース式の結果と等しい値をターゲット式に設定します。ただし、OLAP DML代入文の処理は他のプログラミング言語における処理と異なる点があります。他の多くのOLAP DML文と同様、値を単一のセルに代入するのではなく、ターゲット式が多次元オブジェクトの場合、Oracle OLAPがターゲット・オブジェクトのセルをループ処理して各セルにソース式の結果を設定します。さらに、式のディメンションがターゲット・オブジェクトのディメンションと異なる場合は、UNRAVELを使用して式の値をターゲット・オブジェクトのセルにコピーできます。
式は、OLAP DMLの構文に従ってデータ値を表したものです。この項では、OLAP DML式に関して次の内容を説明します。
各種のOLAP DML式の詳細は、次のとおりです。
OLAP DML式はデータ型を持ち、ディメンションを持つ場合もあります。文の中で引数として式を使用できます。多くの場合、式は数値演算や論理演算を実行します。式は、常にワークスペースのデータ型の結果に評価されます。
式には、次のものが含まれます。
リテラル値たとえば、10
や'East'
複数の値を含むアナリティック・ワークスペース・オブジェクト。たとえば、変数sales
1つ以上の値を返すファンクション。たとえば、TOTALやJOINLINES
リテラル値、ディメンション、変数、計算式およびファンクションを、演算子と組み合せたもう1つの式。たとえば、inflation*1.02
式は計算式として保存できます(「OLAP DML計算式」を参照)。
式のデータ型が、結果値のデータ型になります。これは、式を構成するデータ・オブジェクトのデータ型と同じになるとは限らず、データ、および関連する演算子とファンクションによって異なります。
また、IF
... THEN
... ELSE
演算子で示される条件式もサポートされます。条件式が返す値のデータ型は、IF
句の式(必ずBOOLEAN
になる)ではなく、THEN
およびELSE
句の式によって決まります。
注意: 構文は似ていますが目的が異なるため、条件式を、プログラムのIF...THEN...ELSEコマンドと混同しないでください。IF 文はデータ型を持たず、式のように評価されることはありません。 |
式のディメンション化は次のように、その式のすべての変数、ディメンション、リレーション、計算式、修飾データ参照およびファンクションのディメンションが1つに結合されることにより行われます。
変数、リレーションおよび計算式は、オブジェクトの定義にリストされたディメンションによってディメンション化されます。
例1: price
変数がmonth
およびproduct
によってディメンション化されている場合、式price
*
1.2
もmonth
およびproduct
によってディメンション化されます。
例2: units
変数がmonth
、product
およびdistrict
によってディメンション化されている場合、式units
*
price
はmonth
、product
およびdistrict
によってディメンション化されます(price
変数のディメンションがmonth
およびproduct
のみの場合でも)。
修飾データ参照(QDR)は、修飾されているディメンションを除く、関連付けられているオブジェクトのすべてのディメンションによってディメンション化されます。修飾データ参照の詳細は、「ステータスを変更せずにディメンションを単一の値に制限する方法」を参照してください。
通常、ほとんどのOLAP DMLファンクションの戻り値は、入力引数のディメンションの結合によってディメンション化されます。ただし、一部のファンクション(集計ファンクションなど)のディメンションは入力引数より小さくなります。この場合の戻り値のディメンション性については、第7章「OLAP DMLファンクション: AからK」のファンクションの項目を参照してください。
注意: 特に記載されていないかぎり、集計ファンクションで分割ディメンションまたは分割リレーションを指定すると、式のディメンション性が変更されます。分割ディメンションとして指定した最初のディメンションは最も遅く変化し、最後に指定したディメンションは最も速く変化します。 |
注意: CHGDIMSファンクションを使用して、式または副式のディメンション性を変更できます。 |
PARSE文およびINFOファンクションを発行すると、式のディメンションを調べることができます。PARSEは式のテキストを評価し、INFOは式の解析方法を示します。
この例では、INFOファンクションでDIMENSIONキーワードを使用し、PARSEによって分析された式のディメンションを取得する方法を示します。次の文を発行したとします。
PARSE 'TOTAL(sales region)'
この文によって生成される出力は、次のとおりです。
SHOW INFO(PARSE DIMENSION) REGION
式によって生成される値の数は、式のディメンションおよびそのディメンション・ステータスによって異なります。1つの式によって、現行のステータス内にあるディメンション値の各組合せに対して、1つのデータ値が導出されます。たとえば、ステータスにあるディメンション値がmonth
に3つ、product
に2つ存在する場合、式price
GT 100
の結果は6つの値(3 X 2)になります。
そのため、目的の結果を得るには、式のディメンションを検討するデータの範囲に制限する必要があります。また、PERMIT文を使用してデータのディメンションへのアクセスを制限することを考慮する必要があります。
現行のステータスを変更せずに単一の値を指定する場合、修飾データ参照(QDR)を使用できます。QDRを使用すると、ディメンション(式に1つのディメンション値を指定可能)や、変数またはリレーションの1つ以上のディメンションを修飾できます。ディメンション・ステータスの詳細は、「OLAP DML処理対象のデータ・セットの指定方法」を、QDRの詳細は、「ステータスを変更せずにディメンションを単一の値に制限する方法」を参照してください。
式でアナリティック・ワークスペースのデータ・オブジェクトを使用するには、その名前を指定します(「式にオブジェクトを指定する構文」を参照)。式を計算する際、Oracle OLAPは指定されたオブジェクトのデータを使用します(「式におけるOLAP DMLデータ・オブジェクトの動作」を参照)。
表2-12では、式の中で引数として使用されるオブジェクトのデータを、Oracle OLAPがどのように使用するのかを示します。
表2-12 式のオブジェクト
オブジェクト | 式での使用 |
---|---|
変数 |
定義に応じて、1次元配列または多次元配列のデータとして使用。たとえば、代入文のターゲット式またはソース式として使用される。 「式における変数とリレーションの使用方法」および「代入文でのオブジェクトの使用」も参照してください。 |
リレーション |
定義に応じて、1次元または多次元のデータとして使用。たとえば、代入文のターゲット式またはソース式として使用される(「代入文でのオブジェクトの使用」を参照)。
「式における変数とリレーションの使用方法」および「式における関連ディメンションの使用方法」も参照してください。 |
ディメンション |
1次元配列のデータとして使用。数式で 「CONCATディメンションの値の指定」および「式における関連ディメンションの使用方法」も参照してください。 |
コンポジット |
ディメンションが使用可能な場所ではコンポジットを使用できる。 「コンポジットの値の指定」も参照してください。 |
値セット |
ディメンション値のリストとして使用。 「式における変数とリレーションの使用方法」およびDEFINE VALUESETコマンドも参照してください。 |
ディメンション・サロゲート |
1次元配列として使用。サロゲートは、ディメンションの値の代替セットを提供する。数式で 注意: モデル、LIMITコマンド、修飾データ参照、または文(FILEREAD、FILEVIEW、SQL FETCH、SQL IMPORTなど)でロードするデータでは、ディメンションのかわりにサロゲートを使用できる。他のオブジェクトを定義するDEFINE文の場合、引数のオブジェクトにサロゲートは指定できない。 |
計算式 |
文の副式または式として使用。 |
プログラム |
値を返さないプログラムでは、OLAP DMLコマンドと同様にプログラム名を使用する。値を返すプログラムでは、OLAP DMLファンクションを実行するのと同じ方法(式の中でプログラム名を使用し、プログラム引数がある場合はカッコで囲む)でプログラムを実行する。 |
次の構文を使用して、アナリティック・ワークスペース・オブジェクトを式の中に指定できます。
[[schema-name.]analytic-workspace-name!]object-name
アナリティック・ワークスペースが作成、定義されたスキーマの名前。デフォルトでは、AW CREATE文を発行するユーザーのデータベース・ユーザーIDのスキーマ内にアナリティック・ワークスペースが作成されます。ほとんどのDML文では、アナリティック・ワークスペースのフルネーム(Scott.demo
など)を指定できます。
目的のオブジェクトを含むワークスペースの名前。オブジェクト名とアナリティック・ワークスペース名を指定することで、オブジェクトの修飾オブジェクト名(QON)が作成されます。「修飾オブジェクト名を使用しない場合」で説明されている状況以外では、オブジェクトの修飾オブジェクト名を使用することをお薦めします。
analytic-workspace-nameの値は、次のいずれかで指定できます。
アナリティック・ワークスペースの名前。ワークスペース名は、アナリティック・ワークスペースをAW CREATE文で作成するときに割り当てられます。
アナリティック・ワークスペースの別名。アナリティック・ワークスペースの別名とは、アタッチされたアナリティック・ワークスペースの代替名です。AW ALIAS LIST文を使用すると、別名の割当てまたは削除を行うことができます。別名は、その別名が割り当てられてから、ワークスペースがデタッチされるまで(または別名が削除されるまで)有効です。そのため、アタッチされていないワークスペースをアタッチするたびに、別名を再度割り当てる必要があります。
別名を割り当てる理由の1つは、他のユーザーのスキーマに含まれるアナリティック・ワークスペースを簡単に参照できるようにするためです。たとえば、そのようなアナリティック・ワークスペースを参照する修飾オブジェクト名および文に別名を使用できます。別名を割り当てるもう1つの理由は、アナリティック・ワークスペースへの参照を含むがその名前をハードコードしない汎用コードを記述するためです。一般参照を提供する別名を使用すると、別名を割り当て、異なる時点で異なるワークスペースに対してコードを実行できます。
集計仕様、モデルまたはプログラム内でTHIS_AW
により修飾されたオブジェクト名。Oracle OLAPがオブジェクトをコンパイルする際、THIS_AW
はすべてオブジェクトがコンパイルされるワークスペースの名前として解釈されます。したがって、myprog
という名前のプログラムとmyvar
という名前の変数を含むmyworkspace
という名前のアナリティック・ワークスペースがある場合、Oracle OLAPは文myvar=1をmyworkspace!myvar=1
として解釈します。プログラム内では、THIS_AWオプションを使用してTHIS_AW
の値を取得できます。
analytic-workspace-nameの値を指定しない場合、Oracle OLAPは指定されたオブジェクトが現行のアナリティック・ワークスペースにあると判断します。現行のアナリティック・ワークスペースとは、AW LIST文を使用して表示する、アクティブ・アナリティック・ワークスペースのリストの先頭のアナリティック・ワークスペースのことです。現行のアナリティック・ワークスペースの名前は、AWファンクションにNAMEキーワードを指定することによって取得できます。
注意: セッションには、現行のアナリティック・ワークスペースは必要ありません。アナリティック・ワークスペース名を指定せずにOracle OLAPを起動すると、EXPRESS アナリティック・ワークスペースがリストの先頭になります。ただし、この場合、EXPRESS アナリティック・ワークスペースは現行ではなく、AWコマンドで指定しないかぎり、現行のアナリティック・ワークスペースは存在しません。 |
名前のないコンポジット以外のオブジェクトの名前。オブジェクトが名前のないコンポジットである場合は、次の構文を使用します。
SPARSE <basedims....>
basedims引数には、名前のないコンポジットを作成する対象となるディメンションの名前を空白で区切って指定します。OLAP DML文における名前のないコンポジットの使用例は、例10-104「コンポジットによってディメンション化されたデータのレポート」を参照してください。
異なるワークスペースにある同じ名前のオブジェクトは、完全に別のオブジェクトとして扱われ、それらの間に類似点や関連性が存在するとは判断されません。異なるワークスペースのオブジェクト間に適用されるOLAP DML言語制限は、オブジェクトの名前が同じ場合にも適用されます。たとえば、両方のワークスペースに同じ名前のディメンションが存在する場合でも、一方のワークスペースのオブジェクトを、もう一方のワークスペースに存在するディメンションによってディメンション化することはできません。
オブジェクトに対して修飾オブジェクト名を使用するのは一般的ですが、次のような点に注意してください。
修飾オブジェクト名を使用できない、または修飾オブジェクト名を使用する必要のない状況があります。詳細は、「修飾オブジェクト名を使用しない場合」を参照してください。
修飾オブジェクト名の作成時にアンパサンド置換を使用する場合、いつ、どのように置換が発生するのかを理解しておく必要があります。詳細は、「ワークスペースおよびオブジェクト名のアンパサンド置換の使用方法」を参照してください。
修飾オブジェクト名を引数としてプログラムに渡す場合は、特に注意が必要です。詳細は、「プログラムに修飾オブジェクト名を渡す場合」を参照してください。
修飾オブジェクト名を使用しない場合
通常、式では修飾オブジェクト名を使用します。しかし、場合によっては、修飾オブジェクト名を使用できない、または修飾オブジェクト名を使用する必要のないことがあります。
次のオブジェクトには、修飾オブジェクト名を使用できません。
ARGUMENT文またはVARIABLE文により作成された、特定のプログラムに固有のオブジェクト。
任意のワークスペースのNAMEディメンション。NAMEディメンションを参照する際、Oracle OLAPは常に現行のワークスペースのNAMEディメンションを使用します。
次の状況では、修飾オブジェクト名を使用する必要がありません。
修飾データ参照(QDR)の修飾子内。修飾オブジェクト名が必要なのは、修飾されるオブジェクトのみです。修飾されていない名前は、修飾されるオブジェクトと同じワークスペースのオブジェクトに適用されるものと判断されます。
名前のないコンポジット内。あるベース・ディメンションを修飾オブジェクト名として指定すると、他のすべてのベース・ディメンションが同じワークスペースのものと判断されます。
名前付きコンポジット内。名前が修飾オブジェクト名の場合、そのベース・ディメンションが同じワークスペースのものと判断されます。
モデル内。ソリューション変数を修飾オブジェクト名として指定すると、DIMENSION文で名前が付けられたすべてのディメンションが同じワークスペースのものと判断されます。
ワークスペースおよびオブジェクト名のアンパサンド置換の使用方法
アンパサンド置換を使用して、ワークスペース名、オブジェクト名、またはその両方を指定できます。ただし、Oracle OLAPは修飾オブジェクト名(感嘆符を含む)を解析した後にアンパサンド参照を解決するため、アンパサンド置換で修飾オブジェクト名を使用する際には注意が必要です。たとえば、&awname!objname
という式では、アンパサンド(&
)はワークスペース名のみではなく修飾オブジェクト名全体に適用されます。
プログラムに修飾オブジェクト名を渡す場合
修飾オブジェクト名を引数としてプログラムに渡し、ARGUMENT文およびARG、ARGFR、ARGSの各ファンクションを使用する場合は、修飾オブジェクト名全体が単独の引数とみなされます。そのコンポーネント部分は別々には渡されません。
ほとんどの場合、データ型ごとに決められた表記方法に基づいて値を指定すれば、ディメンションの値を参照できます。例として、geog
という名前を持つTEXT
ディメンションを考えます。このディメンションに「World」という値を追加するには、次の文を発行します。
MAINTAIN geog ADD 'World'
ただし、数式でTEXT
ディメンション値を使用する場合や、非数値のディメンション値を比較する場合、Oracle OLAPでは、値そのものではなく、配列にある値のINTEGER
位置番号(デフォルトのステータス・リストに基づく)を使用します。
コンポジットの値および連結ディメンジョンの値の指定については、別の方法で行います。
次の構文に基づいて、コンポジットのベース・ディメンションの値セットを指定します。
{composite_name | SPARSE} {<base_dimension_name base_dimension_value }, ...>
(名前付きコンポジットの場合のみ)次の構文に基づいて、コンポジットの値のみを指定します。
composite_name <base_dimension_value ...>
ただし、base_dimension_valueには、ベース・ディメンションの値セットを、コンポジット内で定義されている順に空白で区切って指定します。
一意のCONCATディメンションを定義した後は、単にベース・ディメンション値を指定するのみでその値を参照できます。
ただし、非一意のCONCATディメンションの値は、ベース・ディメンションの名前とベース・ディメンション値をコロン(:)および空白で区切って連結した上で、山カッコ(<>)で囲んで指定する必要があります。式では、次のフォーマットを使用します。
<BASE_DIMENSION_NAME: base_dimension value>
たとえば、city
およびstate
というベース・ディメンションと、それらのディメンションを持つgeog
という連結ディメンションを定義したとします。geog
ディメンションについてレポートすると、geog
の値にベース・ディメンションの名前とその値が含まれます。
DEFINE city DIMENSION TEXT DEFINE state DIMENSION TEXT DEFINE geog DIMENSION CONCAT(city state) MAINTAIN city ADD 'New York' MAINTAIN state ADD 'New York' REPORT geog GEOG ----------------------------------- <CITY: New York> <STATE: New York>
一部のOLAP DML文(たとえばLIMITコマンドを基にした一部の文)では、ディメンションおよび関連ディメンションとして参照される2つディメンション引数を持つ構文が使用されます。関連ディメンションついて結果のディメンション性を指定できるOLAP DML文(AVERAGE、ANY、COUNT、CUMSUM、NONE、LARGEST、SMALLEST、TOTALなど)もあります。この場合の関連ディメンションとは、あるディメンションとリレーションを共有する任意のディメンションを指します。
こうした文の引数に指定する値がディメンション名であっても、実際の計算にはディメンション間のリレーションが使用されます。2つのディメンションが共有するリレーションが1つのみである場合、処理は単純です。Oracle OLAPでは、そのリレーション内の値に基づいて計算が実行されます。
ただし、2つのディメンションが共有するリレーションが複数ある場合、処理はやや複雑になります。LIMITコマンド(LEVELRELコマンドを使用)と同様に、Oracle OLAPで使用する共有リレーションを指定できる場合もあります。構文の制約により、リレーションの名前が指定できない場合もあります。この場合、Oracle OLAPによって複数のリレーションの中から選択されます(「Oracle OLAPでの複数リレーション間の選択方法」を参照)。
式における変数は、指定されたデータ型の値を含む配列として参照されます。またリレーションは、指定されたディメンションの値を含む配列として参照されます。その他の点においては、変数およびリレーション(どちらも通常は多次元オブジェクト)は基本的に同じものです。
ほとんどの場合、コンポジットで定義される変数をOLAP DML文に含めると、文はそれらの変数をベース・ディメンションで定義されたものと同様に処理します。
ベース・ディメンション値のいずれかを要求することで、コンポジットによってディメンション化された変数にアクセスできます。
ステータスにあるコンポジットの値は、コンポジットのベース・ディメンションのステータスによって決定されます。コンポジットはディメンションではないため、コンポジットには固有のステータスはありません。
REPORT文、またはコンポジットを使用する変数をループ処理する他の文を使用すると、デフォルトの動作として、ステータスにあるコンポジットのベース・ディメンション値の組合せがすべて評価されます。コンポジットに存在しない組合せの場合、関連付けられているデータはNAと表示されます。
たとえば、次の文を実行すると、2002年1月から3月にスポーツウェア向けに発行されたクーポン券の数を示す、East地域に関するレポートが作成されます。2002年3月にはクーポン券が発行されなかったため、レポートの該当の列にはNAと表示されます。
LIMIT month TO 'Jan02' 'Feb02' 'Mar02' LIMIT market TO 'East' LIMIT product TO 'Sportswear' REPORT coupons MARKET: EAST ------------COUPONS------------- -------------MONTH-------------- PRODUCT Jan02 Feb02 Mar02 -------------- ---------- ---------- ---------- Sportswear 1,000 1,000 NA
ただし、パフォーマンス上の理由から、REPORT、ROWなどの文および代入文(SET)のデフォルトのループ動作を変更し、すべてのベース・ディメンション値ではなく、コンポジットの値をループ処理するように変更できます。
修飾データ参照(QDR)を使用すると、データ・オブジェクトの1つ以上のディメンションを単一の値に制限できます。QDRは、現行のステータスを変更せずにデータ・オブジェクトの単一の値を指定する場合に有効です。QDRを使用すると、ディメンション(式に1つのディメンション値を指定可能)や、変数またはリレーションの1つ以上のディメンションを修飾できます。
QDRの構文があいまいであるため、誤って解釈されるか、構文エラーが発生することがあります。この場合、QUALファンクションを使用して修飾データ参照(QDR)を明示的に指定できます。
修飾データ参照は、次の構文を使用して指定します。
expression(dimname1 dimexp1 [, dimname2 dimexp2. . .])
dimname引数は、式に含まれるディメンションの名前、またはディメンションのディメンション・サロゲートです。dimexp引数は、次のいずれかです。
dimnameの値
注意: LIMITSTRICTオプションの設定により、存在しない値がQDRで指定された場合のOracle OLAPの動作が決まります。存在しない値を指定した場合、デフォルトでは、存在しない値は無効な値として処理され、エラーが発生します。存在しない値がNA 値として処理されるようにするには、LIMITSTRICTの値をNO に設定します。 |
結果がdimnameの値となるテキスト式
結果がdimnameの値に対する論理位置となる数式
dimnameのリレーション
次のいずれかの方法で、変数の任意またはすべてのディメンションを修飾できます。
ディメンションの指定された値を1つ選択すると、QDRにより変数のディメンションが一時的に制限されます。この値は、現行のステータスの範囲外になる可能性があります。
修飾子として適切なリレーションの名前を指定すると、QDRにより変数のディメンションが、より下位の集計関連ディメンションと置き換えられます。ディメンションは、リレーションのディメンションに一時的に置き換えられます。
たとえば、変数sales
には、month
、product
およびdistrict
の3つのディメンションがあります。Bostonの売上総額を、全都市の売上総額と比較するとします。単一の文において、次のようにdistrict
を2つの異なる値に制限します。
式の分子は、district
のステータスをBoston
にします。
式の分母は、district
のステータスをALL
にします。
次の文により、QDRを使用してこの結果を計算できます。
SHOW sales(district 'Boston')/TOTAL(sales)
変数の複数のディメンションを修飾できます。たとえば、各ディメンションの1つのディメンション値を指定してsales
変数のすべてのディメンションを修飾する場合、sales
を単一のセル値の範囲に制限します。
Jun02
、Tents
およびSeattle
の売上高をフェッチするには、次のQDRを使用します。
SHOW sales(month 'Jun02', product 'Tents', district 'Seattle')
この文は、単一の値をフェッチします。
代入(SET)文のターゲット式で修飾データ参照を使用できます。これにより、データ・オブジェクト内の特定のセルに値を代入できます。
次の例では、修飾データ参照で指定されたsales
コンポジットのデータ・セルに、値10200を代入します。sales
という名前のコンポジットに、Boston
およびTents
の組合せの値が存在しない場合、この値の組合せがコンポジットに追加され、データ・セルが追加されます。
sales(market 'Boston' product 'Tents' month 'Jan99')= 10200
QDRの修飾子としてリレーションを使用する場合、変数のディメンションをリレーションのディメンション(複数可)に置き換えることができます。リレーションは、修飾するディメンションに関連している必要があり、置換ディメンションによってディメンション化される必要があります。
例2-1 変数のディメンションの置換
month
、product
およびdistrict
によってディメンション化された2つの変数sales
およびquota
が存在するとします。3番目の変数division
.mgr
は、month
およびdivision
によってディメンション化されています。division
とproduct
の間には、division
.product
というリレーションも存在します。これらのオブジェクトは、次のように定義されています。
DEFINE sales VARIABLE DECIMAL <month product district> LD Sales Revenue DEFINE quota VARIABLE DECIMAL <month product district> DEFINE division.mgr VARIABLE TEXT <month division> DEFINE division.product RELATION division <product> LD Division for each product
次の文により、文の下にあるようなレポートが生成されます。
REPORT division.mgr -------------------DIVISION.MGR---------------------- ----------------------MONTH-------------------------- DIVISION JAn02 Feb02 Mar02 Apr02 May02 Jun02 -------- -------- -------- -------- -------- -------- -------- Camping Hawley Hawley Jones Jones Jones Jones Sporting Carey Carey Carey Carey Carey Musgrave Clothing Musgrave Musgrave Musgrave Musgrave Musgrave Wong
売上高のノルマの達成率を、各製品を担当する事業部長名とともに表示するレポートを取得するとします。各製品の事業部長名を表示するには、修飾子として、division
に関連付けられてproduct
によってディメンション化されているリレーションdivision
.product
を使用します。QDRは、division
ディメンションをproduct
に置き換えるため、レポートsales
/ quota
の他の式と同じディメンションを持つことになります。次の文により、文の下にあるようなレポートが生成されます。
REPORT DOWN month sales W 6 sales/quota W 8 HEADING - 'MANAGER' division.mgr(division division.product) DISTRICT: BOSTON -----------------------------PRODUCT------------------------------------ ----TEnts---- ---canoes---- --racquets--- --sportswear-- ---footwear--- Sales/ Sales/ Sales/ Sales/ Sales/ Month Quota Manager Quota Manager Quota Manager Quota Manager Quota Manager ------ ----- ------- ----- ------- ----- ------- ----- -------- ----- -------- Jan02 1.00 Hawley 0.82 Hawley 1.02 Carey 0.91 Musgrave 0.92 Musgrave Feb02 0.84 Hawley 0.96 Hawley 1.00 Carey 0.80 Musgrave 1.07 Musgrave Mar02 0.87 Jones 0.95 Jones 0.87 Carey 0.88 Musgrave 0.91 Musgrave Apr02 0.91 Jones 0.93 Jones 0.99 Carey 0.94 Musgrave 0.95 Musgrave ...
QDRを使用して、リレーション(非常に特殊な変数)を修飾することもできます。
region
.district
リレーションが、district
によってディメンション化されるとします。district
を値Seattle
で修飾する場合、式の値はSeattle
のリレーションの値になります。QDRはdistrict
の1つの値を指定するため、式の結果は単一のセルになります。
region
.district
の定義は次のようになります。
DEFINE region.district RELATION region <district> LD The region for each district
次の文によって、値WEST
が表示されます。
SHOW region.district(district 'Seattle')
QDRを使用して、ディメンション自身を修飾でき、それによって式に1つのディメンション値を指定できます。次の式では、district
の1つの値(単一セル変数mydistrict
に含まれる値)が指定されています。
district(district mydistrict)
連結ディメンションは、連結ディメンションのベース・ディメンションから値を指定することにより、QDRを使用してディメンションを修飾できます。次の式では、ベース・ディメンションとしてregion
およびdistrict
を持つ連結ディメンションreg.dist.ccdim
の1つの値を指定します。コスト変数は、division
およびreg.dist.ccdim
ディメンションによってディメンション化されます。
SHOW reg.dist.ccdim(district 'Boston')
この式により次の結果が返されます。
<DISTRICT: Boston>
アンパサンド文字(&
)が式の先頭にあると、文にある式自体の式の値が置換されます。QDRとともにアンパサンドを使用する場合、置換が行われる前に変数を修飾するには、式全体をカッコで囲む必要があります。
reptype
によってディメンション化され、変数名を含むmyvar
という名前のテキスト変数があるとします。これは、reptype
によってディメンション化されたmyvar
であり、myvar
という名前の変数ではない点に注意してください。そのため、myvar
を修飾して、結果の値をREPORT文で使用するためには、カッコで囲む必要があります。
REPORT &(myvar(reptype 'actual'))
カッコを使用せず、myvar
で指定された変数がsales
の場合、sales
がreptype
によってディメンション化されないことを示すエラー・メッセージを受け取ります。
アナリティック・ワークスペースにあるデータ・オブジェクトの一部のセルが空になる場合があります。特定のデータ値がセルに代入されていないか、またはデータ値がそのセルに適していない場合、空のセルになります。オブジェクトの空のセルの値はNA
です。NA
値には、特定のデータ型がありません。一部のファンクション(たとえば集計ファンクションなど)は、必要な情報が使用できない、または適していない場合、NAを返します。同様に、値が適していない式の値はNA
になります。
注意: OLAP DMLのコンポジット・ディメンションでディメンション化された変数(NULLファクトを持つリレーショナル・ファクト表に対応する変数)をサポートするため、OLAPでは、NA2ビットにより制御される特殊なNA値を使用できます。NA2ビットにより制御されるNA値のOracle OLAPにおける管理方法の詳細は、「NA2ビットとNULLトラッキング」を参照してください。 |
使用できるデータがない場合の処理を指定することがあります。たとえば、変数の特定のセル、ファンクションの戻り値、または算術演算子を含む式の値として、適切な値が存在しない場合があります。このような場合、NA
(使用不可)値が自動的に指定されます。
変数またはリレーションの値をNA
に設定するには、次の例に示すように代入文(SET)を使用します。
sales = NA
NA
値の処理方法を制御するオプションやファンクションは複数あります。次に例を示します。
「カテゴリ別のオプション」にリストされているNAオプション。
NAFILLファンクションは、指定した埋込み式で表示されるNA
値とともにソース式の値を返します。このファンクションを式で使用すると、返す値の書式を制御できます。
第4章「OLAP DMLプロパティ」にリストされているシステム・プロパティ。
数式は、いずれかの数値データ型として評価されます。数式内のデータは、次のいずれかの組合せになります。
数値リテラル(「数値データ型」を参照)
数値変数または計算式
ディメンション
数値結果を生成するファンクション
日付リテラル、変数、計算式またはファンクション
さらに、算術演算子でこれらの式を結合して、より複雑な数式を作成できます。数値データを含む数式で算術演算子を使用すると、結果が数値で返されます。日付および数値データの両方が混在した日付式で、一部の算術演算子を使用することによって、結果を日付または数値のいずれかで取得できます。
Oracle OLAPによる数式の処理方法を決定するオプションは複数あります。
1つの数式には、すべての数値データ型を含めることができます。
式のすべてのデータがINTEGER
またはSHORTINTEGER
で、演算が加算、減算および乗算のみの場合、結果はINTEGER
となります。
データのいずれかがNUMBER
の場合、結果はNUMBER
となります。
データのいずれかがDECIMAL
またはSHORTDECIMAL
で、NUMBER
のデータがない場合、結果はDECIMAL
となります。
除算または指数演算を実行した場合、結果はDECIMAL
となります。
データ型がTEXT
であるディメンションを数式で使用する場合、そのディメンション値は位置(INTEGER
)として処理されるため、数値として使用されます。位置番号は、現行のステータスではなく、デフォルトのステータス・リストに基づきます。
小数値データは、格納および計算される際には必ず浮動小数点形式に変換されます。浮動小数点形式では、数値は仮数および指数を使用して表されます。仮数および指数は、2進数として格納されます。仮数とは、2を指数で累乗した値に乗算すると、元の小数値と等しい数値またはほぼ等しい数値が得られる2進部分のことです。
小数値の端数部分は常に正確に2進表現されるとは限らないため(小数で1/3の正確な表現がないように)、小数値の端数部分を常に2進部分として正確に表現できるわけではありません。浮動小数点数の算術演算はさらに概算になる可能性があり、誤差は演算を重ねるごとに徐々に大きくなります。概算要因に加えて、有効桁の有効数が結果の精度に影響します。
これらすべての理由から、TOTAL、AVERAGE、またはDECIMAL
またはSHORTDECIMAL
変数の他の集計ファンクションにより計算される結果は、最後の有効数字が示す値が手動で計算した場合の結果と異なることがあります。SHORTDECIMAL
データ型の有効桁数は最大7桁であるため、SHORTDECIMAL
データとの誤差がさらに大きくなります。このため、通貨額を含む変数など、計算速度よりも精度が重要な場合はNUMBER
データ型を使用してください。
2進小数部で正確に表現できない一部の小数値の端数部分については、DECIMAL
データ型を使用すると、有効桁数が多いためSHORTDECIMAL
データ型よりもより正確な値が得られます。そのため、SHORTDECIMAL
およびDECIMAL
データ型が比較式で混在している場合に、問題が発生する可能性があります。このような比較を処理する方法の詳細は、「ブール式」を参照してください。
0(ゼロ)による除算。NA値を0で除算すると、結果はNAとなりエラーは発生しません。非NA値を0で除算すると、通常エラーが発生します。ディメンション化されたデータで計算を実行しているときに、0による除算のエラーが発生すると、不完全な結果になる可能性があります。REPORTまたは代入文(SET)を使用すると、計算されるたびに値がレポートまたは格納されるため、0で除算した場合はすべての値を処理する前にループ処理が停止されます。
0による除算のエラーを防ぐために、DIVIDEBYZEROオプションの値をYES
に変更できます。その結果、0による除算の結果がすべてNAとなり、エラーが発生しなくなります。これにより、ディメンション化された式の他の値が継続して計算されます。
負数の根。負数の根(整数以外の数値で累乗した場合を含む)を取得しようとすると、通常はエラーが発生します。エラー・メッセージを抑止し、式の負数値以外の根を継続して計算するには、ROOTOFNEGATIVEオプションをYES
に設定します。
オーバーフロー・エラー。DECIMALOVERFLOWオプションは、DIVIDEBYZEROと同様に機能します。計算によって処理できないほど大きい小数値の結果が返される場合に、エラーを生成するかどうかを制御できます。
テキスト式は、TEXT
、NTEXT
またはID
データ型のデータとして評価されます。テキスト式は、次のいずれかの組合せになります。
テキスト・リテラル。たとえば、'Boston'
や'Current
Sales
Report'
テキスト・ディメンション。たとえば、district
やmonth
テキスト変数または計算式。たとえば、product.name
です
テキスト結果を生成するファンクション。たとえば、JOINLINES('Product:
' product.name)
Oracle OLAPでは、NLS_LANGUAGEオプションで指定可能なすべての言語を使用したテキスト式がサポートされています。また、言語ディメンションの使用によって、複数言語のプログラムおよびアプリケーションもサポートされています。
テキスト値(TEXT
、NTEXT
またはID
)が予想される場所でDATETIME
値を使用するか、テキスト変数にDATETIME
値を格納すると、DATETIME
値は自動的にテキスト値に変換されます。
DATETIME
値の書式は、NLS_DATE_FORMATオプションにより制御されます。DATETIME
値をテキスト変数に格納すると、NLS_DATE_FORMAT設定は無効になります。
TEXT
およびNTEXT
データは、ほとんどの場合に区別なく使用できます。ただし、NTEXT
値がTEXT
変数に代入された場合などに、暗黙的に変換が行われる可能性があります。TEXT
がNTEXT
に変換される場合、NTEXT
データ型のUTF-8文字コードには他のほとんどのデータ型が含まれるため、データの消失は発生しません。しかし、NTEXT
がTEXT
に変換される場合、NTEXT
文字がワークスペースのキャラクタ・セットに示されていない場合はデータの消失が発生します。
TEXT
値およびNTEXT
値が同時に使用される場合(たとえばJOINCHARS
ファンクションへのコールにおいてなど)、TEXT
値がNTEXT
に変換され、NTEXT
値が返されます。
「日時データ型と期間データ型」で説明されているように、OLAP DMLでは、SQLでサポートされているものと同じ日時データ型および内部データ型がサポートされます。この項では次の内容について説明します。
日時式は、日時データ型の値を生成します。日時式の構文は次のとおりです。
datetime_value_expr AT LOCAL |
TIME ZONE { ' [ + | - ] hh:mm' | DBTIMEZONE | 'time_zone_name' | expr }
datetime_value_expr
は、日時式、または日時値を生成する複合式になります。日時および期間は、表2-7「日時フィールドと値」での定義に従って組み合せることができます。日時値を生成する3つの組合せは、日時式で有効です。
AT
LOCAL
を指定すると、現行のセッションのタイムゾーンが使用されます。
AT
TIME
ZONE
の設定は、次のように解釈されます。
文字列'(+|-)HH:MM'
はUTCのオフセットとしてタイムゾーンを指定します。
DBTIMEZONE
: Oracleは、データベースの作成中に(明示的またはデフォルトで)構築されたデータベース・タイムゾーンを使用します。
SESSIONTIMEZONE
: デフォルトまたは最新のALTER
SESSION
文で設定されたセッションのタイムゾーンが使用されます。
time_zone_name
: time_zone_name
で指定されたタイムゾーンのdatetime_value_expr
が返されます。有効なタイムゾーン名を表示するには、V$TIMEZONE_NAMES
動的パフォーマンス・ビューを問い合せます。
注意: 夏時間機能には、タイムゾーン地域名が必要です。地域名は、oracore/zoneinfo 下のタイムゾーン・ファイルに格納されます。サーバーでは常に、sys.props$ に記録されているリリース番号に対応した容量の大きいタイムゾーン・ファイルが使用されます。 |
expr
: expr
が有効なタイムゾーン書式で文字列を返す場合、そのタイムゾーンで入力が返されます。そうでない場合は、エラーが返されます。
期間式は、DSNTERVAL
またはMYINTERVAL
の値を生成します。式の構文は次のとおりです。
interval_value_expr DAY [(leading_field_precision)] TO
SECOND [(fractional_second_precision)]| YEAR [(leading_field_precision)] TO MONTH
interval_value_expr
は、DSNTERVAL
値またはMYINTERVAL
値、またはDSNTERVAL
値またはMYINTERVAL
値を生成する複合式になります。日時および期間は、表2-7「日時フィールドと値」での定義に従って組み合せることができます。期間の値を戻す6つの組合せは、期間式で有効です。
leading_field_precision
およびfractional_second_precision
は両方とも、0から9の任意の整数になります。DAY
またはYEAR
のいずれかでleading_field_precision
を省略すると、デフォルト値である2が使用されます。秒でfractional_second_precision
を省略すると、データベースはデフォルト値である6を使用します。問合せで返された値にデフォルトの精度を超える桁数が含まれる場合、エラーが返されます。したがって、問合せで返される値以上の精度を指定することをお薦めします。
算術演算は、日付(DATETIME
)、タイムスタンプ(TIMESTAMP
、TIMESTAMP_TZ
およびTIMESTAMP_LTZ
)および期間(DSINTERVAL
およびYMINTERVAL
)のデータで実行できます。Oracleでは、次のルールに従って結果が計算されます。
日付値およびタイムスタンプ値(期間値は除く)の算術演算で、NUMBER
定数を使用できます。Oracleでは、タイムスタンプ値が日付値に内部的に変換され、日時および期間の算術式ではNUMBER
定数が日数として解釈されます。たとえば、SYSDATE
+ 1は、明日になります。SYSDATE
- 7は、1週間前になります。SYSDATE
+ (10/1440)は、現時刻の10分後になります。SYSDATE
からサンプル表employees
のhire_date
列を減算すると、各従業員を雇用した時点からの経過日数が返されます。日付値やタイムスタンプ値の乗算および除算はできません。
Oracleでは、オペランドBINARY_FLOAT
およびBINARY_DOUBLE
はNUMBER
に暗黙的に変換されます。
各DATETIME
値には時刻要素が格納され、多くの場合、日付操作の結果には小数部が含まれます。この小数部は、1日の一部分を意味します。たとえば、1.5日は36時間です。小数部は、DATETIME
データの一般的な操作を行うOracle組込みファンクションによっても返されます。たとえば、MONTHS_BETWEEN
ファンクションは、2つの日付間の月数を返します。結果の小数部は、月(1か月は31日)の一部分を表します。
1つのオペランドがDATETIME
値または数値である場合(タイムゾーンおよび小数部要素のいずれも含まない場合)、次のようになります。
Oracleでは、他方のオペランドが暗黙的にDATETIME
データに変換されます。(ただし、数値と期間を掛けて期間を返す乗算を行う場合は除きます。)
他方のオペランドがタイムゾーン値を持つ場合、戻り値にはセッションのタイムゾーンが使用されます。
他方のオペランドが小数秒値を持つ場合、その小数秒値は失われます。
DATETIME
データ型専用の組込みファンクションにタイムスタンプ値、期間値または数値が渡されると、DATETIME
値以外の値は暗黙的にDATETIME
値に変換されます。
期間の計算が日時の値を戻す場合、その結果は実際の日時の値である必要があります。実際の日時の値でない場合、データベースはエラーを戻します。
Oracleでは、すべてのタイムスタンプの演算はUTC時間で実行されます。TIMESTAMP_LTZ
では、日時値がデータベースのタイムゾーンからUTCに変換され、演算を実行した後にデータベースのタイムゾーンに再変換されます。TIMESTAMP_TZ
では、日時値は常にUTCであるため、変換は必要ありません。
表2-13「日時演算のマトリックス」に、日時演算操作のマトリックスを示します。ダッシュはサポートされていない操作を表します。
表2-13 日時演算のマトリックス
オペランドおよび演算子 | DATETIME | TIMESTAMP | INTERVAL | 数値 |
---|---|---|---|---|
DATETIME |
— |
— |
— |
— |
+ |
|
|
|
|
- |
|
|
|
|
* |
|
|
|
|
/ |
|
|
|
|
TIMESTAMP |
— |
— |
— |
— |
+ |
|
|
|
|
- |
|
|
|
|
* |
|
|
|
|
/ |
|
|
|
|
INTERVAL |
— |
— |
— |
— |
+ |
|
|
|
|
- |
|
|
|
|
* |
|
|
|
|
/ |
|
|
|
|
数値 |
— |
— |
— |
— |
+ |
|
|
|
|
- |
|
|
|
|
* |
|
|
|
|
/ |
|
|
|
|
例: 期間値の式を開始時間に追加できます。order_date
列を持つサンプル表oe.orders
について考えます。
日付のみの式は、OLAP DMLのDATE
データ型として評価される式です(「日付のみのデータ型」を参照)。この式は、日付のみの値、日付のみのリテラル、またはより複雑な式を返すファンクションのいずれかです。
日付のみの値の計算
DATE
値に対して、数値を加算または減算できます。整数は日として計算され、小数値は一日の端数として計算されます。たとえば、SYSDATE+1.5
は、現在の日付および時刻に1日と12時間を加算します。DATE
値の乗算および除算はできませんし、数値からこれらの値を減算することもできません。たとえば、1-SYSDATE
や1*SYSDATE
はエラーになります。
算術式における日付のみの値の使用
算術式でDATE値を使用する場合、結果は数値または日付になります。日付の有効な演算と結果のデータ型の概要を、表2-14「DATE値の有効な演算」に示します。
ブール式は、TRUE
またはFALSE
の論理文です。ブール式では、比較する両方の式の基本データ型が同じであれば、すべての型のデータを比較できます。データをテストし、他のデータと等しい、より大きい、またはより小さいかを調べることができます。
ブール式は、次のようなブール・データで構成されます。
BOOLEAN
値(YES
とNO
、さらにそれらのシノニムであるON
とOFF
、TRUE
とFALSE
)
BOOLEAN
変数または計算式
BOOLEAN
結果を生成するファンクション
比較演算子によって計算されるBOOLEAN
値
たとえば、コードに次のブール式が含まれているとします。
actual GT 20000
この式では、Oracle OLAPは変数actual
の各値を定数20,000と比較します。値が20,000より大きい場合に文はTRUE
となり、値が20,000以下の場合に文はFALSE
となります。
ブール値を指定する際、真の値にはYES
、ON
またはTRUE
のいずれかを、偽の値にはNO
、OFF
またはFALSE
のいずれかを入力できます。ブール計算の結果が返される場合、デフォルトはNLS_LANGUAGEオプションで指定した言語でのYES
およびNO
となります。読取り専用のYESSPELLおよびNOSPELLオプションを指定すると、YES
およびNO
値が記録されます。
比較演算子および論理演算子は、表2-11「比較演算子および論理演算子」にリストされています。各演算子には優先順位があり、その順位によって評価の順序が決定されます。カッコで評価の順序を変更しないかぎり、優先順位の等しい演算子は、左から右に評価されます。ただし、真の値が確定した時点で、評価は停止されます。たとえば、次の式では、最初の句により式全体が真であると判断されるため、TOTALファンクションは実行されません。
yes EQ yes OR TOTAL(sales) GT 20000
ブール式は、比較の対象となる2つの項と、その間にある比較演算子の3つの部分からなる句です。AND
およびOR
論理演算子を使用してこれらの3つの部分を持つ式を結合することで、より複雑なブール式を作成できます。AND
またはOR
で結合した各式は、それ自体が完全なブール式である必要があるため、同じ変数を複数回指定する場合もあります。
たとえば、次の式は2番目の部分が不完全なため、有効ではありません。
sales GT 50000 AND LE 20000
次の式は、両方の部分が完全であるため、有効です。
sales GT 50000 AND sales LE 20000
複数のブール式を組み合せる場合、式の最初の部分で真の値が決定される場合でも、式全体を有効にする必要があります。式が評価される前に式全体がコンパイルされるため、ブール式の2番目の部分に未定義の変数が存在する場合は、エラーが発生します。
ブール式の意味を逆転させるには、式をカッコで囲んでNOT
演算子を使用します。
次の2つの式は等価です。
district NE 'BOSTON' NOT(district EQ 'BOSTON')
例2-2 ブール比較の使用
次の例は、Bostonにおける各製品の売上がリテラル量より大きかったかどうかを表示するレポートを示しています。
LIMIT time TO FIRST 2 LIMIT geography TO 'BOSTON' REPORT DOWN product ACROSS time: f.sales GT 7500
このREPORT
文により次のデータが返されます。
CHANNEL: TOTALCHANNEL GEOGRAPHY: BOSTON ---F.SALES GT 7500--- --------TIME--------- PRODUCT Jan02 Feb02 -------------- ---------- ---------- Portaudio NO NO Audiocomp YES YES TV NO NO VCR NO NO Camcorder YES YES Audiotape NO NO Videotape YES YES
ブール式で比較するデータにNA値が含まれている場合でも、それがブール式として意味を持てばYES
またはNO
という結果が返されます。たとえば、NA値が非NA値と等価であるかどうかをテストすると、結果はNO
となります。ただし、結果が紛らわしい場合はNA
が返されます。たとえば、NA値が非NA値より小さいか大きいかをテストすると、結果はNA
値となります。
表2-15「NA値を含むブール式で結果が非NA値となる場合」に、NA値を含むブール式のうち、非NA値を生成する式の結果を示します。
数値データを比較する際に予期しない結果が返された場合は、その原因として次のような事柄が考えられます。
DECIMALSオプションが設定されているため、比較している数値に、出力に表示されない小数の下位の桁が含まれている場合
2つの浮動小数点数を比較しており、少なくとも1つの数値が算術演算の結果生成されたものである場合
比較でSHORTDECIMAL
およびDECIMAL
データ型を混在させている場合
ABSおよびROUNDファンクションを使用して近似等価テストを行い、予期しない比較エラーを発生させる3つの原因すべてを回避することをお薦めします。ABSまたはROUNDを使用する場合、絶対誤差または四捨五入係数をアプリケーションに適した値に調整できます。計算速度を重視する場合は、ROUNDファンクションではなくABSファンクションを使用することをお薦めします。
expense
は、計算によって値が設定される10進変数であるとします。計算の結果が100.000001で、小数点以下を2桁とすると、出力される値は100.00です。ただし、次の文の出力ではNO
が返されます。
SHOW expense EQ 100.00
ABS
またはROUND
ファンクションを使用すると、比較を行う際にそのようなわずかな誤差を無視できます。
コンピュータ言語で浮動小数点数を使用する際の一般的な限界として、比較する2つの浮動小数点数のどちらかが算術演算により得られた値である場合、両者が完全に一致することはほとんどありません。たとえば、一部のシステムでは、次の文によってYES
ではなくNO
が返されます。
SHOW .1 + .2 EQ .3
小数値データを扱う場合は、それらを直接比較するコードは作成しないでください。これらのファンクションを使用すると、誤差が一定の範囲内であれば、近似する2つの値を等しいとみなすことができます。たとえば、次の2つの文はどちらもYES
が返されます。
SHOW ABS((.1 + .2) - .3) LT .00001 SHOW ROUND(.1 + .2) EQ ROUND(.3, .00001)
端数部分を含む小数値については、SHORTDECIMAL
表現とDECIMAL
表現またはNUMBER
表現は、厳密には一致しないと考える必要があります。これは、正確に表現できない端数部分を近似する有効桁数が、SHORTDECIMALデータ型よりもDECIMAL
データ型およびNUMBER
データ型の方が多いためです。
SHORTDECIMAL
データ型の変数を定義して、それを端数小数値に設定した後、次のようにそのSHORTDECIMAL
数値を端数小数値と比較するとします。
DEFINE sdvar SHORTDECIMAL sdvar = 1.3 SHOW sdvar EQ 1.3
この比較では、NO
が返されると考えられます。ここでは、リテラルは自動的にDECIMAL
型として認識され、SHORTDECIMAL
型の変数sdvar
がDECIMAL
型に変換され、小数部分を拡張するため0がいくつか追加されます。その後、ビット単位の比較が実行され、失敗します。DECIMAL
またはNUMBER
データ型の変数を使用した同じ比較では、多くの場合YES
が返されます。
このような比較エラーを回避するには、次のような方法があります。
比較でSHORTDECIMAL
データ型と、DECIMAL
またはNUMBER
データ型を混在させないでください。この2つのデータ型の混在を防ぐには、通常、小数部分を含む変数をSHORTDECIMAL
として定義しないようにします。
ABS
ファンクションまたはROUND
ファンクションを使用して、近似する2つの値が等しいとみなされるようにします。次の文は、どちらもYES
を返します。
SHOW ABS(sdvar - 1.3) LT .00001 SHOW ROUND(sdvar, .00001) EQ ROUND(.3, .00001)
同じディメンション内の値については、テキスト値に基づく比較は行われません。かわりに、Oracle OLAPはディメンションのデフォルト・ステータスにおける値の位置を比較します。これにより、次のような文を指定できます。
REPORT district LT 'Seattle'
文は、次のような過程で解析されます。
テキスト・リテラル'Seattle'
は、district
ディメンションのデフォルトのステータス・リストにある位置に変換されます。
その位置が、district
ディメンションにある他のすべての値の位置と比較されます。
次のレポートに示すように、district
ディメンションのデフォルトのステータス・リストでSeattle
より前にある地区には値YES
が返され、Seattle
自体にはNO
が返されます。
REPORT 22 WIDTH district LT 'Seattle' District DISTRICT LT 'Seattle' -------------- ---------------------- Boston YES Atlanta YES Chicago YES Dallas YES Denver YES Seattle NO
より複雑な例では、最初の6か月に代入された初期値に基づいて、変数quota
に増分値が代入されます。比較は、month
ディメンションの値の位置に基づいて行われます。このディメンションは時間ディメンションであるため、値は時系列になります。
quota = IF month LE 'Jun02' THEN 100 ELSE LAG(quota, 1, month)* 1.15
しかし、式region
lt
district
など、異なるディメンションの値を比較する場合、共通分母はTEXT
のみであるため、ディメンションの位置ではなくテキスト値が比較されます。
任意のブール比較演算子で2つの日付を比較できます。日付の場合、「より少ない」は「前」を意味し、「より大きい」は「後」を意味します。比較する式には、表2-11「比較演算子および論理演算子」に示す日付計算を含めることができます。たとえば、請求書アプリケーションでは、未払い請求書に対する督促状を送付するために、その日が請求日から60日以上経っているかどうかを判断できます。
bill.date + 60 LE SYSDATE
日付には、数値も使用できます。TO_NUMBERファンクションおよびTO_DATEファンクションを使用すれば、DATE
値をINTEGER
値に、あるいはINTEGER
値をDATE
値に変換して、両者を比較できます。
テキスト・データを比較する場合、記号、空白、大文字と小文字の違いなどを含め、テキストを正確に入力する必要があります。テキスト・リテラルは、一重引用符で囲む必要があります。たとえば、次の式では各従業員名の頭文字が文字「M」より後にあるかどうかをテストします。
EXTCHARS(employee.name, 1, 1) GT 'M'
TEXT
値とID
値を比較することは可能ですが、この2つの値が等しくなるのは長さが同じ場合のみです。テキスト値が他のテキスト値より大きいか小さいかをテストする場合、順序付けはNLS_SORTオプションの設定を基準として行われます。
最初に数値をテキストに変換することにより、数値とテキストを比較できます。順序付けは、文字の値を基準として行われます。テキストは左から右に評価されるため、予期しない結果が返されることがあります。たとえば、テキスト・リテラル1234
と100,999.00
を比較した場合、前者の2番目の文字2
は後者の2番目の文字0
よりも大きいため、1234の方がより大きいという結果になります。
name.label
は3-Person
という値を持つID
変数であり、name.desc
は3-Person Tents
という値を持つTEXT
変数であるとします。
次のSHOW
文の結果は、NO
となります。
SHOW name.desc EQ name.label
次の文の結果は、YES
となります。
name.desc = '3-Person' SHOW name.desc EQ name.label
ブール演算子LIKE
は、テキスト値とテキスト・パターンの比較用の演算子です。対応する文字が一致している場合、テキスト値は他のテキスト値またはパターンと部分一致していることになります。
リテラルな一致に加えて、LIKE
では文字列の複数の文字に一致するワイルドカード文字を使用できます。
パターン内のアンダースコア(_)文字は、任意の1文字に一致します。
パターン内のパーセント(%)文字は、最初の文字列の0文字または任意の数の文字に一致します。
たとえば、%AT_
のパターンは、文字AT
の前に0文字または任意の数の文字が含まれ、後ろに1文字が含まれるテキストに一致します。LIKE
を使用してDATA
およびERRATA
をパターン%AT_
と比較すると、両方の場合にYES
が返されます。
LIKE演算子を使用した式の結果は、LIKECASEオプションおよびLIKENLオプションの設定により異なります。
LIKEには、否定演算子が存在しません。否定演算を実行するには、式全体を否定する必要があります。たとえば、次の文の結果はNO
となります。
SHOW NOT ('Boston' LIKE 'Bo%')
条件式は、条件に基づいて値を選択する際に使用します。条件式は、データ型が適切であれば、他の式の一部として使用できます。Oracle OLAPでは、次の条件式を使用できます。
IF式は、ブール条件に基づいて2つの値のうちどちらか一方を選択する際に使用します。
注意: IF式を、構文は似ていますが異なる目的の、Oracle OLAPプログラムで使用するIF...THEN...ELSEコマンドと混同しないでください。IF...THEN...ELSEコマンドはデータ型を持たず、式のように評価されることはありません。 |
IF式の構文は次のとおりです。
IF Boolean-expression THEN expression1 ELSE expression2
ほとんどの場合、expression1およびexpression2のデータ型は、同じ基本的なデータ型(数値、テキストまたはブール)であることが必要であり、式全体のデータ型はバイナリ演算子の場合と同じルールに従って決定されます。ただし、expression1またはexpression2のどちらかのデータ型がDATEである場合、他方の式は数値またはテキストのデータ型にできます。Oracle OLAPでは両方のデータ型がDATEである必要があるので、数値またはテキスト値はDATEに変換されます。また、一方の式の値がディメンション値であれば、もう一方の式の値もQDR用としてディメンション値に変換されます。
IF式はネストできますが、この場合、SWITCH式を使用することもできます(「SWITCH式」を参照)。
IF式では、まずブール式が評価され、その後で次のような処理が実行されます。
ブール式の結果がTRUE
の場合、expression1が評価され、その値を返します。
ブール式の結果がFALSE
の場合、expression2が評価され、その値を返します。
expression1
引数およびexpression2
引数には、同じ基本データ型に評価される任意の有効なOLAP DMLを指定できます。ただし、どちらかの値のデータ型がDATE
の場合、もう一方の値に数値データ型またはテキスト・データ型を指定できます。両方のデータ型をDATE
にする必要があるため、Oracle OLAPは数値またはテキスト値をDATE
に変換します。式全体のデータ型は、2つの式と同じになります。ブール式の結果がNA
の場合、NA
を返します。
例2-3 IF式の使用
例として、売上ボーナスのレポートを示します。売上が予算を上回った場合、ボーナスはその上回った額の5パーセントですが、地区の売上が予算を下回った場合はボーナスが0(ゼロ)になります。
LIMIT month TO 'Jan02' TO 'Jun02' LIMIT product TO 'Tents' REPORT DOWN district IF sales-sales.plan LT 0 THEN 0 ELSE .05*(sales-sales.plan) PRODUCT: TENTS ---IF SALES-SALES.PLAN LT 0 THEN 0 ELSE .05*(SALES-SALES.PLAN)--- ----------------------MONTH------------------------------ DISTRICT Jan02 Feb02 Mar02 Apr02 May02 Jun02 --------- -------- -------- -------- ------- --------- ---------- Boston 229.53 0.00 0.00 0.00 584.51 749.13 Atlanta 0.00 0.00 0.00 190.34 837.62 1,154.87 Chicago 0.00 0.00 0.00 84.06 504.95 786.81 ...
SWITCH式は、一連のCASE式で構成されています。SWITCH式は、1つの値に対してすべての条件と等価比較を行う場合に、複雑にネストされたIF ... THEN ... ELSE式のかわりに使用できます。
注意: SWITCH式を、構文は似ていますが異なる目的の、Oracle OLAPプログラムで使用するSWTICHコマンドと混同しないでください。SWITCHコマンドは式のように評価されることはありません。 |
SWITCH式の構文は次のとおりです。
SWITCH expression DO { case-label ... exp [,] } ... DOEND
ここで、case-labelの構文は次のとおりです。
CASE exp: | DEFAULT:
SWITCH式の処理では、一致が見つかるまで各CASE式との比較が行われます。一致が見つかると、現行のCASEグループの最後のラベルの後に指定された値が返されます。一致が見つからない場合、DEFAULTラベルが指定されていると、DEFAULT部で指定されている値が返されますが、指定されていない場合は、NA
が返されます。
例2-4 IF式のかわりにSWITCH式を使用した場合
ネストしたIF...THEN...ELSE文を含む次のようなOLAP DML文を作成したとします。
testprogram = IF testtype EQ 0 - THEN 'program0' - ELSE IF testtype EQ 1 - THEN 'program1' - ELSE IF testtype EQ 2 OR testtype EQ 3 - THEN 'program2' ELSE NA
これを次のように、SWITCH式を使用して同じ動作を行うコードに書き換えることができます。
testprogram = SWITCH testtype DO - CASE 0: 'program0', - CASE 1: 'program1', - CASE 2: - CASE 3: 'program2', - DEFAULT: NA - DOEND
また、カンマやDEFAULT部を省略して行数を減らしたSWITCH文を使用しても同様の書換えが可能です。一致が見つからない場合のデフォルトの戻り値は、NA
です。
testprogram = SWITCH testtype DO CASE 0: 'program0' CASE 1: 'program1' - CASE 2: CASE 3: 'program2' DOEND
置換式を作成するには、式の先頭にアンパサンド文字(&
)を使用します。アンパサンド(置換演算子)を使用するので、アンパサンド置換とも呼ばれています。アンパサンドを指定すると、Oracle OLAPは置換式を含む式を次の手順で評価します。
先頭にアンパサンドが付いている式(置換式)を評価します。
手順1の結果(置換式の結果)を使用して、式の残りの部分を評価します。
アンパサンド置換により、式を指定するときに間接的なレベルを指定できます。たとえば、アンパサンドの後に、他の変数の名前を含む変数を指定すると、その式の値は、その変数名を持つ変数に含まれているデータになります。アンパサンド置換により、プログラムの実行時に処理するデータを選択できる、より汎用的なプログラムを記述できるようになります。ただしOracle OLAPでは、アンパサンド置換を含む行はコンパイルされず、このような行は、プログラム実行時に解釈が行われます。プログラム内でアンパサンド置換の使用を回避するには、多くの場合、かわりにIFコマンドやSWITCHコマンドを使用できます。
モデル方程式では、アンパサンド置換を使用できません。
例2-5 アンパサンド置換の使用
curname
という変数には、アナリティック・ワークスペース内のあるディメンションの名前(product
)が含まれているとします。次の文を実行すると、REPORTにより、curname
変数に格納されている実際の値product
が1つのみ生成されます。
REPORT curname CURNAME ---------- PRODUCT
ただし、次の文を実行した場合は、REPORTによりディメンションproduct
の値が生成されます。
REPORT &curname PRODUCT -------------- Tents Canoes Racquets Sportswear Footwear
QDRとアンパサンド置換の使用
QDRとともにアンパサンドを使用する場合、置換が行われる前に変数を修飾するには、式全体をカッコで囲む必要があります。
reptype
によってディメンション化され、変数名を含むmyvar
という名前のテキスト変数があるとします。これは、reptype
によってディメンション化されたmyvar
であり、myvar
という名前の変数ではない点に注意してください。そのため、myvar
を修飾して、結果の値をREPORT文で使用するためには、カッコで囲む必要があります。
REPORT &(myvar(reptype 'actual'))
カッコを使用せず、myvar
で指定された変数がsales
の場合、sales
がreptyp
によってディメンション化されないことを示すエラー・メッセージを受け取ります