この章では、Oracle Databaseインスタンスへの接続方法、および既存のOracle OLAPメタデータ・オブジェクトの検出方法について説明します。項目は次のとおりです。
OLAP Java APIクライアント・アプリケーションでは、Oracle DatabaseインスタンスのOracle OLAPサーバーに接続するために、Sun社のJava Database Connectivity(JDBC)APIのOracle実装を使用します。Oracle OLAPへの接続を確立するためのOracle JDBCクラスは、Javaアーカイブ・ファイルojdbc5.jar
にあります。このファイルを取得する方法については、付録A「開発環境のセットアップ」を参照してください。
Oracle OLAPサーバーに接続する前に、次の要件を満たしていることを確認します。
Oracle DatabaseインスタンスがOLAPオプションを指定してインストールされ、実行されている。
接続に使用しているOracle DatabaseのユーザーIDが、データを格納しているリレーショナル・スキーマへのアクセス権を持つ。
Oracle JDBCおよびOLAP Java APIのjarファイルがアプリケーション開発環境に存在する。必要なjarファイルを設定する方法の詳細は、付録A「開発環境のセットアップ」を参照してください。
OLAPサーバーに接続するには、次の手順を実行します。
データベースへのJDBC接続を作成します。
DataProvider
およびUserSession
を作成します。
この項では、これらの手順の詳細を示します。
Oracle Databaseインスタンスへの接続を作成する方法の1つとして、oracle.jdbc.OracleDataSource
オブジェクトおよびoracle.jdbc.OracleConnection
オブジェクトを使用する方法があります。たとえば、次のコードでoracle.jdbc.OracleDataSource
を作成し、このオブジェクトのプロパティを設定して、OracleDataSource
からJDBC OracleConnection
オブジェクトを取得します。
OracleDataSource
のプロパティの値は、Properties
オブジェクトの値です。url
プロパティの形式は、jdbc:oracle:thin:@serverName:portNumber:sid
となります。ServerName
はOracle Databaseインスタンスが実行されているサーバーのホスト名、portNumber
はデータベースのTCP/IPリスナー・ポートの数、sid
はデータベース・インスタンスのシステム識別子(SID)です。
例3-1 JDBC OracleConnectionの取得
oracle.jdbc.OracleConnection conn = null; try { OracleDataSource ods = new OracleDataSource(); ods.setURL(props.getProperty("url")); ods.setUser(props.getProperty("user")); ods.setPassword(props.getProperty("password")); conn = (oracle.jdbc.OracleConnection) ods.getConnection(); } catch(SQLException e) { System.out.println("Connection attempt failed. " + e); }
この例の接続では、Oracle JDBC Thinドライバが使用されます。様々な方法でgetConnection
メソッドを使用して接続の特性を指定できます。Oracle Databaseインスタンスに接続する方法は他にもあります。Oracle JDBC接続の詳細は、『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。
OracleConnection
オブジェクトの取得後、OLAP Java APIのDataProvider
オブジェクトおよびUserSession
オブジェクトを作成できます。
次のコードでは、DataProvider
およびUserSession
を作成します。conn
オブジェクトは、例3-1のOracleConnection
です。
例3-2 DataProviderの作成
DataProvider dp = new DataProvider(); try { UserSession session = dp.createSession(conn); } catch(SQLException e) { System.out.println("Could not create a UserSession. " + e); }
DataProvider
を使用すると、MdmMetadataProvider
を取得できます(「MdmMetadataProviderの作成」を参照)。DataProvider
を使用すると、TransactionProvider
を取得し、Source
およびCursorManager
オブジェクトを作成できます(第5章「Sourceオブジェクトの理解」および第6章「Sourceメソッドを使用した問合せの作成」を参照)。
OLAP Java APIを利用して、アナリティック・ワークスペースのデータ、またはリレーショナル構造にあるデータにアクセスできます。このデータの集合は、アプリケーションのデータ・ストアです。
データ・ストアには潜在的に、MdmRootSchema
のすべてのサブスキーマが格納されています。ただし、アプリケーションの実行中に参照可能なデータ・ストアの範囲は、接続を確立した際に使用したユーザーIDに付与されるデータベース権限によって異なります。ユーザーには、MdmRootSchema
の下に存在するすべてのMdmDatabaseSchema
オブジェクトが表示されますが、MdmDatabaseSchema
が所有するオブジェクトは、ユーザーが該当メタデータ・オブジェクトへのアクセス権を持っている場合にのみ表示されます。アクセス権の付与方法およびオブジェクトのセキュリティについては、『Oracle OLAPユーザーズ・ガイド』を参照してください。
アプリケーションは、データ・ストア内のメタデータ・オブジェクトを使用して、データを判断します。これらのオブジェクトを使用して、使用可能なデータ、データの構造および特性を調べることができます。
したがって、接続後最初に実行する手順は使用可能なメタデータを検出することです。次に、選択または計算するデータ、およびその表示方法に関する選択肢を、エンド・ユーザーに提示できます。
アプリケーションでメタデータを検出した後は、通常、データの選択、計算および操作を行う問合せを作成します。このような方法でデータを処理するには、メタデータ・オブジェクトからSource
オブジェクトを取得する必要があります。Source
オブジェクトは問合せ用のデータを指定します。Source
オブジェクトの詳細は、第5章「Sourceオブジェクトの理解」を参照してください。
メタデータを調べる前に、アプリケーションがOracle OLAPへの接続を確立する必要があります(第4章「メタデータとアナリティック・ワークスペースの作成」を参照)。接続が確立されると、アプリケーションで次の処理が実行可能となります。
DataProvider
を作成します。
DataProvider
からMdmMetadataProvider
を取得します。
MdmMetadataProvider
からMdmRootSchema
を取得します。
すべてのMdmDatabaseSchema
オブジェクトを取得するか、個々のオブジェクトを取得します。
MdmDatabaseSchema
オブジェクトが所有するMdmCube
、MdmDimension
およびMdmOrganizationalSchema
オブジェクトを取得します。
次に、これらの手順の詳細を示します。
MdmMetadataProvider
は、MdmRootSchema
を提供することによって、データ・ストア内のメタデータへのアクセスを提供します。MdmMetadataProvider
を作成するには、DataProvider
を作成する必要があります(第4章「メタデータとアナリティック・ワークスペースの作成」を参照)。例3-4では、MdmMetadataProvider
を作成します。例の中のdp
は、DataProvider
です。
データ・ストア内のデータへのアクセスを提供するOracle OLAPメタデータ・オブジェクトは、MdmSchema
オブジェクトによって編成されます。最上位のMdmSchema
はMdmRootSchema
です。データ・ストア内のメタデータの調査では、最初にMdmRootSchema
を取得します。このMdmRootSchema
から、MdmDatabaseSchema
オブジェクトを取得できます。MdmRootSchema
は、データベース・ユーザーごとにMdmDatabaseSchema
を1つ持ちます。MdmDatabaseSchema
は、MdmDatabaseSchema
が所有するメタデータ・オブジェクトを編成するMdmOrganizationalSchema
オブジェクトを持つことができます。
例3-5では、MdmRootSchema
、その下にあるMdmDatabaseSchema
オブジェクト、さらにその下にあるMdmOrganizationalSchema
オブジェクトを取得する例を示します。
例3-5 MdmSchemaオブジェクトの取得
private void getSchemas(MdmMetadataProvider mp) { MdmRootSchema mdmRootSchema = (MdmRootSchema)mp.getRootSchema(); List<MdmDatabaseSchema> dbSchemas = mdmRootSchema.getDatabaseSchemas(); for(MdmDatabaseSchema mdmDBSchema : dbSchemas) { println(mdmDBSchema.getName()); getOrgSchemas(mdmDBSchema); } } private void getOrgSchemas(MdmSchema mdmSchema) { ArrayList orgSchemaList = new ArrayList(); if (mdmSchema instanceof MdmDatabaseSchema) { MdmDatabaseSchema mdmDBSchema = (MdmDatabaseSchema) mdmSchema; orgSchemaList = (ArrayList) mdmDBSchema.getOrganizationalSchemas(); } else if (mdmSchema instanceof MdmOrganizationalSchema) { MdmOrganizationalSchema mdmOrgSchema = (MdmOrganizationalSchema) mdmSchema; orgSchemaList = (ArrayList) mdmOrgSchema.getOrganizationalSchemas(); } if (orgSchemaList.size() > 0) { println("The MdmOrganizationalSchema subschemas of " + mdmSchema.getName() + " are:"); Iterator orgSchemaListItr = orgSchemaList.iterator(); while (orgSchemaListItr.hasNext()) { MdmOrganizationalSchema mdmOrgSchema = (MdmOrganizationalSchema) orgSchemaListItr.next(); println(mdmOrgSchema.getName()); getOrgSchemas(mdmOrgSchema); } } else { println(mdmSchema.getName() + " does not have any" + " MdmOrganizationalSchema subschemas."); } }
すべてのMdmDatabaseSchema
オブジェクトを取得するのではなく、個々のユーザーのスキーマを取得する場合、MdmRootSchema
のgetDatabaseSchema
メソッドを使用します。例3-6では、GLOBAL
ユーザーのMdmDatabaseSchema
を取得する例を示します。
MdmSchema
からは、格納されているすべてのサブスキーマ(MdmCube
、MdmPrimaryDimension
およびMdmMeasure
オブジェクト)を取得できます。また、MdmRootSchema
は、利用可能なすべてのMdmMeasure
オブジェクトのList
を持つMdmMeasureDimension
を持ちます。
特定のユーザーが所有しているすべてのディメンションおよびメソッドを表示する場合、そのユーザーのMdmDatabaseSchema
からディメンションおよびメジャーのリストを取得します。例3-7では、例3-6のMdmDatabaseSchema
からディメンションおよびメジャーを取得しています。このコードでは、各ディメンションおよびメジャーの名前を表示します。
例3-7 MdmDatabaseSchemaのディメンションおよびメジャーの取得
private void getObjects(MdmDatabaseSchema mdmGlobalSchema) { List dimList = mdmGlobalSchema.getDimensions(); String objName = mdmGlobalSchema.getName() + " schema"; getNames(dimList, "dimensions", objName); List measList = mdmGlobalSchema.getMeasures(); getNames(measList, "measures", objName); } private void getNames(List objectList, String objTypes, String objName) { println("The " + objTypes + " of the " + objName + " are:"); Iterator objListItr = objectList.iterator(); while (objListItr.hasNext()) { MdmObject mdmObj = (MdmObject) objListItr.next(); println(mdmObj.getName()); } }
例3-7の出力は、次のようになります。
The dimensions of the GLOBAL schema are: CHANNEL_AWJ CUSTOMER_AWJ PRODUCT_AWJ TIME_AWJ The measures of the GLOBAL schema are: UNIT_COST UNIT_PRICE UNITS SALES
あるMdmCube
に関連付けられているディメンションおよびメジャーのみを表示するには、MdmDatabaseSchema
のgetTopLevelObject
メソッドを使用してキューブを取得してから、そのキューブのディメンションおよびメジャーを取得します。例3-8では、例3-6のMdmDatabaseSchema
からMdmCube
を取得し、例3-7のgetNames
メソッドを使用して、キューブに関連付けられているディメンションおよびメジャーの名前を表示しています。
例3-8 MdmCubeのディメンションおよびメジャーの取得
private void getCubeObjects(MdmDatabaseSchema mdmGlobalSchema) { MdmCube mdmUnitsCube = (MdmCube) mdmGlobalSchema.getTopLevelObject("PRICE_CUBE_AWJ"); String objName = mdmUnitsCube.getName() + " cube"; List dimList = mdmUnitsCube.getDimensions(); getNames(dimList, "dimensions", objName); List<MdmMeasure> measList = mdmUnitsCube.getMeasures(); getNames(measList, "measures", objName); }
例3-8の出力は、次のようになります。
The dimensions of the PRICE_CUBE_AWJ cube are: TIME_AWJ PRODUCT_AWJ The measures of the PRICE_CUBE_AWJ cube are: UNIT_COST UNIT_PRICE
問合せの作成およびデータの表示に使用するメタデータ・オブジェクトを検出する際、アプリケーションでは通常、ディメンションに関連付けられたMdmAttribute
およびMdmPrimaryDimension
オブジェクトのMdmSubDimension
コンポーネントを取得します。この項では、ディメンションの属性およびコンポーネントを取得する例を示します。
MdmPrimaryDimension
は、1つ以上のコンポーネントMdmHierarchy
オブジェクトを持ちます。このオブジェクトは、ディメンションのgetHierarchies
メソッドをコールして取得できます。このメソッドによって、MdmHierarchy
オブジェクトのList
が戻されます。MdmPrimaryDimension
のレベルは、MdmDimensionLevel
オブジェクトによって表されます。
MdmHierarchy
は、MdmLevelHierarchy
である場合にMdmHierarchyLevel
オブジェクトを持ちます。このオブジェクトによって、MdmDimensionLevel
オブジェクトが関連付けられます。MdmHierarchyLevel
を取得するには、MdmLevelHierarchy
のgetHierarchyLevels
メソッドをコールします。
例3-9では、例3-6のMdmDatabaseSchema
からMdmPrimaryDimension
を取得し、ディメンションに関連付けられている階層およびレベルの名前を表示しています。
例3-9 ディメンションの階層およびレベルの取得
private void getHierarchiesAndLevels(MdmDatabaseSchema mdmGlobalSchema) { MdmPrimaryDimension mdmCustDim = (MdmPrimaryDimension) mdmGlobalSchema.getTopLevelObject("CUSTOMER_AWJ"); List<MdmHierarchy> hierList = mdmCustDim.getHierarchies(); println("The hierarchies of the dimension are:"); for (MdmHierarchy mdmHier : hierList) { println(mdmHier.getName()); if (mdmHier instanceof MdmLevelHierarchy) { MdmLevelHierarchy mdmLevelHier = (MdmLevelHierarchy) mdmHier; List<MdmHierarchyLevel> hierLevelList = mdmLevelHier.getHierarchyLevels(); println(" The levels of the hierarchy are:"); for (MdmHierarchyLevel mdmHierLevel : hierLevelList) { println(" " + mdmHierLevel.getName()); } } } }
例3-9の出力は、次のようになります。
The hierarchies of the dimension are: SHIPMENTS The levels of the hierarchy are: TOTAL_CUSTOMER REGION WAREHOUSE SHIP_TO MARKETS The levels of the hierarchy are: TOTAL_MARKET MARKET_SEGMENT ACCOUNT SHIP_TO
MdmPrimaryDimension
、およびその階層とレベルは、関連付けられたMdmAttribute
オブジェクトを持ちます。ディメンション、階層またはレベルのgetAttributes
メソッドをコールすることによって、属性の多くを取得できます。このメソッドによって、MdmAttribute
オブジェクトのList
が戻されます。MdmPrimaryDimension
またはMdmHierarchy
の適切なメソッドをコールすることによって、簡単な説明属性、詳細な説明属性または親属性など、特定の属性を取得できます。
例3-10に、MdmPrimaryDimension
のMdmAttribute
オブジェクトを取得する例を示します。ここでは親属性も取得します。この例は、MdmAttribute
オブジェクトの名前を表示します。
例3-10 MdmPrimaryDimensionのMdmAttributeオブジェクトの取得
private void getAttributes(MdmDatabaseSchema mdmGlobalSchema) { MdmTimeDimension mdmTimeDim = (MdmTimeDimension) mdmGlobalSchema.getTopLevelObject("TIME_AWJ"); List attrList = mdmTimeDim.getAttributes(); Iterator attrListItr = attrList.iterator(); println("The MdmAttribute objects of " + mdmTimeDim.getName() + " are:"); while (attrListItr.hasNext()) { MdmAttribute mdmAttr = (MdmAttribute) attrListItr.next(); println(" " + mdmAttr.getName()); } MdmAttribute mdmParentAttr = mdmTimeDim.getParentAttribute(); println("The parent attribute is " + mdmParentAttr.getName() + "."); }
例3-10の出力は、次のようになります。
The MdmAttribute objects of TIME_AWJ are: LONG_DESCRIPTION SHORT_DESCRIPTION END_DATE TIME_SPAN The parent attribute is PARENT_ATTRIBUTE.
メタデータ・オブジェクトはデータセットを表しますが、そのデータへの問合せを作成する機能は提供しません。このオブジェクトは情報のメタデータであり、データの存在、構造および特性を記録するものです。データ値へのアクセスは提供しません。
アプリケーションは、メタデータ・オブジェクトのデータ値にアクセスするために、そのメタデータ・オブジェクトのSource
オブジェクトを取得します。メタデータ・オブジェクトのSource
を、プライマリSource
といいます。
アプリケーションは、メタデータ・オブジェクトのプライマリSource
を取得するために、そのメタデータ・オブジェクトのgetSource
メソッドをコールします。たとえば、アプリケーションで1999年の製品の販売台数を表示する必要がある場合、そのデータのMdmMeasure
(次の例のmdmUnits
)のgetSource
メソッドを使用する必要があります。
例3-11 メタデータ・オブジェクトのプライマリSourceの取得
Source units = mdmUnits.getSource();
プライマリSource
オブジェクトの取得および処理の詳細は、第5章「Sourceオブジェクトの理解」を参照してください。