機械翻訳について

8 CursorクラスおよびCursorの概念

この章では、Oracle OLAP Java API Cursorクラスと、問合せの結果の取得に使用する関連クラスについて説明します。 この章では、位置、フェッチ・サイズおよびエクステントのCursorの概念についても説明します。 Cursorとその関連オブジェクトの作成および使用の例は、「問合せ結果の取得中」を参照してください。

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

8.1 OLAP Java API Cursorオブジェクトの概要

Cursorは、Sourceで指定された結果セットを取得します。 Cursorを作成するには、CursorManagercreateCursorメソッドをコールします。 CursorManagerを作成するには、DataProvidercreateCursorManagerメソッドをコールします。

Cursorを作成せずに、Oracle OLAP SQLジェネレータによってSourceに対して生成されたSQLを取得できます。 SourceのSQLを取得するには、DataProvidercreateSQLCursorManagerメソッドを使用してSQLCursorManagerを作成します。 次に、OLAP Java API外部のクラス、またはその他のメソッドを使用して、生成されたSQLを使用してデータを取得します。

8.1.1 Cursorの作成

SourceCursorを作成するには、次の手順を実行します:

  1. DataProvidercreateCursorManagerメソッドのいずれかをコールし、Sourceを渡して、CursorManagerを作成します。 Cursorの動作を変更する場合は、CursorInfoSpecificationを作成し、そのメソッドを使用して動作を指定できます。 次に、SourceおよびCursorInfoSpecificationを取得するメソッドを使用してCursorManagerを作成します。
  2. CursorManagercreateCursorメソッドをコールして、Cursorを作成します。

8.1.2 Cursorを作成できないSource

一部のSourceオブジェクトでは、Cursorがデータ・ストアから取得できるデータは指定されません。 次に、値を含むCursorを作成できないSourceオブジェクトを示します。

  • 計算不可能な操作を指定するSource 例として、無限再帰を指定するSourceがあります。

  • 無限の結果セットを定義するSource 例として、すべてのStringオブジェクトのセットを表す基本的なSourceがあります。

  • 要素がないか、要素がない別のSourceを含むSource たとえば、DataProvidergetEmptySourceメソッドによって戻されるSourceと、空のSourceから導出される別のSourceです。 別の例として、MdmDimensionから取得したプライマリSourceから値を選択した結果、選択した値がディメンションに存在しない導出Sourceがあります。

そのようなSourceに対してCursorを作成し、Cursorの値を取得しようとすると、Exceptionが発生します。

8.1.3 CursorオブジェクトおよびTransactionオブジェクト

導出されたSourceを作成するか、Templateの状態を変更する場合は、現在のTransactionのコンテキストでSourceを作成します。 Sourceは、作成したTransaction、またはそのTransactionの子Transactionでアクティブです。 Cursorを作成するには、Sourceが現在のTransactionでアクティブである必要があります。

導出されたSourceの作成は、書込みTransactionで行われます。 Cursorの作成は、読取りTransactionで行われます。 導出されたSourceを作成した後で、そのSourceCursorを作成する前に、アプリケーションが使用しているTransactionProvidercommitCurrentTransactionメソッドをコールして、書込みTransactionを読み込みTransactionに変更する必要があります。 TransactionおよびTransactionProviderオブジェクトの詳細は、「TransactionProviderの使用」を参照してください。

パラメータ化されたSourceを含む問合せ用に作成するCursorの場合、Parameterオブジェクトの値を変更してから、Transactionを再度コミットすることなく、Cursorの新しい値を取得できます。 パラメータ化されたSourceオブジェクトの詳細は、「Sourceオブジェクトの理解」を参照してください。

8.2 Cursorクラス

oracle.olapi.data.cursorパッケージでは、Oracle OLAP Java APIによって、次の表で説明するインタフェースが定義されます。

インタフェース 説明

Cursor

現在の位置の概念をカプセル化する抽象スーパークラス。

