SQLコマンドは、Structured Query Language(SQL)で記述された命令をOracle OLAPからリレーショナル・マネージャに渡すコマンドです。SQLコマンドを使用すると、リレーショナル表のデータの挿入および更新、リレーショナル表からアナリティック・ワークスペース・オブジェクトへのデータの取得、およびストアド・プロシージャの実行ができます。
SQLコマンドを使用するには、SQL構文およびリレーショナル・データベース内のデータ構造を理解している必要があります。また、対象のリレーショナル表に対する適切なアクセス権も必要です。
最初に一般的なOLAP DML SQLコマンドについて説明し、続いて、次に示す特定のSQL文としてOLAP DML SQLコマンドを使用する方法について説明します。
パラメータ
sql-statementには、動的に実行可能なほとんどのSQL文に加えて、関連付けられた非動的な文も指定できます。また、PROCEDUREでストアド・プロシージャを指定することもできます(SQL PROCEDUREの説明を参照)。SQL文は、すべての非テキストのOLAP DML入力式の値を含め、128KB以内に収める必要があります。
次のSQL文はsql-statementに指定できません。
COMMIT
-- 変更をコミットするには、OLAP DML COMMIT文を発行します。
ROLLBACK
-- OLAP DMLではロールバックできません。SQL ROLLBACK
を指定すると、ROLLBACK
はOLAP DML SQL文の引数としてサポートされていないというエラー・メッセージが返されます。
重要: OLAP DML SQL文を使用して他の方法でロールバックを要求すると(たとえば、SQL EXECUTEを使用するなど)、Oracle OLAPはシステム・エラー・メッセージを発行し、その文を発行したOLAP DMLプログラムを異常終了します。また、Oracle OLAPは不確定な状態となり、ロールバックを要求したOLAP DMLプログラムを含むアナリティック・ワークスペース、およびコミットされていない更新があるアタッチされている他のアナリティック・ワークスペースをデタッチします。 |
一部のSQL文は、リレーショナル・マネージャに送信される前にOracle OLAPによって評価されます。たとえば、Oracle OLAPはSQL PREPARE、SQL EXECUTE、およびリレーショナル表のデータをアナリティック・ワークスペース・オブジェクトにコピーするSQL文を評価します(これらの文のリストは、「アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピー」を参照)。
使用上の注意
アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピー
リレーショナル・データは、次のように暗黙カーソルまたは明示カーソルのいずれかを使用してアナリティック・ワークスペース・オブジェクトにコピーできます。
暗黙カーソルを使用してリレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするには、SQL SELECT文を使用します。このOLAP DML文は、OLAP Worksheetで対話的に使用できる他、OLAP DMLプログラム内で使用することもできます。
明示カーソルを使用してリレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするには、OLAP DMLプログラム内で次のコマンドを次に示す順序で使用します。
SQL DECLARE CURSORを使用して、SQLカーソルをSELECT文またはプロシージャに関連付けて定義します。
SQL OPENを使用して、SQLカーソルをアクティブ化します。
SQL FETCHまたはSQL IMPORTを使用して、カーソルで指定されたデータを取得および処理します。
ヒント: SQL FETCHは機能性に優れ、SQL IMPORTは大量のデータをリレーショナル表からアナリティック・ワークスペース・オブジェクトにコピーする際のパフォーマンスに優れています。 |
SQL CLOSEを使用して、SQLカーソルをクローズします。
SQL CLEANUPを使用して、すべてのSQLカーソルの宣言を取り消し、SQLカーソルのメモリー・リソースを解放します。
Oracle OLAPは、これらのすべての文をリレーショナル・マネージャに送信する前に評価します。
これらの文の構文については、それぞれの項を参照してください。他のSQL文の構文については、『Oracle Database SQL言語リファレンス』を参照してください。
リレーショナル表へのデータの挿入
アナリティック・ワークスペースのデータをリレーショナル表に挿入する際は、SQL INSERT文のためのSQL PREPARE文を使用し(通常はDIRECT= YESに設定)、SQL EXECUTEを使用してこの文を実行します。
OLAP DML SQL文に関連するオプション
SQLをOLAP DMLに埋め込む際には、いくつかのオプションが使用できます。これらのオプションは、「SQLの埋込みオプション」に記載されています。
OLAP DML SQL文でのOLAP DML式の使用
多くのOLAP DML SQL文では、OLAP DML式(OLAP DML変数など)を引数として使用できます。OLAP DML入力式は、SQL文へのパラメータとしてOracle OLAPにより提供されている値です。OLAP DML入力式は、選択するデータを指定したり、変更するデータの値を提供したりするために使用します。OLAP DML入力式は、SQL WHERE
句、プロシージャのパラメータ・リスト、UPDATE
文、およびINSERT
のVALUE句で使用できます。
OLAP DML SQL文でOLAP DML式を使用する場合は、次の点に注意してください。
OLAP DML式の先頭にはコロンを付けます(:myvar
など)。
OLAP DML入力式としてディメンションまたはディメンション変数を指定すると、ステータスにある最初の値が使用され、FORまたはACROSS文を使用してすべての値をループ処理することは可能ですが、暗黙的ループは行われません。適切なデータ型を持つ式であれば、OLAP DML入力式とすることができます。OLAP DML入力式の値は、カーソルがオープンされていれば、宣言されていなくても受け付けられます。例10-131「表へのデータの挿入」を参照してください。
CLOBまたはNCLOBデータ型のリレーショナル表に対してデータの更新または挿入を行うには、OLAP DML入力式でWIDE
を使用します(「CLOB列またはNCLOB列への大きなテキスト値の挿入」を参照)。
エラー・チェック
Oracle OLAPは、SQL文の引数における構文エラーの一部を検出できますが、ほとんどのエラーはOracle RDBMSで検出されます。エラー・コードおよびメッセージはOracle OLAPに返されます。SQL文ごとにSQLCODEの値をチェックして、どこでエラーが発生したかを判別します。エラーが発生している場合(つまり、SQLCODE EQ -1
)、エラーの原因に関する情報としてSQLERRMの値をチェックします。
Oracle RDBMSデータ型のOracle OLAP DMLデータ型への変換
表10-10「RDBMSデータ型のOLAP DMLデータ型への変換」に、自動的にOracle OLAP DMLデータ型に変換できるOracle RDBMSデータ型を示します。その他のデータ型は、SQL DECLARE CURSOR文のSELECT文で明示的に変換するかキャストする必要があります。
表10-10 RDBMSデータ型のOLAP DMLデータ型への変換
Oracle RDBMSデータ型 | OLAP DMLディメンション型 | OLAP DML変数データ型 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
- |
|
SQL UPDATE文
SQL
UPDATE
文には、特定の検索条件を指定するWHERE
句を含めることができます。単一表、および1つの表の列のみを含むビューでは、SQLで通常使用される検索条件に加えて、WHERE
CURRENT
OF
cursor
句がサポートされています。カーソルはFOR
UPDATE
句で定義しておく必要があります(SQL DECLARE CURSORを参照)。
SQL CLEANUPコマンドは、すべてのSQLカーソルの宣言を取り消し、すべてのSQLカーソルのメモリー・リソースを解放します。SQL CLEANUPコマンドは、「アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピー」で説明したように、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするために他のSQLコマンドと組み合せて使用します。
SQL CLOSEコマンドはSQLカーソルをクローズします。SQL OPENコマンドは、「アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピー」で説明したように、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするために他のSQLコマンドと組み合せて使用します。
SQL DECLARE CURSORコマンドは、SELECT
文またはプロシージャに関連付けることによって、明示的なSQLカーソルを定義します。SELECT
文は、データの有効範囲(行および列)をカーソルで選択して指定します。SQL DECLARE CURSORコマンドは、「アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピー」で説明したように、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーする際、明示カーソルを使用するために他のSQLコマンドと組み合せて使用します。
SQLTABLES
とSQLCOLUMNS
の2つの疑似プロシージャで、表と列に関する情報を取得できます。
構文
SQL DECLARE cursor CURSOR FOR {select-statement [FOR UPDATE]|table-info}
ここで、table-infoは次のいずれかです。
注意: table-infoは、select-statementがSQL FETCH文である場合にカーソルを宣言するときのみ指定します。 |
パラメータ
定義するカーソルの名前。カーソル名は、1から18個のアルファベット文字および記号@
、_
、$
、#
で構成されます。記号@
、$
、#
を含む名前は、一重引用符で囲む必要があります。最初の文字は、数字およびアンダースコア以外でなければなりません。カーソル名はOracle OLAP内部で使用されます。SQL CLEANUP文を発行せずに、以前に宣言したカーソルと同じ名前のカーソルを別のSQL SELECT
文で宣言しようとすると、エラーが発生します。
カーソルに関連付けるデータを特定するSQL SELECT文。SQL SELECT文の構文については、『Oracle Database SQL言語リファレンス』を参照してください。
ヒント: ANDおよびORは、OLAP DML構文とSQL構文のどちらでも使用できるため、Oracle OLAPがOLAP DML入力式の末尾を認識できるように句を記述します。OLAP DML構文とSQL構文のANDおよびORが混在する場合や、Oracle OLAPが認識できないSQL演算子を使用する場合は、構文を明確にするためにカッコを使用します。 |
SQL FETCHを使用して表にデータを書き込むことを示します。この句は、WHERE
CURRENT
OF
cursor
句を持つUPDATE
文でカーソルを使用する場合に必要です。更新される列の名前は、OF
句(たとえば、FOR
UPDATE
OF
COL1,
COL2,
COL3
)で指定できます。
注意: FOR UPDATE句は、SQL IMPORTおよびSQL SELECTには無視されます。 |
SQL FETCHで使用するカーソルを宣言する場合は、疑似プロシージャSQLTABLES
をコールします。このプロシージャは、検索基準に一致する表ごとに次の値を返します(例10-133「リレーショナル表に関する情報の検出」を参照)。
tableowner -- 表の所有者を特定するテキスト値
tablename -- 表の名前を特定するテキスト値
tabletype: TABLE、VIEW、SYSTEM TABLE、ALIAS、SYNONYM、LOCAL TEMPORARY、GLOBAL TEMPORARYまたはNA(認識されていない種類を指す)のいずれかで表の種類を特定するテキスト値
SQL IMPORTで使用するカーソルを宣言する場合は、この句を使用できません。
SQL FETCHで使用するカーソルを宣言する場合は、疑似プロシージャSQLCOLUMNS
をコールします。このプロシージャは、検索基準に一致する列ごとに次の値を返します(例10-134「リレーショナル表の列に関する情報の検出」を参照)。
tableowner -- 表の所有者を特定するテキスト値
tablename -- 表の名前を特定するテキスト値
colname -- 列の名前を特定するテキスト値
coltype -- 列のデータ型を特定するテキスト値
olaptype -- coltypeと最も一致するデータ型を特定するテキスト値
length -- 列の値の長さを特定するINTEGER
値
precision -- 数値列の値の精度を特定するINTEGER
値
scale -- 列の値のスケールを特定するINTEGER
値
nullable -- 列がNULL値を含むことができるかどうかを示すY
またはN
のテキスト値
SQL IMPORTで使用するカーソルを宣言する場合、PROCEDURE SQLCOLUMNS句は使用できません。
リテラル・テキスト、または1つ以上の所有者を指定する値を持つOLAP DML変数の名前。この式はフィルタとして機能し、指定した所有者に属する表にのみ結果を制限します。キーワードNULL、またはNA
値を持つOLAP DML変数では、すべての表の所有者が結果に含まれます。
式は、'SCOTT'
などのように具体的に示すことも、'S%T'
(S
で始まりT
で終わる名前のすべての所有者)のようにワイルドカード文字で示すこともできます。この値は、大文字と小文字を維持したままデータベースに渡されるため、値の大文字と小文字が正しく入力されているか確認してください。たとえば、Oracleのリレーショナル・データベースは、デフォルトですべての値を大文字で格納するため、'scott'
や'Scott'
は'SCOTT'
とは一致しません。
リテラル・テキスト、または1つ以上の表を指定する値を持つOLAP DML変数の名前。この式はフィルタとして機能し、指定した名前を持つ表にのみ結果を制限します。キーワードNULL、またはNA
値を持つOLAP DML変数では、すべての表が結果に含まれます。
式は'PAYROLL'
などのように具体的に示すことも、'%ROLL'
(ROLL
で終わる名前を持つすべての表)のようにワイルドカード文字で示すこともできます。この値は、大文字と小文字を維持したままデータベースに渡されるため、値の大文字と小文字が正しく入力されているか確認してください。たとえば、Oracleのリレーショナル・データベースは、デフォルトですべての値を大文字で格納するため、'payroll'
や'Payroll'
は'PAYROLL'
とは一致しません。
リテラル・テキスト、または1つ以上の列を指定する値を持つOLAP DML変数の名前。この式はフィルタとして機能し、指定した名前を持つ列にのみ結果を制限します。キーワードNULL
、またはNA値を持つOLAP DML変数では、すべての列が結果に含まれます。
式は'SALARY'
などのように具体的に示すことも、'SAL%'
(SAL
で始まる名前を持つすべての列)のようにワイルドカード文字で示すこともできます。この値は、大文字と小文字を維持したままデータベースに渡されるため、値の大文字と小文字が正しく入力されているか確認してください。たとえば、Oracleのリレーショナル・データベースは、デフォルトですべての値を大文字で格納するため、'salary'
や'Salary'
は'SALARY'
とは一致しません。
使用上の注意
SQL DECLARE CURSORに関する一般的な制約
SQL DECLARE CURSORコマンドには、次の制約があります。
プログラムでのみ使用できる
アンパサンド置換を使用できない。
SQL IMPORTで使用するカーソルを宣言する際の制約
SQL IMPORT文で使用するカーソルを宣言する場合は、次の簡略化構文のみを使用できます。
SQL DECLARE cursor CURSOR FOR select-statement
ここで、select-statementはカーソルに関連付けるデータを特定するSQL SELECT
文です。FOR
UPDATE
句およびtable-info
句は使用できません。
カーソルの結果セット
カーソルの結果セットは、カーソルがオープンされるときに決定され、後からは更新されません。このため、カーソルをオープンしてからOLAP DML入力式の値を変更しても、その変更はカーソルの結果セットに影響しません。カーソルはSQL CLOSE文が実行されるまで、またはSQL CLEANUP文ですべてのカーソルがクローズされるまでオープンのままです。カーソルは、オープンしたプログラムが終了しても自動的にクローズされません。
フェッチの最適化
値を多次元の入力変数にフェッチする場合は、SQL DECLARE CURSOR文の引数select-statementにORDER BY句でディメンションに対応する列を指定するとき、最も変化の遅いディメンションを最初に指定します。これにより、パフォーマンスが最適化されます。
例
例10-132 SQLCODEの値のテスト
カーソルc1
が、ユーザーsqldba
が所有する表mkt
の3列について宣言されています。この3列から3つのアナリティック・ワークスペース・オブジェクトに値がフェッチされます。最初のOLAP DMLオブジェクトはmarket
ディメンションで、一時的に取得値に制限されています。market
の一時ステータスのため、他の列の値は他のOLAP DMLオブジェクトの適切なセルに割り当てられます。
この例では、SQLCODEの値を2か所でテストしています。完全なプログラムほど、多くのエラー・チェックが実行されます。
DEFINE market DIMENSION TEXT DEFINE mkt.desc TEXT <market> DEFINE mkt.abbrev ID <market> DEFINE sql.market PROGRAM PROGRAM TRAP ON ERROR SQL DECLARE c1 cursor FOR - SELECT mktcode, mktabbrev, mktdesc FROM sqldba.mkt SQL OPEN c1 IF SQLCODE NE 0 THEN SIGNAL SQLERR 'open cursor failed.' WHILE SQLCODE EQ 0 SQL FETCH c1 INTO :APPEND market, :mkt.abbrev, :mkt.desc SQL CLOSE c1 ... RETURN error: ... END
例10-133 リレーショナル表に関する情報の検出
次のプログラムは、Scott
が所有するすべての表に関する情報をフェッチします。ownername変数の値は、SQL DECLAREカーソル文の後で設定されていますが、これは、SQL OPEN文の前であればどこでも設定できます。tablename変数は設定されていませんが、自動的にNA
に初期化されてNULL値として渡されます。
DEFINE ownername TEXT "Search criteria DEFINE tablename TEXT "Search criteria DEFINE tblowner TEXT "Search results DEFINE tblname TEXT "Search results DEFINE tbltype TEXT "Search results SQL DECLARE c1 CURSOR FOR PROCEDURE sqltables(:ownername, :tablename) ownername = 'Scott' SQL OPEN c1 WHILE SQLCODE EQ 0 DO SQL FETCH c1 INTO :tblowner, :tblname, :tbltype ... "Process fetched values DOEND
例10-134 リレーショナル表の列に関する情報の検出
次のプログラムは、Scott
が所有するemployee
表のすべての列に関する情報をフェッチします。SQLCOLUMNS
の3番目の引数の値には、NULL
(NA
ではない)が使用されていますが、これはOracle OLAPではなく、リレーショナル・マネージャで処理されるためです。
DEFINE tblname TEXT "Search results DEFINE tblowner TEXT "Search results DEFINE colname TEXT "Search results DEFINE coltype TEXT "Search results DEFINE olaptype TEXT "Search results DEFINE length INTEGER "Search results DEFINE precision INTEGER "Search results DEFINE scale INTEGER "Search results DEFINE nullable TEXT "Search results SQL DECLARE c1 CURSOR FOR PROCEDURE sqlcolumns('Scott', - 'Employee', NULL) SQL OPEN c1 WHILE SQLCODE EQ 0 DO SQL FETCH c1 INTO :tblowner, :tblname, :colname, :coltype, - :olaptype, :length, :precision, :scale, :nullable ... "Process fetched values DOEND
SQL EXECUTEコマンドは、SQL PREPAREでコンパイルされたSQL文を実行します。一般に、プリコンパイルするSQL文は繰り返し実行される文であり、特に、OLAP DML入力式を含むINSERT
、UPDATE
、DELETE
などの文です。
注意: SQL PREPAREおよびSQL EXECUTEコマンドは、同じDMLプログラム内でのみ使用できます。 |
例
例10-135 アナリティック・ワークスペース・データによるリレーショナル表の更新
次の例は、Oracle OLAPに格納されているデータを使用した表の単純な更新を示します。marketディメンションは、FORループで一度に1つの値に制限されています。SQL句のWHERE s.market=:market
は、そのmarketの行にある売上値を変更する値として指定します。
FOR market SQL UPDATE mkt SET sales=:mkt.sales WHERE s.market=:market
UPDATE文は、SQL PREPARE文で使用し、FORループで実行します。
SQL PREPARE s2 FROM UPDATE mkt - SET sales=:mkt.sales WHERE s.market=:market FOR market DO SQL EXECUTE s2 IF SQLCODE NE 0 THEN BREAK DOEND
SQL FETCHコマンドは、名前付きSQLカーソルで指定されたデータを取得して処理します。SQL FETCHは、取得したデータをOLAPオブジェクトに割り当てます。SQL FETCHコマンドは、「アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピー」で説明したように、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするために他のSQLコマンドと組み合せて使用します。
構文
SQL FETCH cursor [LOOP [loopcount]] -
INTO :targets... [THEN action-statements...]
ここで、
targetsは、次のいずれか1つ以上です。
positionは、次のいずれか1つです。
パラメータ
宣言してオープンするカーソルの名前。
リレーショナル表から取得した行に対してOracle OLAPが暗黙的にループ処理するように指定します。Oracle OLAPは、行ごとに、各フィールドのデータをターゲット・アナリティック・ワークスペース・オブジェクトとして指定されているオブジェクトにコピーします。LOOP句が含まれている場合、カーソルで指定されたアクティブ・セットの最後に達するまで、エラーが発生するまで、またはloopcountに達するまで、SQL FETCHは行処理を継続します。SQL FETCHのパフォーマンスを改善するために、ほとんどの場合でLOOP句を使用します。
LOOP句を指定しないときに、カーソルが指定するアクティブ・セットに複数の行が含まれている場合、SQL FETCH文はWHILEループ内でコーディングする必要があります。このループは、データの終了またはエラーを示す場合にゼロ以外の値を返すSQLCODEオプションの値に基づくようにします。
LOOPキーワードに対するオプションのINTEGER
の引数。loopcountは、SQL FETCHがリレーショナル表の行に対するループ処理の方法を制御します。loopcountには、リテラル値、OLAP DML変数またはNA
を使用できます。loopcountが0以下の場合、ループは実行されず、データもフェッチされません。
loopcountの値を付けずにLOOP句を指定すると、SQL FETCHは行の読取りおよびその内容のターゲット・アナリティック・ワークスペース・オブジェクトへのコピーを、読み取る行がなくなるかエラーが発生するまで続けます。内部では、SQLCODEがゼロ以外の値になるまで各行が処理されます。
loopcountにリテラル値を指定すると、SQL FETCHはloopcountで指定された行数を、またはSQLCODEがゼロ以外の値になるまで処理を続けます。
loopcountに変数を指定する場合は、OLAP DML変数の形式にする必要があります(前にコロンを付けます)。この変数は、入力変数としても、出力変数としても機能します。loopcountの初期値は、SQL FETCHで処理しようとする行数を指定します。SQL FETCHを完了すると、loopcountには実際に処理された行数が含まれます。
loopcountにNA
を指定すると、SQL FETCHはSQLCODEがゼロ以外の値になるまで行を処理します。ただし、SQL FETCHを完了すると、loopcountには実際に処理した行数が含まれます。
リレーショナル表から取得したデータを格納するアナリティック・ワークスペース・オブジェクトを特定します。このターゲット・アナリティック・ワークスペース・オブジェクトのリストは、その数およびデータ型が、カーソルを宣言するSQL DECLARE CURSORコマンドの引数select-statementで指定された表の列のリストに対応している必要があります。変数、修飾データ参照、リレーション、ディメンション、コンポジットまたは結合をターゲットにできます。
重要: ターゲット・アナリティック・ワークスペース・オブジェクトを指定する順序は、ディメンション・ステータスに影響します。Oracle OLAPは、ディメンション値ごとに、ディメンションのステータスをフェッチされた値に一時的に制限します。値が次に割り当てられるアナリティック・ワークスペース・オブジェクトは、この一時的なステータスに従います。「ターゲット・アナリティック・ワークスペース・オブジェクトにする結合ディメンション」と「ターゲット・アナリティック・ワークスペース・オブジェクトにするコンポジット・ディメンション」を参照してください。 |
ターゲットには、前にコロンを付ける必要があります。ターゲットがディメンションの場合、MATCHおよびAPPENDキーワードでディメンションの処理を指定できますが、この場合、コロンはキーワードの前に付けます。
(デフォルト)Oracle OLAPは、ターゲットのディメンションやサロゲートに対してディメンション・メンテナンスを実行しません。ディメンション化されたオブジェクトにフェッチされるデータの整列では、受け取る値を使用します。リレーショナル・データベースから受け取る値が、ディメンションまたはサロゲートの値に一致しない場合、エラーが通知されます。
Oracle OLAPは、新しい値をディメンションに追加して、ターゲットのディメンションにディメンション・メンテナンスを実行します。ディメンション化されたオブジェクトにフェッチされるデータの整列には、新旧両方のディメンション値を使用します。デフォルトでは、新しい値がディメンションまたはサロゲートの最後に追加されます。
positionは、次のいずれか1つです。
AFTER dimension-value
新しい値は、ステータス・リストのdimension-valueの後ろに追加されます。
BEFORE dimension-value
新しい値は、ステータス・リストのdimension-valueの直前に追加されます。
FIRST
新しい値はステータス・リストの最初に追加されます。
LAST
新しい値はステータス・リストの最後に追加されます。
また、アクション文でディメンション値を処理する方法は、positionを使用しても制御できます。
指定されたサロゲートに値を割り当てます。
データの行をフェッチしてターゲット・アナリティック・ワークスペース・オブジェクトに割り当てるたびに実行するaction-statementsを必要なだけ指定します。action-statementは、次のいずれかです。
assignment-statement
IF statement
SELECT-statement
ACROSS statement: action-statement
<action-statement-group>
使用上の注意
SQL FETCHのターゲットの順序がディメンション・ステータスに与える影響
Oracle OLAPは、ディメンション値ごとに、ディメンションのステータスをフェッチされた値に一時的に制限します。値が次に割り当てられるアナリティック・ワークスペース・オブジェクトは、この一時的なステータスに従います。
ターゲット・アナリティック・ワークスペース・オブジェクトにする結合ディメンション
結合ディメンションをターゲット・アナリティック・ワークスペース・オブジェクトとして使用できますが、必ず単純なベース・ディメンションと同じ数の列をリレーショナル表から選択する必要があります。Oracle OLAPが結合ディメンションであるターゲットにSQL FETCH文を実行する場合、その結合ディメンションが定義されたときに指定されたディメンション順を使用します。
ターゲット・アナリティック・ワークスペース・オブジェクトにするコンポジット・ディメンション
ディメンション化された変数と同じように、コンポジットとしてアナリティック・ワークスペース・オブジェクトを指定できます。たとえば、dim1
およびdim2
でディメンション化された変数var1
にデータをフェッチするためには、次のようなターゲット・アナリティック・ワークスペース・オブジェクトのリストを指定します。
:dim1 :dim2 :var1
ディメンションdim1
およびdim2
を持つコンポジット・ディメンションでディメンション化された変数var2
にデータをフェッチするためには、次のようなターゲット・アナリティック・ワークスペース・オブジェクトのリストを指定します。
:dim1 :dim2 :var2
NULL値
SQLのNULL値は、Oracle OLAPのNA
値と同等であるため、ターゲット・アナリティック・ワークスペース・オブジェクトにフェッチされたNULL値はNA
値になります。Oracle OLAPではこのようにNULL値を処理するため、SQLコマンドはSQL FETCH文のINTO句にあるINDICATOR
変数をサポートしません。ただし、NULL値をディメンションにフェッチすると、Oracle OLAPはその行全体の値を破棄します。
入力およびターゲット・オブジェクトとしてのブール変数の使用
OLAP SQLコマンドの入力およびターゲットのアナリティック・ワークスペース・オブジェクトにブール変数を使用できます。OLAP DML入力式の場合、Oracle OLAPはブール値を1
(TRUE
)または0
(FALSE
)の値を持つINTEGER
値として扱います。
ターゲット・アナリティック・ワークスペース・オブジェクトの場合、ブール変数はリレーショナル表のあらゆる数値(またはビット)列の値を受け取ることができます。
テキスト・データのDATE変数へのフェッチ
テキスト・データをDATE変数にフェッチすると、DATEORDERオプションの現行の設定で値が解釈されます。たとえば、テキスト値12-08-96
は、DATEORDERの設定によって、1996年12月8日にも1996年8月12日にも解釈できます。
転送できないデータ型
データ型がLONG RAW、ROWID、UROWID、BLOBおよびBFILEのデータは転送できません。
例
例10-136 リレーショナル表からのデータのフェッチ -- 単純なSQL FETCH
次のプログラムの抜粋では、カーソルを宣言してオープンする基本的なステップとデータのフェッチを示します。Products
表のProd_ID
列およびProd_Name
列のリレーショナル・データを、prod
ディメンションおよびprod_label
変数にフェッチします。変数prod_label
は、prod
でディメンション化されています。この例のSQL FETCH文にはLOOP句が含まれていないため、コールのたびに単一のデータ行が取得されます。
VARIABLE set_price SHORT set_price = 20 ... SQL DECLARE highprice CURSOR FOR SELECT Prod_ID, Prod_Name - FROM Products WHERE suggested_price > :set_price SQL OPEN highprice WHILE SQLCODE EQ 0 SQL FETCH highprice INTO :prod, :prod_label
例10-137 THEN句を使用したリレーショナル表からのデータのフェッチ
次のプログラムの抜粋は、前の例のSQL FETCH文にLOOPキーワードおよびTHEN句を追加しています。LOOPキーワードがあるため、このSQL FETCH文はWHILEループ内で実行する必要がありません。THENキーワードの後ろのアクション文は、文字A
で始まるprod_label
に格納されている製品名をa_product
という複数行のテキスト変数にコピーします。
SQL FETCH highprice LOOP INTO :prod, :prod_label - THEN IF UPCASE(EXTCHARS(prod_label, 1, 1)) EQ 'a' - THEN a_product = JOINLINES(a_product prod_label)
例10-138 結合ディメンションをメンテナンスしながらのリレーショナル・データの移入
この例では、ターゲット・アナリティック・ワークスペース・オブジェクトとして(mpt
という名前の)結合ディメンションを使用します。結合ディメンションを移入するには、そのベース・ディメンションごとにリレーショナル・データベースから値を選択する必要があります。ここでは、3つのベース・ディメンション、market
、product
およびtime
があります。このため、SELECT
文は3つに対応する列(Mktcode
、Prdcode
およびPercode
)を指定します。このプログラムは、market
、product
およびtime
ディメンションがすでに最新の値で移入済であるとするため、それらがターゲット・アナリティック・ワークスペース・オブジェクトとして明示的に指定されないかぎり、Oracle OLAPがベース・ディメンションを更新することはありません。
DEFINE mpt DIMENSION <market product time> DEFINE sql.mpt PROGRAM PROGRAM ... SQL DECLARE c1 CURSOR FOR - SELECT Mktcode, Prdcode, Percode FROM Sqldba.Data IF SQLCODE NE 0 THEN SIGNAL sqlerrm SQL OPEN c1 SQL FETCH c1 LOOP INTO :append mpt SQL CLOSE c1 ... END
例10-139 ベース・ディメンションと結合ディメンションをメンテナンスしながらのデータの移入
ベース・ディメンションおよび結合ディメンションに現行値を取得する場合、または初めて値を取得する場合、ベース・ディメンションの値に続けて結合ディメンションの値をフェッチできます。次の例で、SQL DECLARE CURSORおよびSQL FETCHコマンドはベース・ディメンションおよび結合ディメンションの両方の値をフェッチするように変更されています。リレーショナル表から選択する列の数は、フェッチされたベース・ディメンションの数と一致する必要があります。このSELECT文では6つの列が指定されています。最初の3列が3つのベース・ディメンション、最後の3つが結合ディメンションに相当します。
SQL DECLARE c1 CURSOR FOR - SELECT Mktcode, Prdcode, Percode, Mktcode, - Prdcode, Percode FROM Sqldba.Data ... SQL FETCH c1 LOOP INTO :APPEND market, :APPEND product, - :APPEND time, :APPEND mpt
例10-140 ディメンションをメンテナンスしながらの変数へのリレーショナル表データの移入
次の例で、変数dollars.mpt
は結合ディメンションmpt
でディメンション化され、その値には同じSQL FETCH文でディメンション値が移入されます。SQL DECLARE CURSORおよびSQL FETCHコマンドは再度変更され、新しい列とターゲット・アナリティック・ワークスペース・オブジェクトが追加されています。
DEFINE dollars.mpt DECIMAL <mpt> SQL DECLARE c1 CURSOR FOR - SELECT Mktcode, Prdcode, Percode, Mktcode, Prdcode, - Percode, Dollars FROM Sqldba.Data ... SQL FETCH c1 LOOP INTO :APPEND market, :APPEND product, - :APPEND time, :APPEND mpt, :DOLLARS.mpt
例10-141 連結ディメンションへのデータのフェッチ
リレーショナル表に製品データの列が4つあるため、このデータを格納するProductという4レベルの階層をアナリティック・ワークスペースで作成するとします。階層の各レベル(prod_id
、prod_subcategory
、prod_category
およびproducts_all
)は、products
表の列にマップされます。階層の最下位レベルはprod_id
、最上位レベルはproducts_all
です。また、表にはサプライヤ情報を含む列もあります。
アナリティック・ワークスペースでデータを保持するために、Product階層の各レベルについて定義したディメンション、階層自体の連結ディメンション、および階層の値間の親子関係を定義します。また、次の定義によって、サプライヤ・データのディメンション、およびサプライヤと製品の関係を保持するリレーションを定義します。
DEFINE aw_prod_id DIMENSION NUMBER (6) DEFINE aw_prod_subcategory DIMENSION TEXT DEFINE aw_prod_category DIMENSION TEXT DEFINE aw_products_all DIMENSION TEXT DEFINE aw_products DIMENSION CONCAT (aw_products_all - aw_prod_category - aw_prod_subcategory - aw_prod_id) DEFINE aw_products.parents RELATION aw_products <aw_products> DEFINE aw_supplier_id DIMENSION NUMBER (6) DEFINE aw_prod_id.aw_supplier_id RELATION aw_supplier_id <aw_prod_id>
次のコードで構成されるget_products_hier
というプログラムを記述します。
' get_products_hier Program ALLSTAT " Fetch values into the products hierarchy SQL DECLARE grabprods CURSOR FOR SELECT prod_total, - prod_category, - prod_subcategory, - prod_id - FROM sh.products SQL OPEN grabprods SQL IMPORT grabprods INTO :APPEND aw_products_all - :APPEND aw_prod_category - :APPEND aw_prod_subcategory - :APPEND aw_prod_id SQL CLOSE grabprods SQL CLEANUP " Update the analytic workspace and make the updates permanent UPDATE COMMIT " Fetch values into supplier_id SQL DECLARE grabsupid CURSOR FOR SELECT supplier_id - FROM sh.products SQL OPEN grabsupid SQL IMPORT grabsupid INTO :APPEND aw_supplier_id SQL CLOSE grabsupid SQL CLEANUP " Update the analytic workspace and make the updates permanent UPDATE COMMIT " Populate self-relation for concat dimension " and relation between aw_prod_id and aw_supplier_id SQL DECLARE makerels CURSOR FOR SELECT prod_total, - prod_category, - prod_subcategory, - prod_id, - supplier_id - FROM sh.products SQL OPEN makerels SQL FETCH makerels LOOP INTO :MATCH aw_products_all - :MATCH aw_prod_category - :MATCH aw_prod_subcategory - :MATCH aw_prod_id - :MATCH aw_supplier_id - THEN aw_products.parents(aw_products aw_prod_id) - = aw_products(aw_prod_subcategory aw_prod_subcategory) - aw_products.parents(aw_products aw_prod_subcategory) - = aw_products(aw_prod_category aw_prod_category) - aw_products.parents(aw_products aw_prod_category) - = aw_products(aw_products_all aw_products_all) - aw_prod_id.aw_supplier_id = aw_supplier_id SQL CLOSE makerels SQL CLEANUP " Update the analytic workspace and make the updates permanent UPDATE COMMIT
get_products_hier
プログラムは、SQL FETCH
コマンドおよびAPPEND
キーワードを使用して、ディメンション表のデータをaw_products
連結ディメンションのベース・ディメンションにコピーします。aw_products
のベース・ディメンションが移入されると、aw_products
そのものもOracle OLAPにより自動的に移入されます。SQL FETCH
文のTHEN
句が実行されると、Oracle OLAPはaw_products
の親子セルフ・リレーションにデータをフェッチします。このプログラムでは、aw_supplier_id
ディメンションおよびそのリレーションの移入も行われます。
SQL IMPORTコマンドは、明示的なSQLカーソルで指定されたデータを取得して処理します。SQL IMPORTは、取得したデータをOLAPオブジェクトに割り当てます。SQL IMPORTコマンドは、「アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピー」で説明したように、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするために他のSQLコマンドと組み合せて使用します。SQL IMPORTは、リレーショナル表のファクト・データをアナリティック・ワークスペースの変数にコピーする場合に特に有効です。
注意: データ型がLONG、BLOBおよびBFILEのデータは転送できません。 |
構文
SQL IMPORT cursor [:var-num-of-rows |num-of-rows[:var-num-of-processed-rows]]-
INTO :targets... [THEN action-statements...]
ここで、
targetsは、次のいずれか1つ以上です。
action-statementsは、次のいずれか1つです。
パラメータ
宣言されたカーソルの名前。
SQL IMPORTによりインポートする行数を指定するための変数の名前。
SQL IMPORTによりインポートする行数を指定する数値定数。
targetsパラメータにMATCHSKIPERRキーワードが含まれる場合に、SQL IMPORTによりアナリティック・ワークスペース・オブジェクトへインポートする実際の行数を指定するための変数の名前。
リレーショナル表から取得したデータを格納するアナリティック・ワークスペース・オブジェクトを特定します。このターゲット・アナリティック・ワークスペース・オブジェクトのリストは、その数およびデータ型が、カーソルを宣言するSQL DECLARE CURSORコマンドの引数select-statementで指定された表の列のリストに対応している必要があります。変数、修飾データ参照、リレーション、ディメンションまたはコンポジットをターゲットにできます。
重要: アナリティック・ワークスペース・オブジェクトを指定する順序は、ディメンション・ステータスに影響します。Oracle OLAPは、ディメンション値ごとに、ディメンションのステータスをフェッチされた値に一時的に制限します。値が次に割り当てられるアナリティック・ワークスペース・オブジェクトは、この一時的なステータスに従います。 |
(デフォルト)Oracle OLAPは、対応するリレーショナル表の列からターゲットのディメンションまたはサロゲートに値をコピーしません。ディメンション化されたオブジェクトにフェッチされるデータの整列では、値のみを使用します。リレーショナル・データベースから受け取る値が、ディメンション値に一致しない場合、エラーが通知されます。
Oracle OLAPは、対応するリレーショナル表の列からターゲットのディメンションまたはサロゲートに値をコピーしません。ディメンション化されたオブジェクトにフェッチされるデータの整列では、値のみを使用します。リレーショナル・データベースから受け取る値が、ディメンション値に一致しない場合、その値は無視されて処理が継続し、エラーは通知されません。
1から始まる数値で示す論理的な位置。
Oracle OLAPは、対応するリレーショナル表の列から新しい値をディメンションに追加して、ターゲットのディメンションにディメンション・メンテナンスを実行します。ディメンション化されたオブジェクトにフェッチされるデータの整列には、新旧両方のディメンション値を使用します。新しい値はディメンションの最後に追加されます。
Oracle OLAPは、対応するリレーショナル表の値を指定したサロゲートに割り当てます。
アナリティック・ワークスペース・ディメンションの名前。
アナリティック・ワークスペース・サロゲートの名前。
アナリティック・ワークスペース値セットの名前。
アナリティック・ワークスペース・リレーションの名前。
変数の名前。
QDRは、変数またはリレーションの1つ以上のディメンションを単一の値に制限する修飾子です。Oracle OLAPは、次のようにSQL IMPORT文のQDRを評価します。
QDRに式が含まれている場合、その式はデータを取得する前に1回のみ評価されます。つまり、この式は本質的に定数と言えます。
QDRがリレーション名として指定されている場合、QDRの値はそのリレーションのディメンションのステータスによって変化します。
データの行をインポートしてアナリティック・ワークスペース・オブジェクトに割り当てるたびに実行するaction-statementsを必要なだけ指定します。アクション文には、単純な代入文、条件付き代入文および複数のディメンションに及ぶ代入文を含むことができます。
アクション文では、行ごとにフェッチされたデータを確認して処理できます。たとえば、一時オブジェクトをアナリティック・ワークスペース・オブジェクトに指定し、フェッチしたデータの行に対して一定のアクションを実行した後、永続オブジェクトのみを更新できます。ただし、アクション文がインポートされたデータを参照する必要はありません。たとえば、アクション文のいずれかをユーザー定義ファンクション(つまり、プログラム)を実行する代入文にして、複雑な処理を実行してから単純にカウンタを増分できます。
THEN句によって、SQL IMPORTの完了時に実行する後処理の必要がなくなるため、SQLのロード・パフォーマンスを向上できます。
注意: SQL IMPORT内のアクション文の構文は、FILEREAD内のアクション文の構文と基本的に同じです。ただし、代入文の構文とVALUEキーワードの使用については例外があります。SQL IMPORTアクション文では、代入を明示的に行い、ソース、ターゲットおよび等号を含める必要があります。FILEREADアクション文では、暗黙的に代入を実行でき、ターゲットを指定するのみでかまいません。VALUEキーワードは、FILEREADアクション文ではサポートされていますが、SQL IMPORTアクション文ではサポートされていません。FILEREADに指定されたアクション文がすでにある場合は、代入文を修正し、必要に応じてVALUEキーワードを削除すると、そのコードをSQL IMPORTで再利用できます。ディメンション処理を制御する属性を除く大部分のFILEREAD属性は、SQLロードに対して意味がなく、SQL IMPORT内での実行の際に無視されます。パフォーマンスの向上のために、THEN句ではインポートされた行内のデータのみを参照してください。 |
アクション文のリストでは、必ず変数の前にディメンションを処理してください。Oracle OLAPは、リレーショナル表の各行について左から右にアクション文を1つずつ処理します。アクション文でディメンション処理を実行すると、その結果得られたステータスは次のアクション文にも有効になります。変数のディメンションを制限するアクション文を最初に指定しない場合、Oracle OLAPはステータスにある最初の値を使用して変数のセルのターゲットとします。ACROSS句を指定しないかぎり、Oracle OLAPは行の単一の値をOracle OLAP変数の単一のセルに割り当てます。デフォルトでは、Oracle OLAPはデータを変数に割り当てる際に変数のディメンションをループ処理しません。
式の結果である値をOracle OLAPオブジェクトに代入する代入文(SET)。
ブール式がTRUE
またはFALSE
のいずれであるかに従ってアクションを実行するIF...THEN...ELSEコマンド文。
SQL SELECT文では、式の値に基づいてアクションが実行されます。SELECT文の形式は次のとおりです。
SELECTはSELECT式を評価し、その結果をWHEN式と順次比較します。最初に一致が見つかったところで、関連付けられたactionが発生します。一致が見つからない場合、ELSE actionが指定されていれば発生します。
ACROSS文では、後に続くアクション文がACROSSディメンションのステータスにあるすべての値に対して1回ずつ実行されます。ループを複数のアクション文に適用するには、アクション文を山カッコで囲みます。ACROSS文の形式は次のとおりです。
ACROSS dimension [limit]:
action-statement
ACROSS文のlimitは、dimensionに対するFORループ時以外の場合、dimensionのステータスを一時的に変更します。新しいステータスはSQL FETCH文の間のみ有効です。limit-clauseの形式は、次のとおりです。
[ADD|COMPLEMENT|KEEP|REMOVE|TO] limit-clause
一時的なステータスを指定するには、ディメンション値の適切なリストまたは関連ディメンションとともに、LIMITコマンドのキーワードのいずれか(デフォルトはTO)を挿入します。有効な制限句を使用できます(詳細は、LIMITコマンドを参照)。次の例は、month
の現行のステータスにかかわらず、month
を最近の6つの値に制限します。
ACROSS month last 6: units
複数のアクション文は山カッコで囲んでグループ化できます。action-statement-groupの形式は次のとおりです。
<action-statement1 -
[action-statement2 . . .]>
アクション文のグループが使用されるのは、通常、ACROSS文の後です。山カッコの構文によって、ACROSSディメンションのステータスにあるすべての値に対して複数のアクション文を実行できます。
使用上の注意
SQL SELECTのターゲットの順序がディメンション・ステータスに与える影響
Oracle OLAPは、ディメンション値ごとに、ディメンションのステータスをフェッチされた値に一時的に制限します。値が次に割り当てられるアナリティック・ワークスペース・オブジェクトは、この一時的なステータスに従います。
ブール・データ型の変数の使用
OLAP SQLコマンドの入力およびターゲットのアナリティック・ワークスペース・オブジェクトにブール変数を使用できます。OLAP DML入力式の場合、Oracle OLAPはブール値を1
(TRUE)または0
(FALSE)の値を持つINTEGER
値として扱います。
ターゲット・アナリティック・ワークスペース・オブジェクトの場合、ブール変数はリレーショナル表のあらゆる数値(またはビット)列の値を受け取ることができます。
テキスト・データのDATE変数へのインポート
テキスト・データをDATE変数にインポートすると、DATEORDERオプションの現行の設定で値が解釈されます。たとえば、テキスト値12-08-96は、DATEORDERの設定によって、1996年12月8日にも1996年8月12日にも解釈できます。
例
例10-142 単純なインポート
次のプログラムの抜粋では、カーソルを宣言してデータをインポートする基本的なステップを示します。販売履歴(sh
)データベースのProducts
リレーショナル表のProd_ID
列およびProd_Name
列の値を、prod_id
ディメンションおよびprod_label
アナリティック・ワークスペース変数にフェッチします。prod_label
変数は、prod_id
でディメンション化されています。
SQL DECLARE productcur CURSOR FOR SELECT Prod_ID, Prod_Name FROM sh.Products SQL OPEN productdur SQL IMPORT productcur INTO :prod_id, :prod_label SQL CLOSE productcur SQL CLEANUP
SQL OPENコマンドは、明示的に宣言されたSQLカーソルをアクティブ化します。カーソルがオープンされると、SQLは指定されたカーソルの定義で使用されるOLAP DML入力式を判別し、カーソルの結果セットを確認し、SQL FETCHまたはSQL IMPORTが使用できるようにカーソルをオープン状態のままにします。カーソルは、結果セットの最初の行の前に配置されます。
SQL OPENコマンドは、「アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピー」で説明したように、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするために他のSQLコマンドと組み合せて使用します。
SQL PREPAREコマンドは、後でプログラム内でSQL EXECUTEを使用して実行するSQL文を、同じプログラム内でプリコンパイルします。通常、SQL PREPAREは、何度も実行されるSQL文、特にOLAP DML入力式を含むINSERT、UPDATE、DELETEなどの文の処理を最適化するためにプログラム内で使用されます。
パラメータ
sql-statementから生成された実行コードに付ける名前。statement-nameは、別のSQL PREPARE文を発行するのみで再定義できます。
実行効率を高めるためにプリコンパイルするSQL文。プログラムのコンパイル時にアンパサンド置換や未定義の変数を含むことはできません。
次のオプションは、sql-statementがINSERT
文である場合に使用できます。
DIRECT=YES|NOでは、ダイレクト・パスINSERT
を実行するかどうかを指定します。このオプションは、INSERT
文のvalues句のすぐ後に最初に指定する必要があります。
YES
に設定すると、ダイレクト・パスINSERT
が実行されます。ダイレクト・パスINSERT
を使用すると、INSERT
操作時のパフォーマンスが向上します(これは、Oracleのダイレクト・パス・ローダー・ユーティリティのSQL*Loaderと同様の機能です)。
デフォルト値はNO
で、通常のINSERT
が実行されます。
NOLOG=YES|NOは、ログを記録するかどうかを指定します。YES
に設定すると、REDO情報がREDOログ・ファイルに記録されないため、ロード時間が速くなります。デフォルト値はNO
で、ロギング・モードを指定します。
PARTITION=(sub)partition-nameは、名前付きパーティションまたはサブパーティションに関連するセグメントのみをロックするように指定します。このオプションを指定すると、同じ表の関係のないセグメントに別のセッションからデータを挿入できます。このオプションを指定しない場合(デフォルト)は、他のセッションから同じ表にデータを挿入できません。
使用上の注意
ダイレクト・パスINSERTの使用
ダイレクト・パスINSERT
を実行すると、データは、バッファ・キャッシュを経由せず直接データ・ファイルに書き込まれます。既存データの空き領域は再利用されないため、挿入データは表の既存データの後ろに追加されます。
ダイレクト・パスINSERT使用時の制約: ダイレクト・パスINSERT
には、いくつかの制約が適用されます。OLAP DMLを使用してダイレクト・パスINSERT
を実行する場合、INSERT
を正常に実行するには、ダイレクト・パスINSERT
を発行するセッションのトランザクションをコミットする必要があります。(トランザクションは、SQLまたはOLAP DML COMMITを使用してコミットできます。)
さらに、SQLでダイレクト・パスINSERT
を使用する際に適用される次の一般的な制約は、OLAP DML PREPARE文によるダイレクト・パスINSERT
のプリコンパイルにも適用されます。
ターゲット表は、索引編成およびクラスタ化ができない。
ターゲット表には、オブジェクト型列およびLOB列を含むことができない。
ターゲット表には、トリガーおよび参照整合性制約を定義できない。
ダイレクト・パスINSERTを使用する際の制約の詳細は、『Oracle Database SQL言語リファレンス』のINSERT
文の説明を参照してください。
ダイレクト・パスINSERTによるデータ型の変換: 表10-11「ダイレクト・パスINSERTによるデータ型の自動変換」に、ダイレクト・パスINSERTの実行時に自動的に変換されるデータ型を示します。
表10-11 ダイレクト・パスINSERTによるデータ型の自動変換
Oracle RDBMS | Oracle OLAP DML |
---|---|
CHAR(n)、VARCHAR(n) |
TEXT |
LONG |
WIDEオプションを持つTEXT |
CHAR(8)、VARCHAR(8) |
ID |
DATE |
DATE |
NUMBER(x,x) |
DECIMAL(SHORTDECIMAL) |
INTEGER(またはNUMBER(38)) |
INTEGER(SHORTINTEGER) |
NUMBER(1) |
BOOLEAN |
DATEデータ型の列へのOLAPテキスト・データの挿入: Oracle OLAPのテキスト・データをDATEデータ型の列に挿入する場合は、デフォルトの日付書式であるDD
MMM
YY
を使用する必要があります。セパレータとして、スラッシュ(/
)、ハイフン(-
)または空白を使用できます。データが異なる書式の場合、SQL INSERT
文でOracle TO_DATE
ファンクションを使用できます。
CLOB列またはNCLOB列への大きなテキスト値の挿入: アナリティック・ワークスペースから2KBを超えるテキスト・データをCLOBまたはNCLOB列に挿入するには、OLAP DML入力式の名前の前にWIDEキーワードを使用します。OLAP DML入力式のデータ型がTEXT
である場合、ターゲットのデータ型はCLOBです。入力式のデータ型がNTEXTである場合、ターゲットのデータ型はNCLOBです。
次に、WIDEキーワードを持つOLAP DML入力式の構文を示します。記述例は、例10-146「WIDEキーワードの使用」を参照してください。
:WIDE input-expression
記述例は、例10-146「WIDEキーワードの使用」を参照してください。
ターゲット表は、次のガイドラインに従う必要があります。
CLOBとNCLOB列の数と組合せが自由
LONG列がない
RDBMSでは、大きなデータ型にいくつかの制約があります。Oracle OLAPは、これらの制約に違反してもエラーを通知しません。ただし、予期しない結果になることがあります。ラージ・データ型に関する制約については、『Oracleアプリケーション開発者ガイド』を参照してください。
文字数の計算
Oracle OLAP変数からデータベース表に送信される文字数は、次の計算式で計算できます。
NUMCHARS(variable) + 2 * (NUMLINES(variable) - 1)
この計算式は、Oracle OLAPがデータベースにテキストを渡す際に行間に挿入する余分な改行およびライン・フィードをカウントします。
例
例10-144 FORループのプリコンパイル
salesperson
ディメンションからリレーショナル表に営業社員を自動的に追加する場合、FORループ内にSQL INSERT
文を含むプログラムを記述できます。
FOR salesperson SQL INSERT INTO Sales VALUES (:Salesperson, :Dollars) DIRECT=YES
OLAP DML入力式が含まれる文をFORループなどで何度も実行する場合、SQL文を最初にプリコンパイルしておくと効率的にその文を実行できます。INSERT文はPREPARE文の一部になります。
SQL PREPARE s1 FROM INSERT INTO Sales VALUES - (:Salesperson, :Dollars) DIRECT=YES FOR Salesperson DO SQL EXECUTE s1 IF SQLCODE NE 0 THEN BREAK DOEND
例10-145 表の更新
次の例は、アナリティック・ワークスペースに格納されているデータを使用した表の単純な更新を示します。market
ディメンションは、FORループで一度に1つの値に制限されます。SQL句のWHERE S.Market=:market
は、そのmarketの行にある売上値を変更する値として指定します。
FOR market SQL UPDATE Mkt SET Sales=:Mkt.Sales WHERE S.Market=:market
前の例のINSERT文と同様に、UPDATE
文はPREPARE文で使用し、ACROSS文またはFORループで実行します。
SQL PREPARE s2 FROM UPDATE mkt - SET Sales=:mkt.sales WHERE s.market=:market ACROSS market DO 'SQL EXECUTE s1'
SQL PROCEDUREコマンドは、RDBMSに格納されているプロシージャを実行します。
構文
SQL PROCEDURE procedure-name (parameters)
ここで、parametersは次のいずれか1つ以上で、複数の場合はカンマで区切ります。
パラメータ
SQLストアド・プロシージャの名前。
RDBMSの変数の名前。
OLAP DML式(OLAP DML変数など)。OLAP DML SQL文でのOLAP DML式の使用方法については、「OLAP DML SQL文でのOLAP DML式の使用」を参照してください。
使用上の注意
OLAP DMLによるSQLプロシージャの作成
OLAP DMLを使用してストアド・プロシージャを作成するには、SQL CREATE PROCEDURE
文を引数としたOLAP DMLのSQL文を発行します。OLAP DMLのSQL文内でCREATE PROCEDURE
を引数としてコーディングする構文は、本来のSQLでCREATE PROCEDURE
をコーディングする構文と若干異なります。OLAP DML文の引数としてコーディングする場合、終端文字としてセミコロンのかわりにティルド(~
)を、また代入文では1つではなく2つのコロンを使用します。例10-147「ストアド・プロシージャの作成」を参照してください。
OLAP DMLでSQLプロシージャをコールする際の制約
OLAP DML SQL PROCEDURE文でコールされるストアド・プロシージャには、出力変数またはトランザクションを含むことができません。
SQL SELECTコマンドは暗黙カーソルを使用してリレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーします。暗黙カーソルを使用して、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするには、SQL SELECTコマンドを使用します。また、「アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピー」で説明したように、OLAP DMLコマンドで明示カーソルを使用してデータをコピーすることも可能です。
構文
SQL SELECT expressions FROM tables -
[WHERE predicates] [GROUP BY expressions] -
[ORDER BY expressions] [HAVING predicates] -
INTO :targets... [THEN action-statements...]
targetsは、次のいずれか1つ以上です。
パラメータ
カーソルに関連付けるデータを特定するSQL SELECT文。SQL SELECT文の構文については、『Oracle Database SQL言語リファレンス』を参照してください。
リレーショナル表から取得したデータを格納するアナリティック・ワークスペース・オブジェクトを特定します。このターゲット・アナリティック・ワークスペース・オブジェクトのリストは、その数とデータ型がSELECT文で指定された表の列のリストに対応している必要があります。変数、修飾データ参照、リレーション、ディメンションまたはコンポジットをターゲットにできます。
重要: アナリティック・ワークスペース・オブジェクトを指定する順序は、ディメンション・ステータスに影響します。Oracle OLAPは、ディメンション値ごとに、ディメンションのステータスをフェッチされた値に一時的に制限します。値が次に割り当てられるアナリティック・ワークスペース・オブジェクトは、この一時的なステータスに従います。「ターゲット・アナリティック・ワークスペース・オブジェクトにする結合ディメンション」と「ターゲット・アナリティック・ワークスペース・オブジェクトにするコンポジット・ディメンション」を参照してください。 |
ターゲットには、前にコロンを付ける必要があります。ターゲットがディメンションの場合、MATCHおよびAPPENDキーワードでディメンションの処理を指定できますが、この場合、コロンはキーワードの前に付けます。
ヒント: ANDおよびORは、OLAP DML構文とSQL WHERE句のどちらでも使用できるため、Oracle OLAPがOLAP DML入力式の末尾を認識できるようにtargets句を記述します。 |
(デフォルト)Oracle OLAPは、ターゲットのディメンションやサロゲートに対してディメンション・メンテナンスを実行しません。ディメンション化されたオブジェクトにフェッチされるデータの整列では、受け取る値を使用します。リレーショナル・データベースから受け取る値が、ディメンションまたはサロゲートの値に一致しない場合、エラーが通知されます。
Oracle OLAPは、新しい値をディメンションに追加して、ターゲットのディメンションにディメンション・メンテナンスを実行します。ディメンション化されたオブジェクトにフェッチされるデータの整列には、新旧両方のディメンション値を使用します。デフォルトでは、新しい値がディメンションまたはサロゲートの最後に追加されます。また、アクション文でディメンション値を処理する方法は、positionを使用しても制御できます。
指定されたサロゲートに値を割り当てます。
オプションでTHEN句を使用すると、データの行をフェッチしてアナリティック・ワークスペース・オブジェクトに割り当てるたびに実行するaction-statementをいくつでも指定できます。action-statementは、次のいずれかです。
使用上の注意
SQL SELECTに関する一般的な制約
SQL SELECT文にアンパサンド置換を含めることはできません。
コピーの最適化
値をリレーショナル表から多次元の入力変数にコピーする場合は、SQL SELECT文の引数select-statementのORDER BY句でディメンションに対応する列を指定するとき、最も変化の遅いディメンションを最初に指定します。これにより、パフォーマンスが最適化されます。
例
例10-149 単純な選択
たとえば、次の記述を持つsales
という名前のリレーショナル表があるとします。
PROD_ID NOT NULL NUMBER(6) CUST_ID NOT NULL NUMBER TIME_ID NOT NULL DATE CHANNEL_ID NOT NULL CHAR(1) PROMO_ID NOT NULL NUMBER(6) QUANTITY_SOLD NOT NULL NUMBER(3) AMOUNT_SOLD NOT NULL NUMBER(10,2)
また、アナリティック・ワークスペースに、対応するアナリティック・ワークスペース・オブジェクトに関する次の定義があるとします。
DEFINE aw_prod_id DIMENSION NUMBER (6) DEFINE aw_cust_id DIMENSION NUMBER (6) DEFINE aw_date DIMENSION TEXT DEFINE aw_channel_id DIMENSION TEXT DEFINE aw_promo_id DIMENSION NUMBER (6) DEFINE aw_sales_dims COMPOSITE <aw_prod_id aw_cust_id - aw_channel_id aw_promo_id> DEFINE aw_sales_quantity_sold VARIABLE NUMBER (3) <aw_date aw_sales_dims - <aw_prod_id aw_cust_id aw_date aw_channel_id aw_promo_id>> DEFINE aw_sales_amount_sold VARIABLE NUMBER (10,2) <aw_date aw_sales_dims - <aw_prod_id aw_cust_id aw_date aw_channel_id aw_promo_id>>
製品415のデータをsales
表からアナリティック・ワークスペース・オブジェクトにコピーするには、次の文をOLAP Worksheetで実行します。
SQL SELECT prod_id cust_id time_id channel_id promo_id quantity_sold -
amount_sold WHERE prod_id = 415 - INTO :aw_prod_id, :aw_cust_id, :aw_date, - :aw_channel_id, :aw_promo_id, :aw_sales_quantity_sold, :aw_sales_amount_sold