プライマリ・コンテンツに移動
Oracle® OLAP DML Reference
12c Release 1 (12.1)
B71310-04
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次
索引へ移動
索引

前
 
次
 

2 データ型、演算子および式

この章では、次の項目について説明します。

OLAP DMLのデータ型

他の言語と同様、OLAP DMLのデータ型は、値や値に対して1つ以上の演算を定義したものの種類です。

Oracle OLAP DMLでは、表2-1「OLAP DMLのデータ型の一覧に示すデータ型をサポートしています。

表2-1 OLAP DMLのデータ型の一覧

データ型 略称 説明

BOOLEAN

BOOL

TRUEおよびFALSEの論理値を表します。

DATE

なし

同じ名前のSQLのデータ型には対応しません。OLAP DML固有の古いデータ型です。

A.D.1000年1月1日からA.D.9999年12月31日までの範囲の日、月および年のデータ(時と分のデータは含みません)。

DATETIME

なし

SQLのDATEデータ型に対応します。

B.C.4712年1月1日からA.D.9999年12月31日までの日付を指定します。デフォルトの書式は、NLS_DATE_FORMATパラメータを使用すると明示的に、NLS_TERRITORYパラメータを使用すると暗黙的に決定されます。サイズは7バイトに固定されています。このデータ型には、YEARMONTHDAYHOURMINUTEおよびSECONDの日時フィールドが含まれます。小数部の秒数およびタイムゾーンは含まれません。

TIMESTAMP

なし

SQLのTIMESTAMPデータ型に対応します。

日付値(年、月および日)と時刻値(時、分および秒)で、SECOND日時フィールドの小数部で最大精度9まで指定できます。デフォルトの書式は、NLS_DATE_FORMATパラメータを使用すると明示的に、NLS_TERRITORYパラメータを使用すると暗黙的に決定されます。サイズは11バイトです。このデータ型には、YEARMONTHDAYHOURMINUTEおよびSECONDの日時フィールドが含まれます。小数部の秒数は含まれますが、タイムゾーンは含まれません。

TIMESTAMP_TZ

なし

SQLのTIMESTAMP WITH TIME ZONEデータ型に対応します。

TIMESTAMPのすべての値とタイムゾーンの時差値で、SECOND日時フィールドの小数部で最大精度9まで指定できます。デフォルトの書式は、NLS_DATE_FORMATパラメータを使用すると明示的に、NLS_TERRITORYパラメータを使用すると暗黙的に決定されます。サイズは13バイトに固定されています。このデータ型には、YEARMONTHDAYHOURMINUTESECONDTIMEZONE_HOURおよびTIMEZONE_MINUTEの日時フィールドが含まれます。小数部の秒数および明示的なタイムゾーンが含まれます。

TIMESTAMP_LTZ


SQLのTIMESTAMP WITH LOCAL TIME ZONEデータ型に対応します。

TIMESTAMP_TZのすべての値。ただし、次の例外を含みます。

  • データベースへの格納時、データがデータベースのタイムゾーンに正規化されている場合。

  • データは取得時、セッションのタイムゾーンで表示されます。

デフォルトの書式は、NLS_DATE_FORMATパラメータを使用すると明示的に、NLS_TERRITORYパラメータを使用すると暗黙的に決定されます。サイズは11バイトです。

DSINTERVAL

なし

SQLのINTERVAL DAY TO SECONDデータ型に対応します。

日、時、分および秒で期間を格納します。

YMINTERVAL

なし

SQLのINTERVAL YEAR TO MONTHデータ型に対応します。

年と月で期間を格納します。

INTEGER

INT

(-2**31)から(2**31)-1の整数。

SHORTINTEGER

SHORTINT

(-2**15)から(2**15)-1の整数。

LONGINTEGER

LONGINT

(-2**63)から(2**63)-1の整数。

DECIMAL

DEC

-(10**308)から+(10**308)の小数(最大有効桁数15桁)。

SHORTDECIMAL

SHORT

-(10**38)から+(10**38)の小数(最大有効桁数7桁)。

NUMBER [(p,[s])]

なし

-(10**125)から+(10**125)の小数(最大有効桁数38桁)。

TEXT

なし

データベース・キャラクタ・セットで1行に最大32,767バイト。このデータ型は、データベースのCHARデータ型およびVARCHAR2データ型と等価。ただし、このデータ型の変数を定義する際は、変数値に対する最大文字数を2**32から2**64に増加させるため、DEFINE VARIABLE文にRANSPACE64キーワードを指定します。

NTEXT

なし

UTF-8文字コードで1行に最大32,767バイト。このデータ型は、データベースのNCHARデータ型およびNVARCHAR2データ型と等価。ただし、このデータ型の変数を定義する際は、変数値に対する最大文字数を2**32から2**64に増加させるため、DEFINE VARIABLE文にRANSPACE64キーワードを指定します。

ID

なし

データベース・キャラクタ・セットで1行にシングルバイト文字で最大8文字。(IDは、単純なディメンションの値にのみ有効(DEFINE DIMENSION(単純)を参照)。)