ValueCursor

現在の位置の値を持つCursor ValueCursorには子Cursorオブジェクトがありません。

CompoundCursor

Cursorオブジェクトを持つCursor。このオブジェクトは、関連付けられたSourceの値の子ValueCursorであり、Sourceの出力ごとに出力子Cursorです。

8.2.1 Cursorの構造

Cursorの構造は、それに関連付けられたSourceの構造を反映します。 Sourceに出力がない場合、そのSourceCursorValueCursorです。 Sourceに1つ以上の出力がある場合、そのSourceCursorCompoundCursorです。 CompoundCursorは、CompoundCursorSourceのベースの値を持つベースValueCursorと、1つ以上の出力Cursorオブジェクトを子として持ちます。

Sourceの出力は、別のSourceです。 出力Source自体に出力を含めることができます。 Sourceの出力の子Cursorは、出力Sourceに出力がない場合はValueCursor、出力する場合はCompoundCursorです。

「例8-1」は、選択した月の選択した製品アイテムの価格を指定する問合せを作成します。 この例では、timeHierは時間値のディメンションの階層のSourceで、prodHierは製品値のディメンションの階層のSourceです。

prodSelまたはtimeSelCursorを作成する場合、prodSeltimeSelの両方に出力がないため、CursorValueCursorになります。

unitPriceオブジェクトは、製品ユニットの価格の値を表すMdmBaseMeasureSourceです。 MdmBaseMeasureは、製品および時間を表すMdmPrimaryDimensionオブジェクトを入力として保持し、unitPrice Sourceは、これらのディメンションのSourceオブジェクトを入力として持ちます。

この例では、ディメンション階層の要素を選択し、選択したSourceオブジェクトをメジャーの要素に結合して、prodSelおよびtimeSelを出力として持つquerySourceを生成します。

例8-1 querySource問合せの作成

Source timeSel = timeHier.selectValues(new String[] 
                                          {"CALENDAR_YEAR::MONTH::2001.01",
                                           "CALENDAR_YEAR::MONTH::2001.04",
                                           "CALENDAR_YEAR::MONTH::2001.07",
                                           "CALENDAR_YEAR::MONTH::2001.10"});
 
Source prodSel = prodHier.selectValues(new String[]
                                          {"PRODUCT_PRIMARY::ITEM::ENVY ABM",
                                           "PRODUCT_PRIMARY::ITEM::ENVY EXE",
                                           "PRODUCT_PRIMARY::ITEM::ENVY STD"});
 
Source querySource = unitPrice.join(timeSel).join(prodSel);

querySourceで定義された結果セットは、選択した月の選択した製品の単価値です。 結果は出力別に整理されます。 timeSelunitPrice.join(prodSel)操作によって生成されるSourceに結合されるため、timeSelは変化の遅い出力です。つまり、結果セットでは、選択した各時間値について選択された製品のセットが指定されます。 時間値ごとに結果セットに3つの製品値があるため、製品値は時間値より速く変化します。 querySourceのベースValueCursorの値は、毎日製品ごとに1つの価格値があるため、最も速く変化します。

「問合せ結果の取得中」「例9-1」は、querySourceCursorqueryCursorを作成します。 querySourceには出力があるため、queryCursorCompoundCursorです。 queryCursorのベースValueCursorには、querySourceを作成した操作のベースSourceであるunitPriceの値があります。 unitPriceの値は、出力によって指定された値です。 queryCursorの出力は、prodSelからの値を持つValueCursorと、timeSelからの値を持つValueCursorです。

図8-1 CompoundCursorであるqueryCursorの構造

この図は、queryCursorの構造を示しています。 ベースValueCursorおよび2つの出力ValueCursorオブジェクトは、親CompoundCursorであるqueryCursorの子です。

図8-1の説明が続きます
「図8-1 CompoundCursorであるqueryCursorの構造」の説明

