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

前
 
次
 

SQL

SQLコマンドは、Structured Query Language(SQL)で記述された命令をOracle OLAPからリレーショナル・マネージャに渡すコマンドです。SQLコマンドを使用すると、リレーショナル表のデータの挿入および更新、リレーショナル表からアナリティック・ワークスペース・オブジェクトへのデータの取得、およびストアド・プロシージャの実行ができます。

SQLコマンドを使用するには、SQL構文およびリレーショナル・データベース内のデータ構造を理解している必要があります。また、対象のリレーショナル表に対する適切なアクセス権も必要です。

最初に一般的なOLAP DML SQLコマンドについて説明し、続いて、次に示す特定のSQL文としてOLAP DML SQLコマンドを使用する方法について説明します。

構文

SQL sql-statement

パラメータ

sql-statement

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プログラム内で次のコマンドを次に示す順序で使用します。

    1. SQL DECLARE CURSORを使用して、SQLカーソルをSELECT文またはプロシージャに関連付けて定義します。

    2. SQL OPENを使用して、SQLカーソルをアクティブ化します。

    3. SQL FETCHまたはSQL IMPORTを使用して、カーソルで指定されたデータを取得および処理します。


      ヒント:

      SQL FETCHは機能性に優れ、SQL IMPORTは大量のデータをリレーショナル表からアナリティック・ワークスペース・オブジェクトにコピーする際のパフォーマンスに優れています。

    4. SQL CLOSEを使用して、SQLカーソルをクローズします。

    5. 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変数データ型

CHARNCHARNVARCHAR2VARCHAR2

TEXT [WIDTH n]IDNTEXT

TEXTNTEXT

NUMBER

NUMBERINTEGERSHORTINTEGERLONGINTEGER

NUMBERINTEGERBOOLEANSHORTINTEGERLONGINTEGERDECIMALSHORTDECIMAL

CLOB(SQL FETCHおよびSQL SELECT文内のみ)

TEXT

TEXT

NCLOB(SQL FETCHおよびSQL SELECT文内のみ)

NTEXT

NTEXT

DATE

-

DATEDATETIME


SQL UPDATE文

SQL UPDATE文には、特定の検索条件を指定するWHERE句を含めることができます。単一表、および1つの表の列のみを含むビューでは、SQLで通常使用される検索条件に加えて、WHERE CURRENT OF cursor句がサポートされています。カーソルはFOR UPDATE句で定義しておく必要があります(SQL DECLARE CURSORを参照)。

例10-131 表へのデータの挿入

次のようなSQL文を使用して表を作成し、その表に行を追加できます。SQL INSERT文は、ディメンションsalespersonおよび変数dollarsの値を使用してsales表に行を追加します。ステータスにあるsalespersonの最初の値を使用して1行が追加されます。

SQL CREATE TABLE sales (name CHAR(12), dollars INTEGER)
SQL INSERT INTO sales VALUES (:salesperson, :dollars)

SQL CLEANUP

SQL CLEANUPコマンドは、すべてのSQLカーソルの宣言を取り消し、すべてのSQLカーソルのメモリー・リソースを解放します。SQL CLEANUPコマンドは、「アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピー」で説明したように、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするために他のSQLコマンドと組み合せて使用します。

構文

SQL CLEANUP

SQL CLEANUPの使用例は、例10-141「連結ディメンションへのデータのフェッチ」を参照してください。


SQL CLOSE

SQL CLOSEコマンドはSQLカーソルをクローズします。SQL OPENコマンドは、「アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピー」で説明したように、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするために他のSQLコマンドと組み合せて使用します。

構文

SQL CLOSE cursor

パラメータ

cursor

前にSQL OPEN文でオープンしたカーソルの名前。

使用上の注意

結果セットの再定義

カーソルに関連付けられている結果セットは、カーソルをクローズし、OLAP DML入力式の値を設定し、新しくSQL OPEN文を発行することによって変更できます。カーソルを解放して宣言しなおす必要はありません。


SQL DECLARE CURSOR

SQL DECLARE CURSORコマンドは、SELECT文またはプロシージャに関連付けることによって、明示的なSQLカーソルを定義します。SELECT文は、データの有効範囲(行および列)をカーソルで選択して指定します。SQL DECLARE CURSORコマンドは、「アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピー」で説明したように、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーする際、明示カーソルを使用するために他のSQLコマンドと組み合せて使用します。