RAW (size)

なし

長さがsizeバイトのRAWバイナリ・データ。最大サイズは2000バイト。RAW値に対してサイズの指定が必須です。ただし、このデータ型の変数を定義する際は、変数値に対する最大文字数を2**32から2**64に増加させるため、DEFINE VARIABLE文にRANSPACE64キーワードを指定します。

ROWID

なし。

表の行のアドレスを一意に表すBASE64文字列。主に、ROWID疑似列によって返される値のためのデータ型です。

UROWID

なし

索引編成表の行の論理アドレスを表すBASE64文字列。オプションのsizeは、UROWID型の列のサイズです。最大サイズおよびデフォルトは4,000バイトです。

WORKSHEET


値を特定のデータ型に変換せずに引数を処理する場合に、OLAP DMLプログラムの引数および一時変数に指定します。WKSDATAファンクションを使用して、WORKSHEETデータ型で引数のデータ型を取得します。


データ型のカテゴリ

通常、データ型が属するカテゴリとデータ型は、次のとおりです。

各OLAP DMLデータ・オブジェクトで使用できるデータ型の種類

オブジェクトの種類により、その値で使用されるデータ型が異なります。

  • 変数では、すべてのデータ型がサポートされています。

  • ディメンションとサロゲートでは、INTEGERNUMBERTEXTID(単純なディメンションのみ)、NTEXTDATETIMETIMESTAMPTIMESTAMP_TZTIMESTAMP-LTZDSINTERVALおよびYMINTERVALのデータ型がサポートされています。また、DEFINE DIMENSION(DWMQY)文を使用してDAY、WEEK、MONTH、QUARTERおよびYEAR型のディメンションを定義する場合、そのディメンションの値のデータ型は、日付のみになります。

数値データ型

表2-2「OLAP DMLの数値データ型」に示す数値データ型がサポートされています。

表2-2 OLAP DMLの数値データ型

データ型 データ値

INTEGER

(-2**31)から(2**31)-1の整数。

SHORTINTEGER

(-2**15)から(2**15)-1の整数。

LONGINTEGER

(-2**63)から(2**63)-1の整数。

DECIMAL

-(10**308)から+(10**308)の小数(最大有効桁数15桁)。

SHORTDECIMAL

-(10**38)から+(10**38)の小数(最大有効桁数7桁)。

NUMBER

-(10**125)から+(10**125)の小数(最大有効桁数38桁)。


データを入力する場合、これらのデータ型のどの値も、プラス記号(+)またはマイナス記号(-)で始めることができますが、カンマを含めることはできません。ただし、他の数式に続く負の数のにはカンマが必要で、カンマがない場合は、マイナス記号は減算演算子として解釈されることに注意してください。また、小数値には小数点を使用できます。データを表示する際、桁区切りおよび小数点は、NLS_NUMERIC_CHARACTERSオプションによって制御されます。

LONGINTEGER値の使用

ほとんどの数値データ型は、値が範囲外の場合、NAを返します。ただし、LONGINTEGERデータ型にはオーバーフロー保護機能がないため、計算結果が範囲外の数値になるような場合、不適切な値が返されます。このことが問題になる場合は、LONGINTEGERのかわりにNUMBERデータ型を使用してください。

NUMBER値の使用

NUMBER変数を定義する場合、必要以上に大きくない適切なその精度(p)およびスケール(s)を指定できます。精度とは有効桁数を指します。スケールには正または負を指定できます。正のスケールは小数点の右側の桁数を識別し、負のスケールは小数点の左側の桁数を識別しますが、この部分は四捨五入される場合があります。

NUMBERデータ型は、Oracle Databaseの標準ライブラリによってサポートされ、SQLでの動作と同様に動作します。テキスト・データ型またはINTEGERデータ型が適切でない場合に、ディメンションおよびサロゲートに使用されます。通常、計算(予測および集計など)に使用されない変数に代入され、データベースの丸め処理に一致する必要がある変数、または高い精度が要求される変数に使用されます。変数にNUMBERデータ型を割り当てるかどうかを判断する場合、パフォーマンスを最適化するために次の点に注意してください。

  • NUMBER値はハードウェア(速度優先)ではなくソフトウェア(精度優先)で計算されるため、アナリティック・ワークスペースにおけるNUMBER変数の計算は、他の数値データ型より遅くなります。

  • アナリティック・ワークスペースからNUMBERデータ型が含まれるリレーショナル列にデータがフェッチされる場合、アナリティック・ワークスペースでデータにNUMBERデータ型が含まれている場合には、変換手順が不要なため、パフォーマンスが最適化されます。

テキスト・データ型

Oracle OLAPでは、表2-3「OLAP DMLのテキスト・データ型」に示すテキスト・データ型がサポートされています。

表2-3 OLAP DMLのテキスト・データ型

データ型 データ値

TEXT

データベース・キャラクタ・セットで1行に最大32,767バイト。このデータ型は、データベースのCHARデータ型およびVARCHAR2データ型と等価。

NTEXT