次の表に、表内のqueryCursorの値を示します。 左の列は時間値、中央の列は製品値、右の列は月の製品の単位価格を表しています。

製品 単位価格

2001.01

ENVY ABM

3042.22

2001.01

ENVY EXE

3223.28

2001.01

ENVY STD

3042.22

2001.04

ENVY ABM

2412.42

2001.04

ENVY EXE

3107.65

2001.04

ENVY STD

3026.12

2001.07

ENVY ABM

2505.57

2001.07

ENVY EXE

3155.91

2001.07

ENVY STD

2892.18

2001.10

ENVY ABM

2337.30

2001.10

ENVY EXE

3105.53

2001.10

ENVY STD

2856.86

ValueCursorから値を取得する例は、「問合せ結果の取得中」を参照してください。

8.2.2 Cursorの動作の指定

CursorSpecificationオブジェクトは、対応するCursorオブジェクトの動作の一部を指定します。 対応するCursorを作成する前に、CursorSpecificationの動作を指定する必要があります。 動作を指定するには、次のCursorSpecificationメソッドを使用します:

  • setDefaultFetchSize

  • setExtentCalculationSpecified

  • setParentEndCalculationSpecified

  • setParentStartCalculationSpecified

  • specifyDefaultFetchSizeOnChildren (CompoundCursorSpecificationの場合のみ)

CursorSpecificationには、動作が指定されているかどうかを検出するために使用できるメソッドもあります。 それらのメソッドを次に示します。

  • isExtentCalculationSpecified

  • isParentEndCalculationSpecified

  • isParentStartCalculationSpecified

CursorSpecificationメソッドを使用して、デフォルトのフェッチ・サイズを設定したり、値の親の値のエクステントまたは開始位置または終了位置を計算したりした場合は、次のCursorメソッドを正常に使用できます:

  • getExtent

  • getFetchSize

  • getParentEnd

  • getParentStart

  • setFetchSize

Cursorの動作を指定する例は、「問合せ結果の取得中」を参照してください。 フェッチ・サイズの詳細は、フェッチ・サイズについてを参照してください。 Cursorのエクステントについては、カーソルの範囲とは何ですか。を参照してください。 Cursorの現在の値の親Cursorの開始位置と終了位置の詳細は、カーソルの親の開始位置と終了位置についてを参照してください。

8.3 CursorInfoSpecificationクラス

CursorInfoSpecificationインタフェースおよびサブインタフェースCompoundCursorInfoSpecificationおよびValueCursorInfoSpecificationは、抽象CursorSpecificationクラスおよび具象CompoundCursorSpecificationおよびValueCursorSpecificationクラスのメソッドを指定します。 CursorSpecificationは、それに対応するCursorの動作の特定の側面を指定します。 CursorInfoSpecificationインタフェースを実装するクラスのインスタンスは、直接的または間接的に作成できます。

DataProvidercreateCursorInfoSpecificationメソッドをコールして、SourceCursorSpecificationを作成できます。 このメソッドは、CompoundCursorSpecificationまたはValueCursorSpecificationを返します。 CursorSpecificationのメソッドを使用して、Cursorの動作の側面を指定できます。 CursorSpecificationを使用してCursorManagerを作成するには、DataProvidercreateCursorManagerメソッドにcursorInfoSpec引数として渡します。

CursorSpecificationメソッドを使用すると、次のことができます:

  • CursorSpecificationに対応するSourceを取得します。

  • 対応するCursorのデフォルト・フェッチ・サイズを取得または設定します。

  • Oracle OLAPがCursorのエクステントを計算するように指定します。

  • エクステントの計算が指定されているかどうかを判断できます。

  • Oracle OLAPが、親Cursorの対応するCursorの現在の値の開始位置または終了位置を計算するように指定します。 親の値の開始位置と終了位置がわかっている場合は、その値に対して親Cursorが持つ、より速く変化する要素の数を決定できます。

  • 親の対応するCursorの現在の値の開始位置または終了位置を計算するかどうかを決定します。

  • CursorSpecificationVisitorを受け入れます。

