8 CursorクラスおよびCursorの概念
この章では、Oracle OLAP Java API Cursor
クラスと、問合せの結果の取得に使用する関連クラスについて説明します。 この章では、位置、フェッチ・サイズおよびエクステントのCursor
の概念についても説明します。 Cursor
とその関連オブジェクトの作成および使用の例は、「問合せ結果の取得中」を参照してください。
この章では、次の項目について説明します。
8.1 OLAP Java API Cursorオブジェクトの概要
Cursor
は、Source
で指定された結果セットを取得します。 Cursor
を作成するには、CursorManager
のcreateCursor
メソッドをコールします。 CursorManager
を作成するには、DataProvider
のcreateCursorManager
メソッドをコールします。
Cursor
を作成せずに、Oracle OLAP SQLジェネレータによってSource
に対して生成されたSQLを取得できます。 Source
のSQLを取得するには、DataProvider
のcreateSQLCursorManager
メソッドを使用してSQLCursorManager
を作成します。 次に、OLAP Java API外部のクラス、またはその他のメソッドを使用して、生成されたSQLを使用してデータを取得します。
8.1.1 Cursorの作成
DataProvider
のcreateCursorManager
メソッドのいずれかをコールし、Source
を渡して、CursorManager
を作成します。Cursor
の動作を変更する場合は、CursorInfoSpecification
を作成し、そのメソッドを使用して動作を指定できます。 次に、Source
およびCursorInfoSpecification
を取得するメソッドを使用してCursorManager
を作成します。CursorManager
のcreateCursor
メソッドをコールして、Cursor
を作成します。
親トピック: OLAP Java APIカーソル・オブジェクトの概要
8.1.2 Cursorを作成できないSource
一部のSource
オブジェクトでは、Cursor
がデータ・ストアから取得できるデータは指定されません。 次に、値を含むCursor
を作成できないSource
オブジェクトを示します。
-
計算不可能な操作を指定する
Source
。 例として、無限再帰を指定するSource
があります。 -
無限の結果セットを定義する
Source
。 例として、すべてのString
オブジェクトのセットを表す基本的なSource
があります。 -
要素がないか、要素がない別の
Source
を含むSource
。 たとえば、DataProvider
のgetEmptySource
メソッドによって戻されるSource
と、空のSource
から導出される別のSource
です。 別の例として、MdmDimension
から取得したプライマリSource
から値を選択した結果、選択した値がディメンションに存在しない導出Source
があります。
そのようなSource
に対してCursor
を作成し、Cursor
の値を取得しようとすると、Exception
が発生します。
親トピック: OLAP Java APIカーソル・オブジェクトの概要
8.1.3 CursorオブジェクトおよびTransactionオブジェクト
導出されたSource
を作成するか、Template
の状態を変更する場合は、現在のTransaction
のコンテキストでSource
を作成します。 Source
は、作成したTransaction
、またはそのTransaction
の子Transaction
でアクティブです。 Cursor
を作成するには、Source
が現在のTransaction
でアクティブである必要があります。
導出されたSource
の作成は、書込みTransaction
で行われます。 Cursor
の作成は、読取りTransaction
で行われます。 導出されたSource
を作成した後で、そのSource
のCursor
を作成する前に、アプリケーションが使用しているTransactionProvider
のcommitCurrentTransaction
メソッドをコールして、書込みTransaction
を読み込みTransaction
に変更する必要があります。 Transaction
およびTransactionProvider
オブジェクトの詳細は、「TransactionProviderの使用」を参照してください。
パラメータ化されたSource
を含む問合せ用に作成するCursor
の場合、Parameter
オブジェクトの値を変更してから、Transaction
を再度コミットすることなく、Cursor
の新しい値を取得できます。 パラメータ化されたSource
オブジェクトの詳細は、「Sourceオブジェクトの理解」を参照してください。
親トピック: OLAP Java APIカーソル・オブジェクトの概要
8.2 Cursorクラス
oracle.olapi.data.cursor
パッケージでは、Oracle OLAP Java APIによって、次の表で説明するインタフェースが定義されます。
インタフェース | 説明 |
---|---|
|
現在の位置の概念をカプセル化する抽象スーパークラス。 |
|
現在の位置の値を持つ |
|
子 |
8.2.1 Cursorの構造
Cursor
の構造は、それに関連付けられたSource
の構造を反映します。 Source
に出力がない場合、そのSource
のCursor
はValueCursor
です。 Source
に1つ以上の出力がある場合、そのSource
のCursor
はCompoundCursor
です。 CompoundCursor
は、CompoundCursor
のSource
のベースの値を持つベースValueCursor
と、1つ以上の出力Cursor
オブジェクトを子として持ちます。
Source
の出力は、別のSource
です。 出力Source
自体に出力を含めることができます。 Source
の出力の子Cursor
は、出力Source
に出力がない場合はValueCursor
、出力する場合はCompoundCursor
です。
「例8-1」は、選択した月の選択した製品アイテムの価格を指定する問合せを作成します。 この例では、timeHier
は時間値のディメンションの階層のSource
で、prodHier
は製品値のディメンションの階層のSource
です。
prodSel
またはtimeSel
のCursor
を作成する場合、prodSel
とtimeSel
の両方に出力がないため、Cursor
はValueCursor
になります。
unitPrice
オブジェクトは、製品ユニットの価格の値を表すMdmBaseMeasure
のSource
です。 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
で定義された結果セットは、選択した月の選択した製品の単価値です。 結果は出力別に整理されます。 timeSel
はunitPrice.join(prodSel)
操作によって生成されるSource
に結合されるため、timeSel
は変化の遅い出力です。つまり、結果セットでは、選択した各時間値について選択された製品のセットが指定されます。 時間値ごとに結果セットに3つの製品値があるため、製品値は時間値より速く変化します。 querySource
のベースValueCursor
の値は、毎日製品ごとに1つの価格値があるため、最も速く変化します。
「問合せ結果の取得中」の「例9-1」は、querySource
のCursor
、queryCursor
を作成します。 querySource
には出力があるため、queryCursor
はCompoundCursor
です。 queryCursor
のベースValueCursor
には、querySource
を作成した操作のベースSource
であるunitPrice
の値があります。 unitPrice
の値は、出力によって指定された値です。 queryCursor
の出力は、prodSel
からの値を持つValueCursor
と、timeSel
からの値を持つValueCursor
です。
図8-1 CompoundCursorであるqueryCursorの構造
この図は、queryCursor
の構造を示しています。 ベースValueCursor
および2つの出力ValueCursor
オブジェクトは、親CompoundCursor
であるqueryCursor
の子です。

