機械翻訳について

3 メタデータの検出

この章では、Oracle Databaseインスタンスへの接続方法、および既存のOracle OLAPメタデータ・オブジェクトの検出方法について説明します。 項目は次のとおりです。

3.1 Oracle OLAPへの接続

Oracle Databaseインスタンス内のOracle OLAPサーバーに接続するために、OLAP Java APIクライアント・アプリケーションは、Javaデータベース接続(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ファイルの設定については、「開発環境の設定」を参照してください。

3.1.2 接続の確立

OLAPサーバーに接続するには、次の手順を実行します。

  1. データベースへのJDBC接続を作成します。
  2. 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-1OracleConnectionです。

例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オブジェクトを「ソース・オブジェクトの理解」および「ソース・メソッドを使用した問合せの作成」に記述されているように作成します。

3.1.3 DataProviderおよび接続のクローズ

OLAP Java APIの使用を終了した後でデータベースへのJDBC接続での作業を続行する場合は、DataProvidercloseメソッドを使用してOLAP Java APIリソースを解放します。

dp.close();     // dp is the DataProvider

データベースでの処理が完了したら、OracleConnection.closeメソッドを使用します。

例3-3 接続のクローズ

try
{
  conn.close();     // conn is the OracleConnection
}
catch(SQLException e) 
{
  System.out.println("Cannot close the connection. " + e);
}

3.2 メタデータの検出手順の概要

OLAP Java APIを利用して、アナリティック・ワークスペースのデータ、またはリレーショナル構造にあるデータにアクセスできます。 このデータの集合は、アプリケーションのデータ・ストアです。

データ・ストアには潜在的に、MdmRootSchemaのすべてのサブスキーマが格納されています。 ただし、アプリケーションの実行中に参照可能なデータ・ストアの範囲は、接続を確立した際に使用したユーザーIDに付与されるデータベース権限によって異なります。 ユーザーはMdmRootSchemaの下に存在するすべてのMdmDatabaseSchemaオブジェクトを見ることができますが、ユーザーがメタデータ・オブジェクトへのアクセス権を持っている場合にのみMdmDatabaseSchemaが所有するオブジェクトを見ることができます。

次のトピックでは、メタデータの検出について説明します。

3.2.1 メタデータ検出の目的

アプリケーションは、データ・ストア内のメタデータ・オブジェクトを使用して、データを判断します。 これらのオブジェクトを使用して、使用可能なデータ、データの構造および特性を調べることができます。

したがって、接続後最初に実行する手順は使用可能なメタデータを検出することです。 次に、選択または計算するデータ、およびその表示方法に関する選択肢を、エンド・ユーザーに提示できます。

アプリケーションがメタデータを検出すると、通常、データの選択、計算、その他の操作のための問合せを作成します。 このような方法でデータを処理するには、メタデータ・オブジェクトからSourceオブジェクトを取得する必要があります。 Sourceオブジェクトは問合せ用のデータを指定します。 Sourceオブジェクトの詳細については、「ソース・オブジェクトの理解」を参照してください。

3.2.2 メタデータの検出手順

メタデータを調べる前に、アプリケーションでOracle OLAPに接続する必要があります。 接続が確立されると、アプリケーションで次の処理が実行可能となります。

  1. DataProviderを作成します。
  2. DataProviderからMdmMetadataProviderを取得します。
  3. MdmMetadataProviderからMdmRootSchemaを取得します。
  4. すべてのMdmDatabaseSchemaオブジェクトを取得するか、個々のオブジェクトを取得します。
  5. MdmDatabaseSchemaオブジェクトが所有するMdmCubeMdmDimensionおよび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オブジェクトによって編成されます。 最上位のMdmSchemaMdmRootSchemaです。 データ・ストア内のメタデータの調査では、最初にMdmRootSchemaを取得します。 このMdmRootSchemaから、MdmDatabaseSchemaオブジェクトを取得できます。 MdmRootSchemaは、データベース・ユーザーごとにMdmDatabaseSchemaを1つ持ちます。 MdmDatabaseSchemaにはMdmOrganizationalSchemaオブジェクトがあり、MdmDatabaseSchemaが所有するメタデータ・オブジェクトを編成します。

例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オブジェクトを取得するのではなく、個々のユーザーのスキーマを取得する場合、MdmRootSchemagetDatabaseSchemaメソッドを使用します。 この例は、GLOBALユーザーのMdmDatabaseSchemaの取得方法を示しています。

MdmDatabaseSchema mdmGlobalSchema = mdmRootSchema.getDatabaseSchema("GLOBAL");

3.5 MdmSchemaのコンテンツの取得

MdmSchemaからは、格納されているすべてのサブスキーマ(MdmCubeMdmPrimaryDimensionおよびMdmMeasureオブジェクト)を取得できます。 また、MdmRootSchemaは、利用可能なすべてのMdmMeasureオブジェクトのListを持つMdmMeasureDimensionを持ちます。

特定のユーザーが所有しているすべてのディメンションおよびメソッドを表示する場合、そのユーザーのMdmDatabaseSchemaからディメンションおよびメジャーのリストを取得します。

例3-7 MdmDatabaseSchemaのディメンションおよびメジャーの取得

この例では、MdmDatabaseSchemaから「例3-6」のディメンションとメジャーを取得します。 ここでは、各ディメンションおよびメジャーの名前を表示します。

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に関連付けられたディメンションとメジャーだけを表示するには、MdmDatabaseSchemafindOrCreateCubeメソッドを使用してキューブを取得し、キューブのディメンションとメジャーを取得します。 この例では、MdmCube「例3-6」MdmDatabaseSchemaから取得し、「例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に含まれるオブジェクトの取得

問合せの作成およびデータの表示に使用するメタデータ・オブジェクトを検出する際、アプリケーションでは通常、ディメンションに関連付けられたMdmAttributeおよびMdmPrimaryDimensionオブジェクトのMdmSubDimensionコンポーネントを取得します。 次のトピックでは、ディメンションのコンポーネントと属性の取得方法について説明します。

3.6.1 MdmPrimaryDimensionの階層とレベルの取得

MdmPrimaryDimensionにはゼロ以上のコンポーネントMdmHierarchyオブジェクトがあり、ディメンションのgetHierarchiesメソッドを呼び出すことで取得できます。 このメソッドは、MdmHierarchyオブジェクトのListを返します。 MdmPrimaryDimensionのレベルは、MdmDimensionLevelオブジェクトで表されます。

MdmHierarchyMdmLevelHierarchyである場合、MdmDimensionLevelオブジェクトを関連付けるMdmHierarchyLevelオブジェクトがあります。 MdmHierarchyLevelオブジェクトを取得するには、MdmLevelHierarchygetHierarchyLevelsメソッドを呼び出します。

例3-9 ディメンションの階層およびレベルの取得

この例では、MdmPrimaryDimensionMdmDatabaseSchemaから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オブジェクトの取得

この例は、MdmPrimaryDimensionMdmAttributeオブジェクトを取得する方法を示しています。 また、親属性を個別に取得します。 この例は、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(次の例のmdmUnits)のgetSourceメソッドを使用する必要があります。

例3-11 メタデータ・オブジェクトのプライマリSourceの取得

Source units = mdmUnits.getSource();

プライマリSourceオブジェクトを取得して操作する方法の詳細については、「ソース・オブジェクトの理解」を参照してください。