詳細は、カーソルの位置とエクステントについておよびフェッチ・サイズについてを参照してください。

oracle.olapi.data.sourceパッケージでは、Oracle OLAP Java APIによって、次の表で説明するクラスが定義されます。

インタフェース 説明

CursorInfoSpecification

CursorSpecificationオブジェクトのメソッドを指定するインタフェース。

CursorSpecification

CursorInfoSpecificationインタフェースの一部のメソッドを実装する抽象クラス。

CompoundCursorSpecification

1つ以上の出力を含むSourceCursorSpecification CompoundCursorSpecificationには、コンポーネントの子CursorSpecificationオブジェクトがあります。

CompoundInfoCursorSpecification

CompoundCursorSpecificationオブジェクトのメソッドを指定するインタフェース。

ValueCursorSpecification

値を持ち、出力がないSourceCursorSpecification

ValueCursorInfoSpecification

ValueCursorSpecificationオブジェクトのインタフェース。

Cursorの構造は、CursorSpecificationと同じです。 ValueCursorSpecificationまたはCompoundCursorSpecificationには、対応するValueCursorまたはCompoundCursorがあります。 Cursorから特定の情報または動作を取得できるようにするには、アプリケーションは、Cursorを作成する前に、対応するCursorSpecificationのメソッドをコールして、その情報または動作が必要であることを指定する必要があります。

8.4 CursorManagerクラス

CursorManagerを使用すると、SourceCursorを作成できます。 DataProvidercreateCursorManagerメソッドのいずれかによって返されるクラスは、作成するCursorオブジェクトのデータのバッファリングを管理します。

同じCursorManagerから複数のCursorを作成できます。これは、結果セットのデータを表やグラフなどの様々な形式で表示する場合に役立ちます。 CursorManagerで作成されたすべてのCursorオブジェクトには、デフォルトのフェッチ・サイズなど、同じ指定があります。 Cursorオブジェクトは同じ仕様であるため、CursorManagerによって管理されるデータを共有できます。

SQLCursorManagerには、Sourceに対してOracle OLAP SQLジェネレータによって生成されたSQLを戻すメソッドがあります。 DataProvidercreateSQLCursorManagerまたはcreateSQLCursorManagersメソッドをコールして、1つ以上のSQLCursorManagerオブジェクトを作成します。 SQLCursorManagerを使用してCursorを作成することはありません。 かわりに、SQLCursorManagerによって返されたSQLをOLAP Java APIの外部のクラスとともに使用するか、または問合せで指定されたデータを取得します。

8.4.1 CursorManagerのCursorInfoSpecificationの更新

アプリケーションでOLAP Java API Templateオブジェクトを使用していて、Templateの状態がTemplateによって生成されるSourceの構造を変更する方法で変更された場合、SourceCursorInfoSpecificationオブジェクトは無効になります。 変更されたSourceに対して新しいCursorInfoSpecificationオブジェクトを作成する必要があります。

新しいCursorInfoSpecificationを作成した後、Sourceの新しいCursorManagerを作成できます。 ただし、新しいCursorManagerを作成する必要はありません。 既存のCursorManagerupdateSpecificationメソッドをコールして、前のCursorInfoSpecificationを新しいCursorInfoSpecificationに置き換えることができます。 その後、CursorManagerから新しいCursorを作成できます。

8.5 Cursorの位置およびエクステント

Cursorには1つ以上の位置があります。 Cursor「現在の位置」は、Cursorで現在アクティブな位置です。 Cursorの現在の位置を移動するには、CursorsetPositionメソッドまたはnextメソッドをコールします。

Oracle OLAPは、getCurrentValueメソッドのコールなど、Cursorに対して操作を試行するまで、Cursorに設定した位置を検証しません。 現在の位置を負の値またはCursor内の位置数より大きい値に設定し、Cursor操作を試行すると、CursorPositionOutOfBoundsExceptionをスローします。