UTF-8文字コードで1行に最大32,767バイト。このデータ型は、データベースのNCHARデータ型およびNVARCHAR2データ型と等価。

ID

データベース・キャラクタ・セットで1行にシングルバイト文字で最大8文字。(IDは、単純なディメンションの値にのみ有効(DEFINE DIMENSION(単純)を参照)。)


テキスト・リテラル

テキスト・リテラルは、一重引用符で囲む必要があります。Oracle OLAPは、引用符で囲まれていない英数字をオブジェクト名として認識し、二重引用符はコメントの開始として認識します。

引用符付き文字列内に引用符付き文字列を埋め込むことができますが、これは、コンポジットまたは結合ディメンションのベース・ディメンション値を指定する場合、または値にアポストロフィが含まれている場合に必要となる処理です。Oracle OLAPでは、テキスト文字列であることを示すために一重引用符が使用されるため、一重引用符は、テキスト文字列の中で使用される場合は特殊記号とみなされます。したがって、テキスト文字列内で一重引用符のリテラル値を指定する場合は、引用符の前にバックスラッシュを付けます。

たとえば、New YorkおよびApple Saucemarkprod結合ディメンションのベース・ディメンション値の有効な組合せであるかどうかを確認するとします。次の文によって、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 認識されるエスケープ・シーケンス

シーケンス 意味

\b

バックスペース。

\f

改ページ。

\n

ライン・フィード(改行)。

\r

キャリッジ・リターン(改行)。

\t

水平タブ。

\"

二重引用符。

\'

一重引用符。

\\


バックスラッシュ。

\dnnn

ASCIIコードnnn(10進)の文字。\dは10進のエスケープを示し、nnnは文字の10進値。

\xnn

ASCIIコードnn(16進)の文字。\xは16進のエスケープを示し、nnは文字の16進値。

\Unnnn

Unicode nnnnの文字で、\UはUnicodeのエスケープを示し、nnnnは値U+nnnnでUnicodeのコード・ポイントを表す4桁の16進のINTEGER値。Uは、大文字にする必要がある。


日付のみのデータ型

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データ型は時と分のデータは含まないため、通常、日付のみのデータ型と呼ばれます。


ヒント:

SQLのDATEデータ型に対応するOracle OLAP DMLのデータ型は、DATETIMEという名前です。詳細は、DATETIMEデータ型を参照してください。

日付のみの入力値

DATE型の有効な入力リテラル値は、数値、パック数値または月名という3つのスタイルのいずれか1つに従う必要があります。これらのスタイルは、セッション全体で混在していても構いません。


ヒント:

テキスト式(TEXTデータ型またはIDデータ型を持つ式など)が有効な日付のみの値であるかどうかを確認するには、ISDATEプログラムを使用します。

数値スタイル

次のルールに基づき、日、月、年を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のデータ型

DATETIME

DATE

TIMESTAMP

TIMESTAMP

TIMESTAMP_TZ

TIMESTAMP WITH TIMEZONE

TIMESTAMP_LTZ

TIMESTAMP WITH LOCAL TIME ZONE

DSINTERVAL

INTERVAL DAY TO SECOND

YMINTERVAL

INTERVAL YEAR TO MONTH


OLAP DMLの日時データ型は、DATETIMETIMESTAMPTIMESTAMP_TZおよびTIMESTAMP_LTZです。期間データ型は、YMINTERVALおよびDSINTERVALです。日時と期間は両方ともフィールドで構成されています(「日時フィールドと期間フィールド」を参照)。


注意:

Oracle OLAP DMLにはDATEという名前のデータ型がありますが、これは同じ名前のSQLのデータ型に対応しません。(OLAP DMLのDATEデータ型は、SQLの日時データ型と期間データ型がOLAP DMLに実装される前に実装されました。)OLAP DMLのDATEデータ型は日付値のみ(時刻値は含まない)を格納するため、日付のみのデータ型と呼ばれることがあります。

日時フィールドと期間フィールド

日時と期間は両方ともフィールドで構成されています。これらのフィールドの値によってデータ型の値が決まります。表2-7「日時フィールドと値」に、日時フィールドと、日時および期間で使用できる値を示します。


ヒント:

日時データの操作で予期しない結果を回避するには、DBTIMEZONEとSESSIONTIMEZONEを使用してデータベースとセッションのタイムゾーンを確認できます。タイムゾーンを手動で設定しなかった場合、Oracle Databaseではデフォルトでオペレーティング・システムのタイムゾーンが使用されます。オペレーティング・システムのタイムゾーンがOracleで有効でない場合は、Oracleは、協定世界時(UTC)(以前のグリニッジ標準時)をデフォルトの値として使用します。

表2-7 日時フィールドと値

日時フィールド 日時データ型の有効な値 期間データ型の有効な値

YEAR

-4712から9999(0年を除きます)

任意の正および負の整数

MONTH

01から12

0から11

DAY

01から31(現行のNLS暦年のパラメータのルールに基づき、MONTHおよびYEARの値で制限されます)

任意の正および負の整数

HOUR

00から23

0から23

MINUTE

00から59

0から59