「図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
インタフェースを実装するクラスのインスタンスは、直接的または間接的に作成できます。
DataProvider
のcreateCursorInfoSpecification
メソッドをコールして、Source
のCursorSpecification
を作成できます。 このメソッドは、CompoundCursorSpecification
またはValueCursorSpecification
を返します。 CursorSpecification
のメソッドを使用して、Cursor
の動作の側面を指定できます。 CursorSpecification
を使用してCursorManager
を作成するには、DataProvider
のcreateCursorManager
メソッドにcursorInfoSpec
引数として渡します。
CursorSpecification
メソッドを使用すると、次のことができます:
-
CursorSpecification
に対応するSource
を取得します。 -
対応する
Cursor
のデフォルト・フェッチ・サイズを取得または設定します。 -
Oracle OLAPが
Cursor
のエクステントを計算するように指定します。 -
エクステントの計算が指定されているかどうかを判断できます。
-
Oracle OLAPが、親
Cursor
の対応するCursor
の現在の値の開始位置または終了位置を計算するように指定します。 親の値の開始位置と終了位置がわかっている場合は、その値に対して親Cursor
が持つ、より速く変化する要素の数を決定できます。 -
親の対応する
Cursor
の現在の値の開始位置または終了位置を計算するかどうかを決定します。 -
CursorSpecificationVisitor
を受け入れます。
詳細は、「カーソルの位置とエクステントについて」および「フェッチ・サイズについて」を参照してください。
oracle.olapi.data.source
パッケージでは、Oracle OLAP Java APIによって、次の表で説明するクラスが定義されます。
インタフェース | 説明 |
---|---|
|
|
|
|
|
1つ以上の出力を含む |
|
|
|
値を持ち、出力がない |
|
|
Cursor
の構造は、CursorSpecification
と同じです。 各ValueCursorSpecification
またはCompoundCursorSpecification
には、対応するValueCursor
またはCompoundCursor
があります。 Cursor
から特定の情報または動作を取得できるようにするには、アプリケーションは、Cursor
を作成する前に、対応するCursorSpecification
のメソッドをコールして、その情報または動作が必要であることを指定する必要があります。
親トピック: カーソル・クラスおよび概念の理解
8.4 CursorManagerクラス
CursorManager
を使用すると、Source
のCursor
を作成できます。 DataProvider
のcreateCursorManager
メソッドのいずれかによって返されるクラスは、作成するCursor
オブジェクトのデータのバッファリングを管理します。
同じCursorManager
から複数のCursor
を作成できます。これは、結果セットのデータを表やグラフなどの様々な形式で表示する場合に役立ちます。 CursorManager
で作成されたすべてのCursor
オブジェクトには、デフォルトのフェッチ・サイズなど、同じ指定があります。 Cursor
オブジェクトは同じ仕様であるため、CursorManager
によって管理されるデータを共有できます。
SQLCursorManager
には、Source
に対してOracle OLAP SQLジェネレータによって生成されたSQLを戻すメソッドがあります。 DataProvider
のcreateSQLCursorManager
またはcreateSQLCursorManagers
メソッドをコールして、1つ以上のSQLCursorManager
オブジェクトを作成します。 SQLCursorManager
を使用してCursor
を作成することはありません。 かわりに、SQLCursorManager
によって返されたSQLをOLAP Java APIの外部のクラスとともに使用するか、または問合せで指定されたデータを取得します。
8.4.1 CursorManagerのCursorInfoSpecificationの更新
アプリケーションでOLAP Java API Template
オブジェクトを使用していて、Template
の状態がTemplate
によって生成されるSource
の構造を変更する方法で変更された場合、Source
のCursorInfoSpecification
オブジェクトは無効になります。 変更されたSource
に対して新しいCursorInfoSpecification
オブジェクトを作成する必要があります。
新しいCursorInfoSpecification
を作成した後、Source
の新しいCursorManager
を作成できます。 ただし、新しいCursorManager
を作成する必要はありません。 既存のCursorManager
のupdateSpecification
メソッドをコールして、前のCursorInfoSpecification
を新しいCursorInfoSpecification
に置き換えることができます。 その後、CursorManager
から新しいCursor
を作成できます。
親トピック: CursorManagerクラス
8.5 Cursorの位置およびエクステント
Cursor
には1つ以上の位置があります。 Cursor
の「現在の位置」は、Cursor
で現在アクティブな位置です。 Cursor
の現在の位置を移動するには、Cursor
のsetPosition
メソッドまたはnext
メソッドをコールします。
Oracle OLAPは、getCurrentValue
メソッドのコールなど、Cursor
に対して操作を試行するまで、Cursor
に設定した位置を検証しません。 現在の位置を負の値またはCursor
内の位置数より大きい値に設定し、Cursor
操作を試行すると、Cursor
はPositionOutOfBoundsException
をスローします。
Cursor
のエクステントについては、「カーソルの範囲とは何ですか。」を参照してください。
8.5.1 ValueCursorの位置
ValueCursor
の現在の位置は、取得可能な値を指定します。 たとえば、prodSel
(「カーソルの構造」で説明されている派生Source
)は、製品のディメンションとその階層グループ化を指定するプライマリSource
から3つの製品を選択したものです。 prodSel
のValueCursor
には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」で作成されたSource
のquerySource
は、メジャーunitPrice
の値を持ちます。 これらの値は、異なる時点での製品の単位価格です。 querySource
の出力は、時間ディメンションから4か月の値、および製品ディメンションから3つの製品値を選択するSource
オブジェクトです。
querySource
の結果セットには、タプルごとに1つのメジャー値(各出力値のセット)があるため、値の合計数は12です(4か月ごとに3つの製品のそれぞれに1つの値)。 したがって、querySource
用に作成されたqueryCursor
CompoundCursor
には12個の位置があります。
queryCursor
の各位置は、出力の1つの位置セットとValueCursor
のベースを指定します。 たとえば、queryCursor
の位置1は、出力およびベースValueCursor
に対して次の位置セットを定義します:
-
出力1の位置1 (
timeSel
のValueCursor
) -
出力2の位置1 (
prodSel
のValueCursor
) -
queryCursor
のベースValueCursor
の位置1 (この位置は、出力の値で指定されたunitPrice
メジャーの値を持ちます。)
図8-2 queryCursor内のCursorの位置
この例では、queryCursor
CompoundCursor
、ベースValueCursor
、および出力の位置を示します。

