コンテンツにスキップ

11.5.4 DatabaseMetaData

Connection.getMetaData()はドライバー、サーバー、スキーマオブジェクト、JDBC機能の情報を返します。 結果列はJDBC標準の名前と順序を使用するため、数値の位置より列名で読み取ることを推奨します。

import java.sql.DatabaseMetaData;

DatabaseMetaData metadata = connection.getMetaData();

System.out.println(metadata.getDriverName());
System.out.println(metadata.getDriverVersion());
System.out.println(metadata.getDatabaseProductName());
System.out.println(metadata.getDatabaseProductVersion());

テーブルとVIEW

try (ResultSet tables = metadata.getTables(
         null, null, "%", new String[] {"TABLE", "VIEW"})) {
    while (tables.next()) {
        System.out.printf("%s %s%n",
            tables.getString("TABLE_NAME"),
            tables.getString("TABLE_TYPE"));
    }
}

getTables()はTABLEとVIEWを区別します。Machbaseの詳細なテーブルタイプはREMARKSで確認します。 アプリケーションは特定の位置番号に依存せず、標準列名を使用します。

try (ResultSet columns = metadata.getColumns(
         null, null, "SENSOR_TX", "%")) {
    while (columns.next()) {
        System.out.printf(
            "%s %s size=%d nullable=%s%n",
            columns.getString("COLUMN_NAME"),
            columns.getString("TYPE_NAME"),
            columns.getInt("COLUMN_SIZE"),
            columns.getString("IS_NULLABLE"));
    }
}

NULLABLEは数値定数、IS_NULLABLEYESNO、または空文字列で返ります。 LOOKUPとVOLATILEテーブルのPRIMARY KEYは、明示的なNOT NULL句がなくてもcolumnNoNullsNOで返ります。

VARCHAR、DATETIME、BINARY、BLOB、CLOBなど数値属性が適用されない列のDECIMAL_DIGITSNUM_PREC_RADIXはSQL NULLです。getInt()の0だけを見ず、getObject()またはwasNull()で NULLかどうかを確認します。

PRIMARY KEYとインデックス

try (ResultSet keys = metadata.getPrimaryKeys(
         null, null, "SENSOR_TX")) {
    while (keys.next()) {
        System.out.printf("%s position=%d%n",
            keys.getString("COLUMN_NAME"),
            keys.getShort("KEY_SEQ"));
    }
}

try (ResultSet indexes = metadata.getIndexInfo(
         null, null, "SENSOR_TX", false, false)) {
    while (indexes.next()) {
        System.out.printf("%s %s%n",
            indexes.getString("INDEX_NAME"),
            indexes.getString("COLUMN_NAME"));
    }
}

PRIMARY KEYかどうかをResultSetMetaData.isNullable()の値から推測しません。 getPrimaryKeys()getIndexInfo()を使用します。

SELECT結果の直接の列がPKかどうかは、Machbase JDBC拡張の MachResultSetMetaData.isPrimaryKey(column)で確認できます。

import com.machbase.jdbc.MachResultSetMetaData;

try (ResultSet result = statement.executeQuery(
         "SELECT ID, ID + 1 AS ID_EXPR FROM SENSOR_TX")) {
    MachResultSetMetaData resultMetadata =
        (MachResultSetMetaData) result.getMetaData();
    System.out.println(resultMetadata.isPrimaryKey(1)); // trueまたはfalse
    System.out.println(resultMetadata.isPrimaryKey(2)); // 式: false
}

getPrimaryKeys()はテーブルカタログのPKを検索し、isPrimaryKey()は現在のSELECT結果の 列メタデータを取得します。旧バージョンのサーバーまたはSDKに接続した場合、結果列のPKフラグが falseとして返る場合があります。

スキーマと型情報

次のメソッドはJDBC標準形式のResultSetを返します。

  • getSchemas()getCatalogs()getTableTypes()
  • getTypeInfo()
  • getTables()getColumns()
  • getPrimaryKeys()getIndexInfo()

非サポートの任意メタデータ検索は、nullや非標準のResultSetではなく、標準列を持つ空のResultSetを 返す場合があります。機能を使用する前に機能メソッドを確認します。

if (metadata.supportsSavepoints()) {
    // 対応環境でのみセーブポイントを使用します。
}

カタログ

Connection.getCatalog()setCatalog()は、ドライバーが公開する現在のカタログ値を管理します。 メタデータメソッドのカタログ引数は、この値と一致する要求をフィルターするために使用します。

String initialCatalog = connection.getCatalog();
connection.setCatalog(initialCatalog);

接続プールに論理Connectionを返却すると、カタログはURLで決まる初期値に復元されます。 前の接続貸し出し期間で取得したDatabaseMetaDataオブジェクトは、次の貸し出し期間で再利用しません。

サポート範囲の確認

Machbase JDBCは実際のサポート範囲を機能情報に反映します。たとえばトランザクションの分離レベル、 ResultSetの種類、セーブポイント、生成キー、複数結果の同時オープンのサポートを次のように確認します。

System.out.println(metadata.supportsTransactions());
System.out.println(metadata.supportsTransactionIsolationLevel(
    Connection.TRANSACTION_SERIALIZABLE));
System.out.println(metadata.supportsResultSetType(
    ResultSet.TYPE_FORWARD_ONLY));
System.out.println(metadata.supportsSavepoints());
System.out.println(metadata.supportsGetGeneratedKeys());
System.out.println(metadata.supportsMultipleOpenResults());

Driver.jdbcCompliant()falseであることと、個々のJDBC APIのサポート状況は別です。 アプリケーションは必要な機能を直接確認します。

Standard EditionでROWID対応サーバーに接続すると、supportsGetGeneratedKeys()truegetRowIdLifetime()ROWID_VALID_OTHERを返します。非対応サーバーまたはCluster Editionでは、 それぞれfalseROWID_UNSUPPORTEDを返します。使用例は ROWIDとINSERT結果IDを参照してください。

最終更新日