SECOND

00から59.9(n)(「9(n)」は秒の小数部の精度)。9(n)部分はDATETIMEでは適用されません。

0から59.9(n)。ただし、9(n)は期間の小数秒の精度。

TIMEZONE_HOUR

-12から14(この範囲は夏時間の変更を保存します)。DATETIMETIMESTAMPには適用されません。

適用なし

TIMEZONE_MINUTE

(表の終わりの注意を参照)

00から59。DATETIMETIMESTAMPには適用されません。

適用なし

TIMEZONE_REGION

V$TIMEZONE_NAMESデータ・ディクショナリ・ビューのTZNAME列を問い合せます。DATETIMETIMESTAMPには適用されません。

すべてのタイムゾーン地域の完全なリストは、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

適用なし

TIMEZONE_ABBR

V$TIMEZONE_NAMESデータ・ディクショナリ・ビューのTZABBREV列を問い合せます。DATETIMETIMESTAMPには適用されません。

適用なし


注意: TIMEZONE_HOURTIMEZONE_MINUTEの両方を指定すると、書式+|- hh:mmのエンティティ(値は-12:59から+14:00の範囲)として解釈されます。

日時書式テンプレート

日時書式テンプレートは、文字列に格納する日時データの書式を示すテンプレートです。書式モデルによってデータベース内に格納された値の内部表現は変更されません。文字列を日付に変換する場合、書式モデルによってOracle Databaseによる文字列の解釈方法が決定されます。OLAP DML文では、書式モデルをTO_CHARおよびTO_DATEファンクションの引数として使用して次を指定できます。

  • Oracleがデータベースから値を戻す場合に使用する書式

  • Oracleがデータベースに格納するために指定した値の書式

日時書式テンプレートは、次のファンクションで使用できます。

  • デフォルト書式以外の書式の文字値を日時値に変換するTO_*日時ファンクション(TO_*日時ファンクションとは、TO_CHARTO_DATETO_TIMESTAMPTO_TIMESTAMP_TZTO_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の書式一致」を参照)。

表2-8 Oracleの書式一致

元の書式要素 元の書式要素のかわりに使用される書式要素
'MM'

'MON'および'MONTH'

'MON

'MONTH'

'MONTH'

'MON'

'YY'

'YYYY'

'RR'

'RRRR'


DATETIMEデータ型

OLAP DMLのDATETIMEデータ型は、SQLのDATEデータ型に対応します。DATETIME値の書式および言語は、NLS_DATE_FORMATオプションおよびNLS_DATE_LANGUAGEオプションの設定によって制御されます。DATETIMEデータ型は、Oracle Databaseの標準ライブラリによってサポートされ、OLAP DMLではSQLのDATEデータ型の動作と同様に動作します。


注意:

Oracle OLAP DMLにはDATEという名前のデータ型がありますが、これは同じ名前のSQLのデータ型に対応しません。OLAP DMLのDATEデータ型は日付値のみ(時刻値は含まない)を格納するため、日付のみのデータ型と呼ばれることがあります。DATE値の書式設定を制御するDATEORDER、DATEFORMATおよびMONTHNAMESの各オプションは、DATETIME値には影響しません。ただし、DATETIME値およびDATE値は、ほとんどのDML文で区別なく使用できます。

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ファンクションは、現行のセッションの日付を返します。SYSDATETO_*日時ファンクション、およびデフォルトの日付書式の詳細は、「日時ファンクション」およびDATE_FORMATコマンドを参照してください。

TIMESTAMPデータ型

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データ型

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データ型

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データ型

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データ型

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で指定した数より多い場合、nfractional_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値を表すことができます。

  • YESTRUEON

  • NOFALSEOFF

BOOLEAN式の使用については、「ブール式」を参照してください。

RAWデータ型

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として表示および入力されます。


関連項目:

HEXTORAWファンクションおよびRAWTOHEXファンクション

行識別子データ型

行識別子データ型は、リレーショナル表の行のアドレスを格納するために使用されます。OLAP DMLでは、リレーショナル表のデータをアナリティック・ワークスペース内のオブジェクトにコピーするのに使用できる、次の2つの異なるデータ型がサポートされています。

ROWIDデータ型

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疑似列についての説明。

UROWIDデータ型

一部のリレーショナル表の列は、物理的でないアドレスや永続的でないアドレス、あるいは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ファンクションを使用して別の結果を取得できます。

OLAP DML演算子

演算子は、値を変換したり、なんらかの方法で値を別の値と組み合せるための記号です。表2-9「OLAP DML演算子」に、OLAP DML演算子のカテゴリを示します。

表2-9 OLAP DML演算子

カテゴリ 説明

算術

数式で数値データとともに使用され、数値結果を生成する演算子。一部の算術演算子は、結果を日付または数値のいずれかで返す、日付データと数値データが混在した日付式で使用可能。算術演算子のリストは、「算術演算子」を参照。数式の詳細は、「数式」を参照。

比較