Cursorのエクステントについては、カーソルの範囲とは何ですか。を参照してください。

8.5.1 ValueCursorの位置

ValueCursorの現在の位置は、取得可能な値を指定します。 たとえば、prodSel (カーソルの構造で説明されている派生Source)は、製品のディメンションとその階層グループ化を指定するプライマリSourceから3つの製品を選択したものです。 prodSelValueCursorには3つの要素があります。 次の例では、ValueCursorの各要素の位置を取得し、その位置の値を表示します。

// prodSelValCursor is the ValueCursor for prodSel
println("ValueCursor Position  Value ");
println("--------------------  ------------------------");
do 
{
  println("          " + prodSelValCursor.getPosition() + 
          "           " + prodSelValCursor.getCurrentValue());
} while(prodSelValCursor.next());

前述の例によって表示される値は、次のとおりです。

ValueCursor Position               Value 
--------------------  -------------------------------
          1           PRODUCT_PRIMARY::ITEM::ENVY ABM
          2           PRODUCT_PRIMARY::ITEM::ENVY EXE
          3           PRODUCT_PRIMARY::ITEM::ENVY STD

次の例では、prodSelValCursorの現在の位置を2に設定し、その位置の値を取得します。

prodSelValCursor.setPosition(2);
println(prodSelValCursor.getCurrentString());

前述の例によって表示される値は、次のとおりです。

PRODUCT_PRIMARY::ITEM::ENVY EXE

ValueCursorの現在の値を取得するその他の例は、「問合せ結果の取得中」を参照してください。

8.5.2 CompoundCursorの位置

CompoundCursorは、子孫のValueCursorオブジェクトの要素セットごとに1つの位置を持ちます。 CompoundCursorの現在の位置は、これらのセットの1つを指定します。

たとえば、「例8-1」で作成されたSourcequerySourceは、メジャーunitPriceの値を持ちます。 これらの値は、異なる時点での製品の単位価格です。 querySourceの出力は、時間ディメンションから4か月の値、および製品ディメンションから3つの製品値を選択するSourceオブジェクトです。

querySourceの結果セットには、タプルごとに1つのメジャー値(各出力値のセット)があるため、値の合計数は12です(4か月ごとに3つの製品のそれぞれに1つの値)。 したがって、querySource用に作成されたqueryCursor CompoundCursorには12個の位置があります。

queryCursorの各位置は、出力の1つの位置セットとValueCursorのベースを指定します。 たとえば、queryCursorの位置1は、出力およびベースValueCursorに対して次の位置セットを定義します:

  • 出力1の位置1 (timeSelValueCursor)

  • 出力2の位置1 (prodSelValueCursor)

  • queryCursorのベースValueCursorの位置1 (この位置は、出力の値で指定されたunitPriceメジャーの値を持ちます。)

図8-2 queryCursor内のCursorの位置

この例では、queryCursor CompoundCursor、ベースValueCursor、および出力の位置を示します。

図8-2の説明が続きます
「図8-2 queryCursor内のCursorの位置」の説明

queryCursorValueCursorの位置は1つのみです。これは、出力の1つの値セットによってunitPriceの値が1つのみ指定されるためです。 querySourceなどの問合せの場合、CursorValueCursorの値は1つのみであるため、ルートCompoundCursorの任意の1つの位置に対して一度に1つの位置のみを持ちます。

図8-3 queryCursorのクロス集計の表示

この図は、queryCursorのデータの表示の1つを示しています。 これは、4つの列および5つの行で構成されたクロス集計ビューです。 左の列は日付値です。 一番上の行は製品値です。 クロス集計の交差している各セルは、その月の製品の価格です。

図8-3の説明は図の下のリンクをクリックしてください。
「図8-3 queryCursorのクロス集計の表示」の説明