SQLTABLESSQLCOLUMNSの2つの疑似プロシージャで、表と列に関する情報を取得できます。

構文

SQL DECLARE cursor CURSOR FOR {select-statement [FOR UPDATE]|table-info}

ここで、table-infoは次のいずれかです。

PROCEDURE SQLTABLES [ownertable]
PROCEDURE SQLCOLUMNS [ownertablecolumn]

注意:

table-infoは、select-statementがSQL FETCH文である場合にカーソルを宣言するときのみ指定します。

パラメータ

cursor

定義するカーソルの名前。カーソル名は、1から18個のアルファベット文字および記号@_$#で構成されます。記号@$#を含む名前は、一重引用符で囲む必要があります。最初の文字は、数字およびアンダースコア以外でなければなりません。カーソル名はOracle OLAP内部で使用されます。SQL CLEANUP文を発行せずに、以前に宣言したカーソルと同じ名前のカーソルを別のSQL SELECT文で宣言しようとすると、エラーが発生します。

select-statement

カーソルに関連付けるデータを特定するSQL SELECT文。SQL SELECT文の構文については、『Oracle Database SQL言語リファレンス』を参照してください。


ヒント:

ANDおよびORは、OLAP DML構文とSQL構文のどちらでも使用できるため、Oracle OLAPがOLAP DML入力式の末尾を認識できるように句を記述します。OLAP DML構文とSQL構文のANDおよびORが混在する場合や、Oracle OLAPが認識できないSQL演算子を使用する場合は、構文を明確にするためにカッコを使用します。

FOR UPDATE

SQL FETCHを使用して表にデータを書き込むことを示します。この句は、WHERE CURRENT OF cursor句を持つUPDATE文でカーソルを使用する場合に必要です。更新される列の名前は、OF句(たとえば、FOR UPDATE OF COL1, COL2, COL3)で指定できます。


注意:

FOR UPDATE句は、SQL IMPORTおよびSQL SELECTには無視されます。

PROCEDURE SQLTABLES

SQL FETCHで使用するカーソルを宣言する場合は、疑似プロシージャSQLTABLESをコールします。このプロシージャは、検索基準に一致する表ごとに次の値を返します(例10-133「リレーショナル表に関する情報の検出」を参照)。

  • tableowner -- 表の所有者を特定するテキスト値

  • tablename -- 表の名前を特定するテキスト値

  • tabletype: TABLE、VIEW、SYSTEM TABLE、ALIAS、SYNONYM、LOCAL TEMPORARY、GLOBAL TEMPORARYまたはNA(認識されていない種類を指す)のいずれかで表の種類を特定するテキスト値

SQL IMPORTで使用するカーソルを宣言する場合は、この句を使用できません。

PROCEDURE SQLCOLUMNS

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句は使用できません。

owner

リテラル・テキスト、または1つ以上の所有者を指定する値を持つOLAP DML変数の名前。この式はフィルタとして機能し、指定した所有者に属する表にのみ結果を制限します。キーワードNULL、またはNA値を持つOLAP DML変数では、すべての表の所有者が結果に含まれます。

式は、'SCOTT'などのように具体的に示すことも、'S%T'(Sで始まりTで終わる名前のすべての所有者)のようにワイルドカード文字で示すこともできます。この値は、大文字と小文字を維持したままデータベースに渡されるため、値の大文字と小文字が正しく入力されているか確認してください。たとえば、Oracleのリレーショナル・データベースは、デフォルトですべての値を大文字で格納するため、'scott''Scott''SCOTT'とは一致しません。

table

リテラル・テキスト、または1つ以上の表を指定する値を持つOLAP DML変数の名前。この式はフィルタとして機能し、指定した名前を持つ表にのみ結果を制限します。キーワードNULL、またはNA値を持つOLAP DML変数では、すべての表が結果に含まれます。

式は'PAYROLL'などのように具体的に示すことも、'%ROLL'(ROLLで終わる名前を持つすべての表)のようにワイルドカード文字で示すこともできます。この値は、大文字と小文字を維持したままデータベースに渡されるため、値の大文字と小文字が正しく入力されているか確認してください。たとえば、Oracleのリレーショナル・データベースは、デフォルトですべての値を大文字で格納するため、'payroll''Payroll''PAYROLL'とは一致しません。

column