基本型(数値型、テキスト型、日付型、または、ごくまれにブール型)が同じである2つの値を比較し、BOOLEAN結果を返す演算子。比較演算子のリストは、「比較演算子および論理演算子」を参照。BOOLEAN式の詳細は、「ブール式」を参照。

論理

論理演算を使用してBOOLEAN値を変換し、BOOLEAN結果を返すANDORおよびNOT演算子。論理演算子のリストは、「比較演算子および論理演算子」を参照。BOOLEAN式の詳細は、「ブール式」を参照。

代入

式の結果をオブジェクトに代入したり、値をOLAP DMLオプションに代入したりするための演算子。代入文の使用の詳細は、SETコマンド、SET1コマンドおよび「代入演算子」を参照。

条件

条件に基づいて値を選択するIF...THEN...ELSESWITCHおよびCASE演算子。詳細は、「条件式」を参照。

置換

式を評価し、結果の値を置換する&(アンパサンド)演算子。詳細は、「置換式」を参照。


算術演算子

表2-10「算術演算子」は、OLAP DMLの算術演算子、その演算内容および優先順位(演算子が評価される順序)を示します。優先順位が同じ演算子は、左から右に評価されます。数式で複数の演算子を使用する場合、式は算術の標準ルールに従って評価されます。他の数式に続く負の数の前にはカンマが必要で、カンマがない場合は、マイナス記号は減算演算子として解釈されます。たとえば、intvar,-4となります

表2-10 算術演算子

演算子 演算 優先順位

-

記号反転

1

**


指数

2

*


乗算

3

/


除算

3

*


加算

4

-

減算

4


比較演算子および論理演算子

比較演算子および論理演算子は、算術演算子とほぼ同じ方法で式を作成できます。各演算子には優先順位があり、その順位によって評価の順序が決定されます。カッコで評価の順序を変更しないかぎり、優先順位の等しい演算子は、左から右に評価されます。ただし、真の値が確定した時点で、評価は停止されます。

表2-11「比較演算子および論理演算子」は、OLAP DMLの比較演算子および論理演算子(ANDORおよびNOT)を示しています。この表は、演算子、演算内容、例および優先順位(演算子が評価される順序)をまとめたものです。優先順位が同じ演算子は、左から右に評価されます。

表2-11 比較演算子および論理演算子

演算子 演算 優先順位

NOT

BOOLEAN式の反対の値を返す

NOT(YES) = NO

1

EQ

等しい

4 EQ 4 = YES

2

NE

等しくない

5 NE 2 = YES

2

GT

より大きい

5 GT 7 = NO

2

LT

より小さい

5 LT 7 = YES

2

GE

以上

8 GE 8 = YES

2

LE

以下

8 LE 9 = YES

2

IN

日付が期間に含まれているかどうか

'1Jan02' IN myDimension = YES

2

LIKE

テキスト値が指定したテキスト・パターンに一致するかどうか

'Finance' LIKE '%nan%' = YES

2

AND

どちらの式も真

8 GE 8 AND 5 LT 7 = YES

3

OR

どちらか1つの式が真

8 GE 8 OR 5 GT 7 = YES

4


代入演算子

OLAP DMLでは、他の多くのプログラミング言語と同様、代入演算子として記号=(等号)を使用します。

式では一時データが作成され、結果の値は表示できますが、セッション中にアナリティック・ワークスペースに自動的に格納されて後で参照されるということはありません。代入文を使用して、式の結果を、その式と同じデータ型およびディメンションを持つオブジェクトに格納します。オブジェクトを更新およびコミットすると、次回のセッションでその値を使用できます。

他のプログラミング言語と同様、OLAP DMLの代入文はソース式の結果と等しい値をターゲット式に設定します。ただし、OLAP DML代入文の処理は他のプログラミング言語における処理と異なる点があります。他の多くのOLAP DML文と同様、値を単一のセルに代入するのではなく、ターゲット式が多次元オブジェクトの場合、Oracle OLAPがターゲット・オブジェクトのセルをループ処理して各セルにソース式の結果を設定します。さらに、式のディメンションがターゲット・オブジェクトのディメンションと異なる場合は、UNRAVELを使用して式の値をターゲット・オブジェクトのセルにコピーできます。

OLAP DMLにおける代入文の使用に関する詳細は、SETおよびSET1を参照してください。

OLAP DML式

式は、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.2monthおよびproductによってディメンション化されます。

    例2: units変数がmonthproductおよびdistrictによってディメンション化されている場合、式units * pricemonthproductおよび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データ・オブジェクトの動作」を参照)。

式におけるOLAP DMLデータ・オブジェクトの動作

表2-12では、式の中で引数として使用されるオブジェクトのデータを、Oracle OLAPがどのように使用するのかを示します。

表2-12 式のオブジェクト

オブジェクト 式での使用

変数

定義に応じて、1次元配列または多次元配列のデータとして使用。たとえば、代入文のターゲット式またはソース式として使用される。

「式における変数とリレーションの使用方法」および「代入文でのオブジェクトの使用」も参照してください。

リレーション