CompoundCursorは、ValueCursorオブジェクトの位置を相互に相対的に調整します。 CompoundCursorの現在の位置は、子孫のValueCursorオブジェクトの現在の位置を指定します。

例8-2 CompoundCursorの位置の設定および現在の値の取得

この例では、queryCursorの位置を設定してから、現在の値および子Cursorオブジェクトの位置を取得します。

CompoundCursor rootCursor = (CompoundCursor) queryCursor;
ValueCursor baseValueCursor = rootCursor.getValueCursor();
List outputs = rootCursor.getOutputs();
ValueCursor output1 = (ValueCursor) outputs.get(0);
ValueCursor output2 = (ValueCursor) outputs.get(1);
int pos = 5;
rootCursor.setPosition(pos);
println("CompoundCursor position set to " + pos + ".");
println("The current position of the CompoundCursor is = " +
        rootCursor.getPosition() + ".");
println("Output 1 position = " + output1.getPosition() +
        ", value = " + output1.getCurrentValue());
println("Output 2 position = " + output2.getPosition() +
        ", value = " + output2.getCurrentValue());
println("VC position = " + baseValueCursor.getPosition() +
        ", value = " + baseValueCursor.getCurrentValue());

この例では、次が表示されます:

CompoundCursor position set to 5.
The current position of the CompoundCursor is 5.
Output 1 position = 2, value = CALENDAR_YEAR::MONTH::2001.04
Output 2 position = 2, value = PRODUCT_PRIMARY::ITEM::ENVY EXE
VC position = 1, value = 3107.65

queryCursorの位置は対称です。つまり、querySourceの結果セットには、各時間値に対して常に3つの製品値があります。 したがって、prodSelValueCursorは、timeSel ValueCursorの値ごとに常に3つの位置を持ちます。 timeSelの出力ValueCursorは、prodSel ValueCursorよりも遅くなります。

ただし、非対称の場合、ValueCursor内の位置の数は、変化の遅い出力に対して必ずしも同じとはかぎりません。 たとえば、月2001.10の製品ENVY ABMのユニットの価格がその日付までに販売されなくなったためにnullであり、問合せでnull値が抑制された場合、queryCursorの位置は11個のみになります。 prodSelValueCursorは、timeSelValueCursorの位置が4の場合、2つの位置のみを持ちます。

「例8-3」は、メジャー値の比較に基づいて1つのディメンションの要素を選択することによって生成される非対称の結果セットを示します。 この例では、「例8-1」と同じ製品および時間の選択を使用します。 Sourceは、製品、時間、販売チャネルおよび顧客ディメンション別にディメンション化された販売ユニットunitsのメジャーに使用します。 chanSelおよびcustSelオブジェクトは、ディメンションの単一の値の選択です。 この例では、SourcequerySource2を生成し、選択した時間、チャネルおよび顧客の値について、選択した製品のうち、複数のユニットを販売した製品を指定します。 querySource2は導出されたSourceであるため、この例では現在のTransactionをコミットします。

この例では、querySource2Cursorを作成し、CompoundCursorの位置をループし、最初の出力ValueCursorの位置と現在の値、およびCompoundCursorValueCursorを取得し、ValueCursorオブジェクトの位置と値を表示します。 getLocalValueメソッドは、一意の値からローカル値を抽出するプログラム内のメソッドです。

例8-3 非対称問合せでの位置

// Create the query
prodSel.join(chanSel).join(custSel).join(timeSel).select(units.gt(1));
 
// Commit the current Transaction.
try
{  // The DataProvider is dp.
  (dp.getTransactionProvider()).commitCurrentTransaction();
}
catch(Exception e)
{
  output.println("Cannot commit current Transaction " + e);
}

// Create the CursorManager and the Cursor.
CursorManager cursorManager = dp.createCursorManager(querySource2);
Cursor queryCursor2 = cursorManager.createCursor();