リテラル・テキスト、または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 EXECUTEコマンドは、SQL PREPAREでコンパイルされたSQL文を実行します。一般に、プリコンパイルするSQL文は繰り返し実行される文であり、特に、OLAP DML入力式を含むINSERTUPDATEDELETEなどの文です。


注意:

SQL PREPAREおよびSQL EXECUTEコマンドは、同じDMLプログラム内でのみ使用できます。

構文

SQL EXECUTE statement-name

パラメータ

statement-name

SQL PREPAREを使用してプリコンパイルしたときに実行コードに付けた名前。

例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 FETCHコマンドは、名前付きSQLカーソルで指定されたデータを取得して処理します。SQL FETCHは、取得したデータをOLAPオブジェクトに割り当てます。SQL FETCHコマンドは、「アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピー」で説明したように、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするために他のSQLコマンドと組み合せて使用します。

構文

SQL FETCH cursor [LOOP [loopcount]] -

   INTO :targets... [THEN action-statements...]

ここで、

  • targetsは、次のいずれか1つ以上です。

    [MATCH] dimension|surrogate
    APPEND [positiondimension
    ASSIGN surrogate
    variable | qualified data reference | relation | composite
  • positionは、次のいずれか1つです。

    AFTER dimension-value
    BEFORE dimension-value
    FIRST
    LAST

パラメータ

cursor

宣言してオープンするカーソルの名前。

LOOP

リレーショナル表から取得した行に対してOracle OLAPが暗黙的にループ処理するように指定します。Oracle OLAPは、行ごとに、各フィールドのデータをターゲット・アナリティック・ワークスペース・オブジェクトとして指定されているオブジェクトにコピーします。LOOP句が含まれている場合、カーソルで指定されたアクティブ・セットの最後に達するまで、エラーが発生するまで、またはloopcountに達するまで、SQL FETCHは行処理を継続します。SQL FETCHのパフォーマンスを改善するために、ほとんどの場合でLOOP句を使用します。

LOOP句を指定しないときに、カーソルが指定するアクティブ・セットに複数の行が含まれている場合、SQL FETCH文はWHILEループ内でコーディングする必要があります。このループは、データの終了またはエラーを示す場合にゼロ以外の値を返すSQLCODEオプションの値に基づくようにします。

loopcount

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には実際に処理された行数が含まれます。

loopcountNAを指定すると、SQL FETCHはSQLCODEがゼロ以外の値になるまで行を処理します。ただし、SQL FETCHを完了すると、loopcountには実際に処理した行数が含まれます。

targets

リレーショナル表から取得したデータを格納するアナリティック・ワークスペース・オブジェクトを特定します。このターゲット・アナリティック・ワークスペース・オブジェクトのリストは、その数およびデータ型が、カーソルを宣言するSQL DECLARE CURSORコマンドの引数select-statementで指定された表の列のリストに対応している必要があります。変数、修飾データ参照、リレーション、ディメンション、コンポジットまたは結合をターゲットにできます。


重要:

ターゲット・アナリティック・ワークスペース・オブジェクトを指定する順序は、ディメンション・ステータスに影響します。Oracle OLAPは、ディメンション値ごとに、ディメンションのステータスをフェッチされた値に一時的に制限します。値が次に割り当てられるアナリティック・ワークスペース・オブジェクトは、この一時的なステータスに従います。「ターゲット・アナリティック・ワークスペース・オブジェクトにする結合ディメンション」「ターゲット・アナリティック・ワークスペース・オブジェクトにするコンポジット・ディメンション」を参照してください。

ターゲットには、前にコロンを付ける必要があります。ターゲットがディメンションの場合、MATCHおよびAPPENDキーワードでディメンションの処理を指定できますが、この場合、コロンはキーワードの前に付けます。

[MATCH] {dimension|surrogate}

(デフォルト)Oracle OLAPは、ターゲットのディメンションやサロゲートに対してディメンション・メンテナンスを実行しません。ディメンション化されたオブジェクトにフェッチされるデータの整列では、受け取る値を使用します。リレーショナル・データベースから受け取る値が、ディメンションまたはサロゲートの値に一致しない場合、エラーが通知されます。

APPEND [position] dimension

Oracle OLAPは、新しい値をディメンションに追加して、ターゲットのディメンションにディメンション・メンテナンスを実行します。ディメンション化されたオブジェクトにフェッチされるデータの整列には、新旧両方のディメンション値を使用します。デフォルトでは、新しい値がディメンションまたはサロゲートの最後に追加されます。

positionは、次のいずれか1つです。

  • AFTER dimension-value

    新しい値は、ステータス・リストのdimension-valueの後ろに追加されます。

  • BEFORE dimension-value

    新しい値は、ステータス・リストのdimension-valueの直前に追加されます。

  • FIRST

    新しい値はステータス・リストの最初に追加されます。

  • LAST

    新しい値はステータス・リストの最後に追加されます。

また、アクション文でディメンション値を処理する方法は、positionを使用しても制御できます。

ASSIGN surrogate

指定されたサロゲートに値を割り当てます。

THEN action-statements...

データの行をフェッチしてターゲット・アナリティック・ワークスペース・オブジェクトに割り当てるたびに実行するaction-statementsを必要なだけ指定します。action-statementは、次のいずれかです。

assignment-statement

IF statement

SELECT-statement

ACROSS statement: action-statement

<action-statement-group>

action-statementsの構文の詳細は、SQL IMPORTコマンドを参照してください。

使用上の注意

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つのベース・ディメンション、marketproductおよびtimeがあります。このため、SELECT文は3つに対応する列(MktcodePrdcodeおよびPercode)を指定します。このプログラムは、marketproductおよび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_idprod_subcategoryprod_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 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つ以上です。

    MATCH | MATCHSKIPERR [position] {dimension | surrogate | valueset | relation}
    APPEND dimension
    ASSIGN surrogate
    variable | relation | qualified data reference
  • action-statementsは、次のいずれか1つです。

    assignment-statement
    IF-statement
    SELECT-statement
    ACROSS-statement: action-statement
    <action-statement-group>

 

パラメータ

cursor

宣言されたカーソルの名前。

var-num-of-rows

SQL IMPORTによりインポートする行数を指定するための変数の名前。

num-of-rows

SQL IMPORTによりインポートする行数を指定する数値定数。

var-num-of-processed-rows

targetsパラメータにMATCHSKIPERRキーワードが含まれる場合に、SQL IMPORTによりアナリティック・ワークスペース・オブジェクトへインポートする実際の行数を指定するための変数の名前。

targets

リレーショナル表から取得したデータを格納するアナリティック・ワークスペース・オブジェクトを特定します。このターゲット・アナリティック・ワークスペース・オブジェクトのリストは、その数およびデータ型が、カーソルを宣言するSQL DECLARE CURSORコマンドの引数select-statementで指定された表の列のリストに対応している必要があります。変数、修飾データ参照、リレーション、ディメンションまたはコンポジットをターゲットにできます。


重要:

アナリティック・ワークスペース・オブジェクトを指定する順序は、ディメンション・ステータスに影響します。Oracle OLAPは、ディメンション値ごとに、ディメンションのステータスをフェッチされた値に一時的に制限します。値が次に割り当てられるアナリティック・ワークスペース・オブジェクトは、この一時的なステータスに従います。

MATCH

(デフォルト)Oracle OLAPは、対応するリレーショナル表の列からターゲットのディメンションまたはサロゲートに値をコピーしません。ディメンション化されたオブジェクトにフェッチされるデータの整列では、値のみを使用します。リレーショナル・データベースから受け取る値が、ディメンション値に一致しない場合、エラーが通知されます。

MATCHSKIPERR

Oracle OLAPは、対応するリレーショナル表の列からターゲットのディメンションまたはサロゲートに値をコピーしません。ディメンション化されたオブジェクトにフェッチされるデータの整列では、値のみを使用します。リレーショナル・データベースから受け取る値が、ディメンション値に一致しない場合、その値は無視されて処理が継続し、エラーは通知されません。

position

1から始まる数値で示す論理的な位置。

APPEND

Oracle OLAPは、対応するリレーショナル表の列から新しい値をディメンションに追加して、ターゲットのディメンションにディメンション・メンテナンスを実行します。ディメンション化されたオブジェクトにフェッチされるデータの整列には、新旧両方のディメンション値を使用します。新しい値はディメンションの最後に追加されます。

ASSIGN

Oracle OLAPは、対応するリレーショナル表の値を指定したサロゲートに割り当てます。

dimension

アナリティック・ワークスペース・ディメンションの名前。

surrogate

アナリティック・ワークスペース・サロゲートの名前。

valueset

アナリティック・ワークスペース値セットの名前。

relation

アナリティック・ワークスペース・リレーションの名前。

variable

変数の名前。

qualified_data_reference

QDRは、変数またはリレーションの1つ以上のディメンションを単一の値に制限する修飾子です。Oracle OLAPは、次のようにSQL IMPORT文のQDRを評価します。

  • QDRに式が含まれている場合、その式はデータを取得する前に1回のみ評価されます。つまり、この式は本質的に定数と言えます。

  • QDRがリレーション名として指定されている場合、QDRの値はそのリレーションのディメンションのステータスによって変化します。

THEN action-statements...

データの行をインポートしてアナリティック・ワークスペース・オブジェクトに割り当てるたびに実行する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はデータを変数に割り当てる際に変数のディメンションをループ処理しません

assignment-statement

式の結果である値をOracle OLAPオブジェクトに代入する代入文(SET)。

IF-statement

ブール式がTRUEまたはFALSEのいずれであるかに従ってアクションを実行するIF...THEN...ELSEコマンド文。

SELECT-statement

SQL SELECT文では、式の値に基づいてアクションが実行されます。SELECT文の形式は次のとおりです。

SELECT select-expression
[WHEN expression1 action]
[WHEN expression2 action . . .]
[ELSE action]

SELECTはSELECT式を評価し、その結果をWHEN式と順次比較します。最初に一致が見つかったところで、関連付けられたactionが発生します。一致が見つからない場合、ELSE actionが指定されていれば発生します。

ACROSS-statement: action-statement

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-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 OPENコマンドは、明示的に宣言されたSQLカーソルをアクティブ化します。カーソルがオープンされると、SQLは指定されたカーソルの定義で使用されるOLAP DML入力式を判別し、カーソルの結果セットを確認し、SQL FETCHまたはSQL IMPORTが使用できるようにカーソルをオープン状態のままにします。カーソルは、結果セットの最初の行の前に配置されます。

SQL OPENコマンドは、「アナリティック・ワークスペース・オブジェクトへのリレーショナル・データのコピー」で説明したように、リレーショナル表からアナリティック・ワークスペース・オブジェクトにデータをコピーするために他のSQLコマンドと組み合せて使用します。

構文

SQL OPEN cursor

パラメータ

cursor

同じプログラム内で先に宣言されているカーソルの名前。アンパサンド置換は使用できません。

例10-143 SQL OPENによるカーソルのオープン

次のプログラムの抜粋は、geolabelsというカーソルを宣言してオープンします。

SQL DECLARE geolabels CURSOR FOR -
   SELECT Store_ID, Store_Name, City FROM Stores
IF SQLCODE NE 0
   THEN SIGNAL dclerror 'SQLERRM'
SQL OPEN geolabels
IF SQLCODE NE 0
   THEN SIGNAL operror 'SQLERRM' 

SQL PREPARE

SQL PREPAREコマンドは、後でプログラム内でSQL EXECUTEを使用して実行するSQL文を、同じプログラム内でプリコンパイルします。通常、SQL PREPAREは、何度も実行されるSQL文、特にOLAP DML入力式を含むINSERT、UPDATE、DELETEなどの文の処理を最適化するためにプログラム内で使用されます。

構文

SQL PREPARE statement-name FROM sql-statement [insert-options]

パラメータ

statement-name

sql-statementから生成された実行コードに付ける名前。statement-nameは、別のSQL PREPARE文を発行するのみで再定義できます。

sql-statement

実行効率を高めるためにプリコンパイルするSQL文。プログラムのコンパイル時にアンパサンド置換や未定義の変数を含むことはできません。

insert-options

次のオプションは、sql-statementINSERT文である場合に使用できます。

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'

例10-146 WIDEキーワードの使用

次の両方の文で、WIDEはターゲット値について、var1TEXTの場合はCLOBvar1NTEXTの場合はNCLOBであることを示します。

SQL INSERT INTO CLOB_TEST values (:dim1 :WIDE var1)
SQL UPDATE CLOB_TEXT SET clob_col = :WIDE var1 WHERE key = 1

SQL PROCEDURE

SQL PROCEDUREコマンドは、RDBMSに格納されているプロシージャを実行します。


注意:

OLAP DMLを使用して、SQLストアド・プロシージャも作成できます。参照:

構文

SQL PROCEDURE procedure-name (parameters)

ここで、parametersは次のいずれか1つ以上で、複数の場合はカンマで区切ります。

sql-parameter
:dml-parameter

パラメータ

procedure-name

SQLストアド・プロシージャの名前。

sql-parameter

RDBMSの変数の名前。

:dml-parameter

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文でコールされるストアド・プロシージャには、出力変数またはトランザクションを含むことができません。

例10-147 ストアド・プロシージャの作成

次の例は、new_productsというプロシージャを作成する構文を示します。

SQL CREATE OR REPLACE PROCEDURE new_products -
   (id CHAR, name CHAR, cost NUMBER) AS -
      price NUMBER~ -
   BEGIN -
      price ::= cost * 2.5~ -
      INSERT INTO products -
         VALUES(id, name, price)~ -
   END~

例10-148 ストアド・プロシージャの実行

次のFORループは、new_productsというSQLストアド・プロシージャを実行し、ディメンションおよび変数に格納されたデータをリレーショナル表に挿入します。この例で、prodはOracle OLAPディメンション、labels.pおよびcost.pprodでディメンション化された変数です。

FOR prod
   DO
      SQL PROCEDURE new_products(:prod, :labels.p, :cost.p)
      IF SQLCODE NE 0
         THEN BREAK
   DOEND 

SQL SELECT

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つ以上です。

[MATCH] dimension|surrogate
APPEND [positiondimension
ASSIGN surrogate
variable|qualified data reference|relation|composite

パラメータ

SELECT expressions FROM tables-
 [WHERE predicates] [GROUP BY expressions] -
[ORDER BY expressions] [HAVING predicates]

カーソルに関連付けるデータを特定するSQL SELECT文。SQL SELECT文の構文については、『Oracle Database SQL言語リファレンス』を参照してください。

targets

リレーショナル表から取得したデータを格納するアナリティック・ワークスペース・オブジェクトを特定します。このターゲット・アナリティック・ワークスペース・オブジェクトのリストは、その数とデータ型がSELECT文で指定された表の列のリストに対応している必要があります。変数、修飾データ参照、リレーション、ディメンションまたはコンポジットをターゲットにできます。


重要:

アナリティック・ワークスペース・オブジェクトを指定する順序は、ディメンション・ステータスに影響します。Oracle OLAPは、ディメンション値ごとに、ディメンションのステータスをフェッチされた値に一時的に制限します。値が次に割り当てられるアナリティック・ワークスペース・オブジェクトは、この一時的なステータスに従います。「ターゲット・アナリティック・ワークスペース・オブジェクトにする結合ディメンション」「ターゲット・アナリティック・ワークスペース・オブジェクトにするコンポジット・ディメンション」を参照してください。

ターゲットには、前にコロンを付ける必要があります。ターゲットがディメンションの場合、MATCHおよびAPPENDキーワードでディメンションの処理を指定できますが、この場合、コロンはキーワードの前に付けます。


ヒント:

ANDおよびORは、OLAP DML構文とSQL WHERE句のどちらでも使用できるため、Oracle OLAPがOLAP DML入力式の末尾を認識できるようにtargets句を記述します。

[MATCH] {dimension|surrogate}

(デフォルト)Oracle OLAPは、ターゲットのディメンションやサロゲートに対してディメンション・メンテナンスを実行しません。ディメンション化されたオブジェクトにフェッチされるデータの整列では、受け取る値を使用します。リレーショナル・データベースから受け取る値が、ディメンションまたはサロゲートの値に一致しない場合、エラーが通知されます。

APPEND [position] dimension

Oracle OLAPは、新しい値をディメンションに追加して、ターゲットのディメンションにディメンション・メンテナンスを実行します。ディメンション化されたオブジェクトにフェッチされるデータの整列には、新旧両方のディメンション値を使用します。デフォルトでは、新しい値がディメンションまたはサロゲートの最後に追加されます。また、アクション文でディメンション値を処理する方法は、positionを使用しても制御できます。

ASSIGN surrogate

指定されたサロゲートに値を割り当てます。

THEN action-statements

オプションでTHEN句を使用すると、データの行をフェッチしてアナリティック・ワークスペース・オブジェクトに割り当てるたびに実行するaction-statementをいくつでも指定できます。action-statementは、次のいずれかです。

assignment-statement
IF-statement
SELECT-statement
ACROSS-statement: action-statement
<action-statement-group>

action-statementの構文の詳細は、SQL IMPORTコマンドを参照してください。

使用上の注意

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