定義に応じて、1次元または多次元のデータとして使用。たとえば、代入文のターゲット式またはソース式として使用される(「代入文でのオブジェクトの使用」を参照)。

  • テキスト式でリレーションを使用する場合、リレーション値はテキスト値として参照される。リレーションに含まれる関連ディメンションの値がテキストに変換され、これらの値を式で使用できる。テキスト・リテラルをリレーションと比較することも可能。

  • 数式でリレーションを使用する場合、リレーション値はその関連ディメンションの配列における位置(INTEGER)により参照される。この数値は式で使用可能。位置番号は、ディメンションの現行のステータス・リストではなく、ディメンションのデフォルトのステータス・リストに基づく。

「式における変数とリレーションの使用方法」および「式における関連ディメンションの使用方法」も参照してください。

ディメンション

1次元配列のデータとして使用。数式でTEXTディメンション値を使用する際や、非数値のディメンション値を比較する際、Oracle OLAPは値そのものではなく、配列にある値のINTEGER位置番号(デフォルトのステータス・リストに基づく)を使用する。

「CONCATディメンションの値の指定」および「式における関連ディメンションの使用方法」も参照してください。

コンポジット

ディメンションが使用可能な場所ではコンポジットを使用できる。

「コンポジットの値の指定」も参照してください。

値セット

ディメンション値のリストとして使用。

「式における変数とリレーションの使用方法」およびDEFINE VALUESETコマンドも参照してください。

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

1次元配列として使用。サロゲートは、ディメンションの値の代替セットを提供する。数式でTEXTサロゲート値を使用する際や、非数値のサロゲートの値を比較する際、Oracle OLAPは値そのものではなく、配列にある値のINTEGER位置番号(デフォルトのステータス・リストに基づく)を使用する。

注意: モデル、LIMITコマンド、修飾データ参照、または文(FILEREAD、FILEVIEW、SQL FETCH、SQL IMPORTなど)でロードするデータでは、ディメンションのかわりにサロゲートを使用できる。他のオブジェクトを定義するDEFINE文の場合、引数のオブジェクトにサロゲートは指定できない。

計算式

文の副式または式として使用。

プログラム

値を返さないプログラムでは、OLAP DMLコマンドと同様にプログラム名を使用する。値を返すプログラムでは、OLAP DMLファンクションを実行するのと同じ方法(式の中でプログラム名を使用し、プログラム引数がある場合はカッコで囲む)でプログラムを実行する。


式にオブジェクトを指定する構文

次の構文を使用して、アナリティック・ワークスペース・オブジェクトを式の中に指定できます。

[[schema-name.]analytic-workspace-name!]object-name

schema-name

アナリティック・ワークスペースが作成、定義されたスキーマの名前。デフォルトでは、AW CREATE文を発行するユーザーのデータベース・ユーザーIDのスキーマ内にアナリティック・ワークスペースが作成されます。ほとんどのDML文では、アナリティック・ワークスペースのフルネーム(Scott.demoなど)を指定できます。

analytic-workspace-name

