◇ ResultSetからテーブル名や別名を取得する方法
◇ JDBCのResultSetから取得したカラムの情報を取得できます。
◇ MySQL,PostgreSQL,ORACLEでテストしたところ、以下の結果になりました。
・テーブル名、MySQLは取得できるが、他は不可。
・なので、MySQL以外では、同一名称のカラムがあった場合は、区別がつかない
・MySQLは、別名を指定した場合、カラム名に元のカラム名、カラムラベルに別名が入るが、他は両方に別名が戻ってくる
・なので、MySQL以外は別名を指定されても分からない
・ORACLEやPostgreSQLで、ResultSetからテーブル名や別名を取得する方法があれば、ご教授願います。
・下記サンプルはMySQLのものです。
package jp.avaj.z.sample.lec.s0210;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import jp.avaj.lib.db.DB;
import jp.avaj.lib.debug.L;
import jp.avaj.z.common.db.MyDB;
/**
- Java JDBC ResultSetからメタデータ(カラム情報)を取得する
*/
class GetResultSetMetaDataMySQL {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try {
conn = MyDB.connectToMySQL();
//
L.p("==== test no 0 - 同一のカラム名がある場合");
String sql = "select * from BOOK inner join PUBLISHER on BOOK.PUBLISHER_ID = PUBLISHER.ID";
st = conn.prepareStatement(sql);
rs = st.executeQuery();
ResultSetMetaData meta = rs.getMetaData();
printMeta(meta);
// クローズ処理はサンプルなのでいい加減(笑)
DB.close(rs);
DB.close(st);
//
L.p("==== test no 1 - 別名が指定された場合");
sql = "select ISBN,NAME BOOKNAME from BOOK";
st = conn.prepareStatement(sql);
rs = st.executeQuery();
meta = rs.getMetaData();
printMeta(meta);
DB.close(rs); DB.close(st); // L.p("==== test no 2 - カラムに対応しない項目がある場合"); sql = "select PRICE*PUBLISHER_ID as VALUE from BOOK"; st = conn.prepareStatement(sql); rs = st.executeQuery(); meta = rs.getMetaData(); printMeta(meta); DB.close(rs); DB.close(st); } catch(Exception ex) { // 例外は無視 ⇒ 実務ではやってはいけない... ex.printStackTrace(); } finally { DB.close(conn); }
}
private static void printMeta(ResultSetMetaData meta) throws SQLException {
int cnt = meta.getColumnCount();
for (int i=1; i<=cnt; i++) { // 1 オリジンなので注意
L.p("カタログ名="+meta.getCatalogName(i));
L.p("クラス名="+meta.getColumnClassName(i));
L.p("表示幅="+meta.getColumnDisplaySize(i));
L.p("カラムラベル="+meta.getColumnLabel(i));
L.p("カラム名="+meta.getColumnName(i));
L.p("カラムタイプ(SQLタイプ)="+meta.getColumnType(i));
L.p("カラムタイプ(DB固有)="+meta.getColumnTypeName(i));
L.p("カラムサイズ="+meta.getPrecision(i));
L.p("小数点以下の桁数="+meta.getScale(i));
L.p("スキーマ名="+meta.getSchemaName(i));
L.p("テーブル名="+meta.getTableName(i));
L.p("AutoIncrement?="+meta.isAutoIncrement(i));
L.p("CaseSensitive?="+meta.isCaseSensitive(i));
L.p("キャッシュ値?="+meta.isCurrency(i));
L.p("書き込みが必ず成功するか?="+meta.isDefinitelyWritable(i));
L.p("isNullable?="+meta.isNullable(i));
L.p("isReadOnly?="+meta.isReadOnly(i));
L.p("whereで指定可能?="+meta.isSearchable(i));
L.p("isSigned?="+meta.isSigned(i));
L.p("書き込みを成功するか?="+meta.isWritable(i));
}
}
}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/07 01:55
2016/04/07 02:21
2016/04/09 03:30
2016/04/09 08:14
2016/04/10 01:37