JDBCのAPIで各種DBMSのメタ情報を取得する方法

posted in: データベース | 0

ワダです。4度目の投稿です。

■DBMSのメタ情報とは

DBMSにおいてメタ情報とは、次のようなものを意味します。

  • データベースに存在するテーブルの一覧
  • テーブル内のカラムの一覧、キー情報
  • カラムの説明、データタイプ、長さ、nullが許されるか、デフォルト値など

古いJDBCドライバではAPIはなく、メタ情報を取得するには各DBMSのデータベースカタログを検索するSQLを投げる必要がありました。
最近JDBCドライバでは、JDBCのAPIを使ってDBMSのメタ情報を取得することができます。
工夫次第で、あらゆるDBMSに対応したプログラムを作成することができそうです。

今回はPostgreSQL、Oracle、SQLServerの3種類で、メタ情報の取得を試してみました。

■試した環境

今回はこちらの環境で行いました。

Java

  • バージョン 8 Update 201

OS

  • Windows10 Pro ビルド番号 1803

DBMS

  • PostgreSQL
    • バージョン: 9.6
    • ドライバ:PostgreSQL JDBC 4.2 Driver, 42.2.5(下記からダウンロード)
      https://jdbc.postgresql.org/download.html
    • DB情報と定義
      • DB名:sample
      • ユーザ名:postgres
      • スキーマ、テーブル:public.TEST0001、public.test0002、sch1.TEST0001
  • SQLServer
    • バージョン:SQL Server 2012 Express Edition
    • ドライバ:Microsoft JDBC Driver 4.2 for SQL Server(下記からダウンロード)
      https://www.microsoft.com/ja-jp/download/details.aspx?id=11774
    • DB情報と定義
      • DB名:test
      • ユーザ名:test01
      • スキーマ、テーブル:dbo.TEST0001、sch1.TEST0001

■サンプルプログラム

(相変わらずシンプルなものになりますが)以下のようなサンプルを作成しました。

■PostgreSQLの場合

コマンド

実行結果~PostgreSQL~
↓↓↓
meta01

■Oracleの場合

接続文字列の部分を書き換えます。

コマンド

実行結果~Oracle~
↓↓↓
meta02

■SQLServerの場合

接続文字列の部分を書き換えます。

コマンド

実行結果~SQLServer~
↓↓↓
sqlsv02

まとめ ~結果から気づいたこと~

  • PostgreSQLのみ、getColumnsの引数ですべてのスキーマを取得条件にすると、全スキーマの情報を取得できました。
    Oracle、SQLServerでは取得できた情報はユーザのデフォルトスキーマの情報のみでした。
    特にSQLServerでは、接続時のスキーマを「sch1」にしたにもかかわらず、取得できた情報は「dbo」スキーマの情報だった点が意外でした。

  • PostgreSQLでは、普通のSQL文「SELECT ・・・ FROM 大文字のテーブル名」のexecuteQuery実行時にはエラーになるのですが(SQL文中のテーブル、カラム名は自動的に小文字に変換されてしまうため)、DatabaseMetaDataのgetColumnsでテーブル名を大文字で指定した場合には取得できました。

  • DBMSによって、取得できる情報に思った以上に差異がありました。
    今回試した3種類のDBMSでは、どれも「TABLE_CAT」(カタログ名=データベース名)は取得できませんでした。色々調べてみたところ、MySQLでは取得できるようです。

機会があればもう少しプログラムをブラッシュアップして、実用性を高めていきたいです。

今回は以上です。ありがとうございました。

LINEで送る
Pocket