CompoundCursor rootCursor = (CompoundCursor) queryCursor2;
ValueCursor baseValueCursor = rootCursor.getValueCursor();
List outputs = rootCursor.getOutputs();
ValueCursor output1 = (ValueCursor) outputs.get(0);

// Get the positions and values and display them.
println("CompoundCursor  Output ValueCursor        ValueCursor");
println("  position      position  |  value    position  |  value");
do
{
  println(sp6 + rootCursor.getPosition() +  // sp6 is 6 spaces
          sp13 + output1.getPosition() +    // sp13 is 13 spaces
          sp7 + getLocalValue(output1.getCurrentString()) + //sp7 is 7 spaces
          sp7 + baseValueCursor.getPosition() +
          sp7 + getLocalValue(baseValueCursor.getCurrentString()));
}
while(queryCursor2.next());

この例によって、次のように表示されます。

CompoundCursor  Output ValueCursor        ValueCursor
  position      position |   value    position |   value
      1             1       2001.01       1       ENVY ABM
      2             1       2001.01       2       ENVY EXE
      3             1       2001.01       3       ENVY STD
      4             2       2001.04       1       ENVY ABM
      5             3       2001.07       1       ENVY ABM
      6             3       2001.07       2       ENVY EXE
      7             4       2001.10       1       ENVY EXE
      8             4       2001.10       2       ENVY STD

製品と時間の選択のすべての組合せで、指定されたチャネルおよび顧客の選択に対する単位売上が1より大きいわけではないため、prodSelから導出された値に対するValueCursorの要素の数は、出力ValueCursorの値ごとに同じではありません。 時間値2001.01の場合、3つの製品の販売数はすべて1を超えていますが、時間値2001.04の場合、販売数が1を超えている製品は1つのみです。 残りの2つの時間値2001.07と2001.10の場合、基準を満たす製品は2つです。 したがって、CompoundCursorValueCursorには、時間2001.01の3つの位置があり、時間2001.04の位置は1つのみで、時間2001.07および2001.10の2つの位置があります。

8.5.3 Cursor内での親の開始/終了位置

CompoundCursorから取得したデータの表示を効果的に管理するには、現在より低速な変化する値に対して、どのくらい速く変化する値が存在するかを知る必要があります。 たとえば、クロス集計で、キューブの1つのエッジの値を1つの行に表示する場合、その行に対して表示する列の数を把握する必要がある場合があります。

Cursorの現在の値に対して存在する変化の速い値の数を確認するには、その現在の値の開始位置と終了位置を親Cursorで検索します。 次に示すとおり、終了位置から開始位置を引き、1を足します。

long span = (cursor.getParentEnd() - cursor.getParentStart()) + 1;

結果は、親Cursorの子Cursorの現在の値の「スパン」で、現在の値に対して最も速く変化する子Cursorの値の数が示されます。 開始位置と終了位置の計算は、時間と計算リソースにコストがかかるため、アプリケーションで情報が必要なときにのみこれらの計算を実行するように指定する必要があります。

Oracle OLAP Java API Cursorを使用すると、アプリケーションで現在表示されているデータのみをクライアント・コンピュータ上に表示できます。 Cursorのデータ量を指定する方法の詳細は、フェッチ・サイズについてを参照してください。

ただし、クライアント・コンピュータ上のデータからは、親Cursorのどの位置で子Cursorの現在の値が開始または終了するかを判断できません。 その情報を取得するには、CursorgetParentStartおよびgetParentEndメソッドを使用します。

Oracle OLAPが親Cursorの子Cursorの値の開始位置と終了位置を計算するように指定するには、Cursorに対応するCursorSpecificationsetParentStartCalculationSpecifiedメソッドおよびsetParentEndCalculationSpecifiedメソッドをコールします。 CursorSpecificationisParentStartCalculationSpecifiedメソッドまたはisParentEndCalculationSpecifiedメソッドをコールして、開始位置または終了位置の計算を指定するかどうかを決定できます。 これらの計算の指定例は、「問合せ結果の取得中」を参照してください。