「図8-2 queryCursor内のCursorの位置」の説明
queryCursor
のValueCursor
の位置は1つのみです。これは、出力の1つの値セットによってunitPrice
の値が1つのみ指定されるためです。 querySource
などの問合せの場合、Cursor
のValueCursor
の値は1つのみであるため、ルートCompoundCursor
の任意の1つの位置に対して一度に1つの位置のみを持ちます。
図8-3 queryCursorのクロス集計の表示
この図は、queryCursor
のデータの表示の1つを示しています。 これは、4つの列および5つの行で構成されたクロス集計ビューです。 左の列は日付値です。 一番上の行は製品値です。 クロス集計の交差している各セルは、その月の製品の価格です。

「図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つの製品値があります。 したがって、prodSel
のValueCursor
は、timeSel
ValueCursor
の値ごとに常に3つの位置を持ちます。 timeSel
の出力ValueCursor
は、prodSel
ValueCursor
よりも遅くなります。
ただし、非対称の場合、ValueCursor
内の位置の数は、変化の遅い出力に対して必ずしも同じとはかぎりません。 たとえば、月2001.10の製品ENVY ABMのユニットの価格がその日付までに販売されなくなったためにnullであり、問合せでnull値が抑制された場合、queryCursor
の位置は11個のみになります。 prodSel
のValueCursor
は、timeSel
のValueCursor
の位置が4の場合、2つの位置のみを持ちます。
「例8-3」は、メジャー値の比較に基づいて1つのディメンションの要素を選択することによって生成される非対称の結果セットを示します。 この例では、「例8-1」と同じ製品および時間の選択を使用します。 Source
は、製品、時間、販売チャネルおよび顧客ディメンション別にディメンション化された販売ユニットunits
のメジャーに使用します。 chanSel
およびcustSel
オブジェクトは、ディメンションの単一の値の選択です。 この例では、Source
、querySource2
を生成し、選択した時間、チャネルおよび顧客の値について、選択した製品のうち、複数のユニットを販売した製品を指定します。 querySource2
は導出されたSource
であるため、この例では現在のTransaction
をコミットします。
この例では、querySource2
のCursor
を作成し、CompoundCursor
の位置をループし、最初の出力ValueCursor
の位置と現在の値、およびCompoundCursor
のValueCursor
を取得し、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つです。 したがって、CompoundCursor
のValueCursor
には、時間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
の現在の値が開始または終了するかを判断できません。 その情報を取得するには、Cursor
のgetParentStart
およびgetParentEnd
メソッドを使用します。
Oracle OLAPが親Cursor
の子Cursor
の値の開始位置と終了位置を計算するように指定するには、Cursor
に対応するCursorSpecification
のsetParentStartCalculationSpecified
メソッドおよびsetParentEndCalculationSpecified
メソッドをコールします。 CursorSpecification
のisParentStartCalculationSpecified
メソッドまたはisParentEndCalculationSpecified
メソッドをコールして、開始位置または終了位置の計算を指定するかどうかを決定できます。 これらの計算の指定例は、「問合せ結果の取得中」を参照してください。
親トピック: カーソルの位置とエクステントについて
8.5.4 Cursorのエクステントの概要
Cursor
のエクステントは、変化の遅い出力に対する相対的な要素の合計数です。
エクステントは、たとえば、正しい列数や適切なサイズのスクロール・バーを表示するために使用できる情報です。 ただし、計算にはコストがかかる場合があります。 たとえば、キューブを表すSource
には、4つの出力が含まれる場合があります。 各出力には数百の値が含まれる場合があります。 出力セットのメジャーのすべてのNULL値およびゼロ値が結果セットから除外される場合、Source
のCompoundCursor
のエクステントを計算するために、Oracle OLAPはCompoundCursor
を作成する前に結果領域全体を走査する必要があります。 エクステントを計算するように指定しない場合、Oracle OLAPは、Cursor
のフェッチ・サイズおよびアプリケーションによる必要に応じて、キューブの出力によって定義された要素のセットのみをトラバースする必要があります。
Oracle OLAPでCursor
のエクステントを計算するように指定するには、Cursor
に対応するCursorSpecification
のsetExtentCalculationSpecified
メソッドをコールします。 エクステントを計算するかどうかは、CursorSpecification
のisExtentCalculationSpecified
メソッドをコールして決定できます。 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メソッドを使用した問合せの作成」を参照してください。
Source
のCursorManager
を作成すると、Oracle OLAPはルートCursorSpecification
でデフォルトのフェッチ・サイズを指定します。 デフォルトのフェッチ・サイズは、ルートCursorSpecification
のsetDefaultFetchSize
メソッドを使用して変更できます。
同じCursorManager
から2つ以上のCursor
オブジェクトを作成し、両方のCursor
オブジェクトを同時に使用できます。 Cursor
オブジェクトは、個別のデータ・キャッシュを使用するのではなく、CursorManager
によって管理されるデータを共有できます。
次の例は、問合せの結果を表とグラフの両方で表示するアプリケーションです。 アプリケーションは、Source
のCursorManager
を作成します。 アプリケーションは、同じCursorManager
から2つの個別のCursor
オブジェクトを作成します。1つは表ビュー用、もう1つはグラフ・ビュー用です。 これらの2つのビューは、同じ問合せを共有し、同じデータを表示しますが、その表示形式は異なります。
図8-4 1つのSourceとその値を異なるビューで表示する2つのCursor
この図は、Source
オブジェクト、Cursor
オブジェクトおよびビュー間の関係を示しています。

「図8-4 1つのSourceとその値を異なるビューで表示する2つのCursor」の説明
親トピック: カーソル・クラスおよび概念の理解