目的のオブジェクトを含むワークスペースの名前。オブジェクト名とアナリティック・ワークスペース名を指定することで、オブジェクトの修飾オブジェクト名(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コマンドで指定しないかぎり、現行のアナリティック・ワークスペースは存在しません。

object-name

名前のないコンポジット以外のオブジェクトの名前。オブジェクトが名前のないコンポジットである場合は、次の構文を使用します。

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ディメンションを定義した後は、単にベース・ディメンション値を指定するのみでその値を参照できます。

ただし、非一意の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のリレーション


    注意:

    QDRの構文があいまいであるため、誤って解釈されるか、構文エラーが発生する可能性がある場合は、QUALファンクションを使用して修飾データ参照(QDR)を明示的に指定します。

変数の修飾

次のいずれかの方法で、変数の任意またはすべてのディメンションを修飾できます。

  • ディメンションの指定された値を1つ選択すると、QDRにより変数のディメンションが一時的に制限されます。この値は、現行のステータスの範囲外になる可能性があります。

  • 修飾子として適切なリレーションの名前を指定すると、QDRにより変数のディメンションが、より下位の集計関連ディメンションと置き換えられます。ディメンションは、リレーションのディメンションに一時的に置き換えられます。

たとえば、変数salesには、monthproductおよびdistrictの3つのディメンションがあります。Bostonの売上総額を、全都市の売上総額と比較するとします。単一の文において、次のようにdistrict2つの異なる値に制限します。

  • 式の分子は、districtのステータスをBostonにします。

  • 式の分母は、districtのステータスをALLにします。

次の文により、QDRを使用してこの結果を計算できます。

SHOW sales(district 'Boston')/TOTAL(sales)

変数の複数のディメンションを修飾できます。たとえば、各ディメンションの1つのディメンション値を指定してsales変数のすべてのディメンションを修飾する場合、salesを単一のセル値の範囲に制限します。

Jun02Tentsおよび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 変数のディメンションの置換

monthproductおよびdistrictによってディメンション化された2つの変数salesおよびquotaが存在するとします。3番目の変数division.mgrは、monthおよびdivisionによってディメンション化されています。divisionproductの間には、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とアンパサンド置換の使用

アンパサンド文字(&)が式の先頭にあると、文にある式自体の式の値が置換されます。QDRとともにアンパサンドを使用する場合、置換が行われる前に変数を修飾するには、式全体をカッコで囲む必要があります。

reptypeによってディメンション化され、変数名を含むmyvarという名前のテキスト変数があるとします。これは、reptypeによってディメンション化されたmyvarであり、myvarという名前の変数ではない点に注意してください。そのため、myvarを修飾して、結果の値をREPORT文で使用するためには、カッコで囲む必要があります。

REPORT &(myvar(reptype 'actual'))

カッコを使用せず、myvarで指定された変数がsalesの場合、salesreptypeによってディメンション化されないことを示すエラー・メッセージを受け取ります。

式における空のセルでの処理

アナリティック・ワークスペースにあるデータ・オブジェクトの一部のセルが空になる場合があります。特定のデータ値がセルに代入されていないか、またはデータ値がそのセルに適していない場合、空のセルになります。オブジェクトの空のセルの値はNAです。NA値には、特定のデータ型がありません。一部のファンクション(たとえば集計ファンクションなど)は、必要な情報が使用できない、または適していない場合、NAを返します。同様に、値が適していない式の値はNAになります。


注意:

OLAP DMLのコンポジット・ディメンションでディメンション化された変数(NULLファクトを持つリレーショナル・ファクト表に対応する変数)をサポートするため、OLAPでは、NA2ビットにより制御される特殊なNA値を使用できます。NA2ビットにより制御されるNA値のOracle OLAPにおける管理方法の詳細は、「NA2ビットとNULLトラッキング」を参照してください。

NA値の指定

使用できるデータがない場合の処理を指定することがあります。たとえば、変数の特定のセル、ファンクションの戻り値、または算術演算子を含む式の値として、適切な値が存在しない場合があります。このような場合、NA(使用不可)値が自動的に指定されます。

変数またはリレーションの値をNAに設定するには、次の例に示すように代入文(SET)を使用します。

sales = NA

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と同様に機能します。計算によって処理できないほど大きい小数値の結果が返される場合に、エラーを生成するかどうかを制御できます。

テキスト式

テキスト式は、TEXTNTEXTまたはIDデータ型のデータとして評価されます。テキスト式は、次のいずれかの組合せになります。

  • テキスト・リテラル。たとえば、'Boston''Current Sales Report'

  • テキスト・ディメンション。たとえば、districtmonth

  • テキスト変数または計算式。たとえば、product.nameです

  • テキスト結果を生成するファンクション。たとえば、JOINLINES('Product: ' product.name)

テキスト式の言語

Oracle OLAPでは、NLS_LANGUAGEオプションで指定可能なすべての言語を使用したテキスト式がサポートされています。また、言語ディメンションの使用によって、複数言語のプログラムおよびアプリケーションもサポートされています。

テキスト式におけるDATETIME値の処理

テキスト値(TEXTNTEXTまたはID)が予想される場所でDATETIME値を使用するか、テキスト変数にDATETIME値を格納すると、DATETIME値は自動的にテキスト値に変換されます。

DATETIME値の書式は、NLS_DATE_FORMATオプションにより制御されます。DATETIME値をテキスト変数に格納すると、NLS_DATE_FORMAT設定は無効になります。

NTEXTデータの処理

TEXTおよびNTEXTデータは、ほとんどの場合に区別なく使用できます。ただし、NTEXT値がTEXT変数に代入された場合などに、暗黙的に変換が行われる可能性があります。TEXTNTEXTに変換される場合、NTEXTデータ型のUTF-8文字コードには他のほとんどのデータ型が含まれるため、データの消失は発生しません。しかし、NTEXTTEXTに変換される場合、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)、タイムスタンプ(TIMESTAMPTIMESTAMP_TZおよびTIMESTAMP_LTZ)および期間(DSINTERVALおよびYMINTERVAL)のデータで実行できます。Oracleでは、次のルールに従って結果が計算されます。

  • 日付値およびタイムスタンプ値(期間値は除く)の算術演算で、NUMBER定数を使用できます。Oracleでは、タイムスタンプ値が日付値に内部的に変換され、日時および期間の算術式ではNUMBER定数が日数として解釈されます。たとえば、SYSDATE + 1は、明日になります。SYSDATE - 7は、1週間前になります。SYSDATE + (10/1440)は、現時刻の10分後になります。SYSDATEからサンプル表employeeshire_date列を減算すると、各従業員を雇用した時点からの経過日数が返されます。日付値やタイムスタンプ値の乗算および除算はできません。

  • Oracleでは、オペランドBINARY_FLOATおよびBINARY_DOUBLENUMBERに暗黙的に変換されます。

  • 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





+



DATETIME

DATETIME

-

DATETIME

DATETIME

DATETIME

DATETIME

*





/





TIMESTAMP





+



TIMESTAMP


-

INTERVAL

INTERVAL

TIMESTAMP

TIMESTAMP

*





/





INTERVAL





+

DATETIME