8.5.4 Cursorのエクステントの概要

Cursorのエクステントは、変化の遅い出力に対する相対的な要素の合計数です。

エクステントは、たとえば、正しい列数や適切なサイズのスクロール・バーを表示するために使用できる情報です。 ただし、計算にはコストがかかる場合があります。 たとえば、キューブを表すSourceには、4つの出力が含まれる場合があります。 各出力には数百の値が含まれる場合があります。 出力セットのメジャーのすべてのNULL値およびゼロ値が結果セットから除外される場合、SourceCompoundCursorのエクステントを計算するために、Oracle OLAPはCompoundCursorを作成する前に結果領域全体を走査する必要があります。 エクステントを計算するように指定しない場合、Oracle OLAPは、Cursorのフェッチ・サイズおよびアプリケーションによる必要に応じて、キューブの出力によって定義された要素のセットのみをトラバースする必要があります。

Oracle OLAPでCursorのエクステントを計算するように指定するには、Cursorに対応するCursorSpecificationsetExtentCalculationSpecifiedメソッドをコールします。 エクステントを計算するかどうかは、CursorSpecificationisExtentCalculationSpecifiedメソッドをコールして決定できます。 Cursorのエクステントの計算を指定する例については、「問合せ結果の取得中」を参照してください。

8.6 フェッチ・サイズ

OLAP Java API Cursorは、Sourceの結果セット全体を表します。 ただし、Cursorは、Oracle OLAPから一度に結果セットの一部のみを取得するため、「仮想」 Cursorです。 CursorManagerは、仮想Cursorを管理し、アプリケーションが必要とするとおりにOracle OLAPから結果を取得します。 仮想Cursorを管理すると、CursorManagerによって、アプリケーションの負荷が大幅に軽減されます。

Cursorが単一のフェッチ操作で取得するデータの量は、Cursorに指定された「取得サイズ」によって決まります。 フェッチ・サイズを指定すると、アプリケーションがローカル・コンピュータにキャッシュする必要があるデータの量を制限し、データの表示方法の要件を満たすようにキャッシュをカスタマイズすることによってフェッチの効率を最大限に向上させることができます。

問合せの作成にParameterおよびパラメータ化されたSourceオブジェクトを使用して、Oracle OLAPが返す要素の数を調整することもできます。 Parameterオブジェクトの詳細は、「Sourceオブジェクトの理解」を参照してください。 パラメータ化されたSourceオブジェクトの使用例は、「Sourceメソッドを使用した問合せの作成」を参照してください。

SourceCursorManagerを作成すると、Oracle OLAPはルートCursorSpecificationでデフォルトのフェッチ・サイズを指定します。 デフォルトのフェッチ・サイズは、ルートCursorSpecificationsetDefaultFetchSizeメソッドを使用して変更できます。

同じCursorManagerから2つ以上のCursorオブジェクトを作成し、両方のCursorオブジェクトを同時に使用できます。 Cursorオブジェクトは、個別のデータ・キャッシュを使用するのではなく、CursorManagerによって管理されるデータを共有できます。

次の例は、問合せの結果を表とグラフの両方で表示するアプリケーションです。 アプリケーションは、SourceCursorManagerを作成します。 アプリケーションは、同じCursorManagerから2つの個別のCursorオブジェクトを作成します。1つは表ビュー用、もう1つはグラフ・ビュー用です。 これらの2つのビューは、同じ問合せを共有し、同じデータを表示しますが、その表示形式は異なります。

図8-4 1つのSourceとその値を異なるビューで表示する2つのCursor

この図は、Sourceオブジェクト、Cursorオブジェクトおよびビュー間の関係を示しています。

図8-4の説明が続きます
「図8-4 1つのSourceとその値を異なるビューで表示する2つのCursor」の説明