3 メタデータの検出
この章では、Oracle Databaseインスタンスへの接続方法、および既存のOracle OLAPメタデータ・オブジェクトの検出方法について説明します。 項目は次のとおりです。
3.1 Oracle OLAPへの接続
Oracle DatabaseインスタンスでOracle OLAPサーバーに接続するために、OLAP Java APIクライアント・アプリケーションは、Java Database Connectivity (JDBC) APIのOracle実装を使用します。 Oracle OLAPへの接続を確立するために使用するOracle JDBCクラスは、Javaアーカイブ・ファイルojdbc6.jar
にあります。 そのファイルの取得の詳細は、「開発環境の設定」を参照してください。
次のトピックでは、Oracle OLAPへの接続の作成について説明します。
3.1.1 接続の前提条件
Oracle OLAPサーバーに接続する前に、次の要件を満たしていることを確認します。
-
Oracle DatabaseインスタンスがOLAPオプションを指定してインストールされ、実行されている。
-
接続に使用しているOracle DatabaseのユーザーIDが、データを格納しているリレーショナル・スキーマへのアクセス権を持つ。
-
Oracle JDBCおよびOLAP Java APIのjarファイルがアプリケーション開発環境に存在する。 必要なjarファイルの設定の詳細は、「開発環境の設定」を参照してください。
親トピック: Oracle OLAPへの接続
3.1.2 接続の確立
OLAPサーバーに接続するには、次のステップを実行します。
- データベースへのJDBC接続を作成します。
DataProvider
およびUserSession
を作成します。
これらのステップは、次の各トピックで説明します。
3.1.2.1 JDBC接続の作成
Oracle Databaseインスタンスへの接続を作成する1つの方法は、oracle.jdbc.OracleDataSource
およびoracle.jdbc.OracleConnection
オブジェクトを使用することです。 たとえば、次のコードでは、oracle.jdbc.OracleDataSource
を作成し、オブジェクトのプロパティを設定し、OracleDataSource
からJDBC OracleConnection
オブジェクトを取得します。
OracleDataSource
のプロパティの値は、java.util.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
オブジェクトを作成できます。
親トピック: 接続の確立
3.1.2.2 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オブジェクトの理解」および「Sourceメソッドを使用した問合せの作成」の説明に従ってSource
およびCursorManager
オブジェクトを作成します。
親トピック: 接続の確立
3.1.3 DataProviderおよび接続のクローズ
OLAP Java APIの使用が終了しても、データベースへのJDBC接続で作業を続行する場合は、DataProvider
のclose
メソッドを使用してOLAP Java APIリソースを解放します。
dp.close(); // dp is the DataProvider
例3-3 接続のクローズ
try { conn.close(); // conn is the OracleConnection } catch(SQLException e) { System.out.println("Cannot close the connection. " + e); }
親トピック: Oracle OLAPへの接続
3.2 メタデータの検出手順の概要
OLAP Java APIを利用して、アナリティック・ワークスペースのデータ、またはリレーショナル構造にあるデータにアクセスできます。 このデータの集合は、アプリケーションのデータ・ストアです。
データ・ストアには、MdmRootSchema
のすべてのサブスキーマが含まれている可能性があります。 ただし、アプリケーションの実行中に参照可能なデータ・ストアの範囲は、接続を確立した際に使用したユーザーIDに付与されるデータベース権限によって異なります。 ユーザーは、MdmRootSchema
の下に存在するすべてのMdmDatabaseSchema
オブジェクトを表示できますが、ユーザーがメタデータ・オブジェクトに対するアクセス権を持っている場合のみ、MdmDatabaseSchema
によって所有されているオブジェクトを表示できます。
次のトピックでは、メタデータの検出について説明します。
親トピック: メタデータの検出
3.2.1 メタデータ検出の目的
アプリケーションは、データ・ストア内のメタデータ・オブジェクトを使用して、データを判断します。 これらのオブジェクトを使用して、使用可能なデータ、データの構造および特性を調べることができます。
したがって、接続後最初に実行するステップは使用可能なメタデータを検出することです。 次に、選択または計算するデータ、およびその表示方法に関する選択肢を、エンド・ユーザーに提示できます。
アプリケーションは、メタデータを検出した後、通常、データの選択、計算、その他の操作を行うための問合せを作成します。 このような方法でデータを操作するには、メタデータ・オブジェクトからSource
オブジェクトを取得する必要があります。 これらのSource
オブジェクトは、問合せ対象のデータを指定します。 Source
オブジェクトの詳細は、「Sourceオブジェクトの理解」を参照してください。
親トピック: メタデータの検出手順の概要
3.2.2 メタデータの検出ステップ
メタデータを調査する前に、アプリケーションでOracle OLAPに接続する必要があります。 そうすると、アプリケーションで次のステップが実行可能となります。
DataProvider
を作成します。DataProvider
からMdmMetadataProvider
を取得します。MdmMetadataProvider
からMdmRootSchema
を取得します。- すべての
MdmDatabaseSchema
オブジェクトを取得するか、個々のオブジェクトを取得します。 MdmDatabaseSchema
オブジェクトが所有するMdmCube
、MdmDimension
およびMdmOrganizationalSchema
オブジェクトを取得します。
次のトピックでは、これらのステップについて詳しく説明します。
親トピック: メタデータの検出手順の概要
3.3 MdmMetadataProviderの作成
MdmMetadataProvider
では、MdmRootSchema
を指定して、データ・ストア内のメタデータにアクセスできます。 MdmMetadataProvider
を作成する前に、「メタデータおよびアナリティク・ワークスペースの作成」の説明に従ってDataProvider
を作成する必要があります。 「例3-4」は、MdmMetadataProvider
を作成します。 この例では、dp
はDataProvider
です。
例3-4 MdmMetadataProviderの作成
MdmMetadataProvider mp = null; try { mp = (MdmMetadataProvider) dp.getMdmMetadataProvider(); } catch (Exception e) { println("Cannot get the MDM metadata provider. " + e); }
親トピック: メタデータの検出
3.4 MdmSchemaオブジェクトの取得
データ・ストア内のデータへのアクセスを提供するOracle OLAPメタデータ・オブジェクトは、MdmSchema
オブジェクトによって編成されます。 最上位レベルのMdmSchema
は、MdmRootSchema
です。 MdmRootSchema
を取得することは、データ・ストア内のメタデータを探索する最初のステップです。 MdmRootSchema
から、MdmDatabaseSchema
オブジェクトを取得できます。 MdmRootSchema
には、データベース・ユーザーごとにMdmDatabaseSchema
があります。 MdmDatabaseSchema
には、MdmDatabaseSchema
が所有するメタデータ・オブジェクトを編成するMdmOrganizationalSchema
オブジェクトを含めることができます。
例3-5 MdmSchemaオブジェクトの取得
この例では、MdmRootSchema
、その下にあるMdmDatabaseSchema
オブジェクトおよびそれらの下にあるMdmOrganizationalSchema
オブジェクトを取得する方法を示します。
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."); } }
例3-6 単一のMdmDatabaseSchemaの取得
すべてのMdmDatabaseSchema
オブジェクトを取得するのではなく、MdmRootSchema
のgetDatabaseSchema
メソッドを使用して、個々のユーザーのスキーマを取得できます。 この例では、GLOBALユーザーのMdmDatabaseSchema
を取得する方法を示します。
MdmDatabaseSchema mdmGlobalSchema = mdmRootSchema.getDatabaseSchema("GLOBAL");
親トピック: メタデータの検出
3.5 MdmSchemaのコンテンツの取得
MdmSchema
から、それに含まれるすべてのサブスキーマ、MdmCube
、MdmPrimaryDimension
およびMdmMeasure
オブジェクトを取得できます。 また、MdmRootSchema
には、使用可能なすべてのMdmMeasure
オブジェクトのList
を持つMdmMeasureDimension
があります。
特定のユーザーが所有するすべてのディメンションおよびメソッドを表示する場合は、そのユーザーのMdmDatabaseSchema
からディメンションおよびメジャーのリストを取得できます。
例3-7 MdmDatabaseSchemaのディメンションおよびメジャーの取得
この例では、「例3-6」から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()); } }
この例の出力は次のようになります。
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 SALES UNITS COST
例3-8 MdmCubeのディメンションおよびメジャーの取得
MdmCube
に関連付けられているディメンションおよびメジャーのみを表示するには、MdmDatabaseSchema
のfindOrCreateCube
メソッドを使用してキューブを取得し、キューブのディメンションおよびメジャーを取得します。 この例では、「例3-6」のMdmDatabaseSchema
からMdmCube
を取得し、「例3-7」のgetNames
メソッドを使用して、それに関連付けられたディメンションおよびメジャーの名前を表示します。
private void getCubeObjects(MdmDatabaseSchema mdmGlobalSchema) { MdmCube mdmUnitsCube = (MdmCube) mdmGlobalSchema.findOrCreateCube("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); }
この例の出力は次のようになります。
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
親トピック: メタデータの検出
3.6 MdmPrimaryDimensionに含まれるオブジェクトの取得
問合せの作成およびデータの表示に使用するメタデータ・オブジェクトの検出では、通常、アプリケーションは、ディメンションに関連付けられているMdmPrimaryDimension
およびMdmAttribute
オブジェクトのMdmSubDimension
コンポーネントを取得します。 次のトピックでは、ディメンションのコンポーネントおよび属性の取得について説明します。
3.6.1 MdmPrimaryDimensionの階層とレベルの取得
MdmPrimaryDimension
には、ディメンションのgetHierarchies
メソッドをコールして取得できる、0個以上のコンポーネントMdmHierarchy
オブジェクトがあります。 このメソッドは、MdmHierarchy
オブジェクトのList
を返します。 MdmPrimaryDimension
のレベルは、MdmDimensionLevel
オブジェクトで表されます。
MdmHierarchy
がMdmLevelHierarchy
の場合、MdmDimensionLevel
オブジェクトを関連付けるMdmHierarchyLevel
オブジェクトがあります。 MdmHierarchyLevel
オブジェクトを取得するには、MdmLevelHierarchy
のgetHierarchyLevels
メソッドをコールします。
例3-9 ディメンションの階層およびレベルの取得
この例では、「例3-6」のMdmDatabaseSchema
からMdmPrimaryDimension
を取得し、階層の名前とそれに関連付けられたレベルを表示します。
private void getHierarchiesAndLevels(MdmDatabaseSchema mdmGlobalSchema) { MdmPrimaryDimension mdmCustDim = (MdmPrimaryDimension) mdmGlobalSchema.findOrCreateStandardDimension("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
3.6.2 MdmPrimaryDimensionの属性の取得
MdmPrimaryDimension
とその階層およびレベルには、MdmAttribute
オブジェクトが関連付けられています。 ディメンション、階層またはレベルのgetAttributes
メソッドをコールすることで、多くの属性を取得できます。 このメソッドは、アプリケーションがMdmPrimaryDimension
に明示的に追加または指定されたMdmAttribute
オブジェクトのList
を返します。 MdmPrimaryDimension
またはMdmHierarchy
の適切なメソッドをコールすることで、短い説明属性や長い説明属性、親属性などの特定の属性を取得できます。
例3-10 MdmPrimaryDimensionのMdmAttributeオブジェクトの取得
この例では、MdmPrimaryDimension
のMdmAttribute
オブジェクトを取得する方法を示します。 ここでは親属性も個別に取得します。 この例では、MdmAttribute
オブジェクトの名前を表示します。 _LD
および_SD
で終わる属性名は、「OLAPビューへの階層属性値の移入」で説明されているように、MdmHierarchyLevel
オブジェクトに追加される属性です。
private void getAttributes(MdmDatabaseSchema mdmGlobalSchema) { MdmTimeDimension mdmTimeDim = (MdmTimeDimension) mdmGlobalSchema.findOrCreateTimeDimension("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() + "."); }
この例の出力は次のようになります。
The MdmAttribute objects of TIME_AWJ are: LONG_DESCRIPTION SHORT_DESCRIPTION END_DATE TIME_SPAN TOTAL_TIME_LD YEAR_LD QUARTER_LD MONTH_LD TOTAL_TIME_SD YEAR_SD QUARTER_SD MONTH_SD TOTAL_TIME_ED YEAR_ED QUARTER_ED MONTH_ED TOTAL_TIME_TS YEAR_TS QUARTER_TS MONTH_TS The parent attribute is PARENT_ATTRIBUTE.
3.7 メタデータ・オブジェクトのSourceの取得
メタデータ・オブジェクトはデータ・セットを表しますが、そのデータに対する問合せを作成する機能は提供しません。 オブジェクトは情報です。 データの存在、構造および特性を記録します。 データ値にはアクセスできません。
メタデータ・オブジェクトのデータ値にアクセスするには、アプリケーションは、そのメタデータ・オブジェクトのSource
オブジェクトを取得します。 メタデータ・オブジェクトのSource
は、プライマリSource
です。
メタデータ・オブジェクトのプライマリSource
を取得するために、アプリケーションは、そのメタデータ・オブジェクトのgetSource
メソッドをコールします。 たとえば、アプリケーションが1999年に販売された製品ユニットの数量を表示する必要がある場合、そのデータにはMdmMeasure
のgetSource
メソッド(次の例ではmdmUnits
)を使用する必要があります。
例3-11 メタデータ・オブジェクトのプライマリSourceの取得
Source units = mdmUnits.getSource();
プライマリSource
オブジェクトの取得および操作の詳細は、「Sourceオブジェクトの理解」を参照してください。
親トピック: メタデータの検出