TIMESTAMP

INTERVAL


-



INTERVAL


*




INTERVAL

/




INTERVAL

数値





+

DATETIME

DATETIME


NA

-




NA

*



INTERVAL

NA

/




NA


例: 期間値の式を開始時間に追加できます。order_date列を持つサンプル表oe.ordersについて考えます。

日付のみの式

日付のみの式は、OLAP DMLのDATEデータ型として評価される式です(「日付のみのデータ型」を参照)。この式は、日付のみの値、日付のみのリテラル、またはより複雑な式を返すファンクションのいずれかです。

日付のみの値の計算

DATE値に対して、数値を加算または減算できます。整数は日として計算され、小数値は一日の端数として計算されます。たとえば、SYSDATE+1.5は、現在の日付および時刻に1日と12時間を加算します。DATE値の乗算および除算はできませんし、数値からこれらの値を減算することもできません。たとえば、1-SYSDATE1*SYSDATEはエラーになります。

算術式における日付のみの値の使用

算術式でDATE値を使用する場合、結果は数値または日付になります。日付の有効な演算と結果のデータ型の概要を、表2-14「DATE値の有効な演算」に示します。

表2-14 DATE値の有効な演算

演算 結果

日付に数値を加算または減算

未来または過去の日付

日付から日付を減算

日付間の日数

期間に数値を加算または減算

LEADファンクションまたはLAGファンクションの戻り値と同様、未来または過去における適切な間隔を持った期間。結果に対応するディメンション値が存在しない場合、結果はNAとなる。計算は、ディメンションのデフォルトのステータス・リストにおける値の位置に基づいて行われる。


ブール式

ブール式は、TRUEまたはFALSEの論理文です。ブール式では、比較する両方の式の基本データ型が同じであれば、すべての型のデータを比較できます。データをテストし、他のデータと等しい、より大きい、またはより小さいかを調べることができます。

ブール式は、次のようなブール・データで構成されます。

  • BOOLEAN値(YESNO、さらにそれらのシノニムであるONOFFTRUEFALSE)

  • BOOLEAN変数または計算式

  • BOOLEAN結果を生成するファンクション

  • 比較演算子によって計算されるBOOLEAN

たとえば、コードに次のブール式が含まれているとします。

   actual GT 20000

この式では、Oracle OLAPは変数actualの各値を定数20,000と比較します。値が20,000より大きい場合に文はTRUEとなり、値が20,000以下の場合に文はFALSEとなります。

ブール値を指定する際、真の値にはYESONまたはTRUEのいずれかを、偽の値にはNOOFFまたは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値の比較

ブール式で比較するデータにNA値が含まれている場合でも、それがブール式として意味を持てばYESまたはNOという結果が返されます。たとえば、NA値が非NA値と等価であるかどうかをテストすると、結果はNOとなります。ただし、結果が紛らわしい場合はNAが返されます。たとえば、NA値が非NA値より小さいか大きいかをテストすると、結果はNA値となります。

表2-15「NA値を含むブール式で結果が非NA値となる場合」に、NA値を含むブール式のうち、非NA値を生成する式の結果を示します。

表2-15 NA値を含むブール式で結果が非NA値となる場合

結果

NA EQ NA

YES

NA NE NA

NO

NA EQ non-NA

NO

NA NE non-NA

YES

NA AND NO

NO

NA OR YES

YES


数値データを比較する際のエラーの制御

数値データを比較する際に予期しない結果が返された場合は、その原因として次のような事柄が考えられます。

  • 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型の変数sdvarDECIMAL型に変換され、小数部分を拡張するため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'

文は、次のような過程で解析されます。

  1. テキスト・リテラル'Seattle'は、districtディメンションのデフォルトのステータス・リストにある位置に変換されます。

  2. その位置が、districtディメンションにある他のすべての値の位置と比較されます。

  3. 次のレポートに示すように、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オプションの設定を基準として行われます。

最初に数値をテキストに変換することにより、数値とテキストを比較できます。順序付けは、文字の値を基準として行われます。テキストは左から右に評価されるため、予期しない結果が返されることがあります。たとえば、テキスト・リテラル1234100,999.00を比較した場合、前者の2番目の文字2は後者の2番目の文字0よりも大きいため、1234の方がより大きいという結果になります。

name.label3-Personという値を持つID変数であり、name.desc3-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%')
テキスト・リテラルとリレーションの比較

テキスト・リテラルとリレーションを比較することもできます。リレーションには、関連ディメンションの値が含まれており、テキスト・リテラルはそのディメンションの値と比較されます。たとえば、region.districtregionの値を含むため、次の比較を行うことができます。

region.district EQ 'West'

条件式

条件式は、条件に基づいて値を選択する際に使用します。条件式は、データ型が適切であれば、他の式の一部として使用できます。Oracle OLAPでは、次の条件式を使用できます。

IF...THEN...ELSE式

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式

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. 先頭にアンパサンドが付いている式(置換式)を評価します。

  2. 手順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の場合、salesreptypによってディメンション化されないことを示すエラー・メッセージを受け取ります