結果セットから最も近い一致する構造を抽出し、テーブルを作成できます。
ただし、これは、テーブル名、キー、エンジンタイプ、フィールドがnull許容かどうかなどの点で、正確なレプリカにすることはできません。
次のコードスニペットは、適切な結果を得る方法で進めるのに役立ちます。
String sql = "select * from visitors";
ResultSet rs = stmt.executeQuery( sql );
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
String tableName = null;
StringBuilder sb = new StringBuilder( 1024 );
if ( columnCount > 0 ) {
sb.append( "Create table " ).append( rsmd.getTableName( 1 ) ).append( " ( " );
}
for ( int i = 1; i <= columnCount; i ++ ) {
if ( i > 1 ) sb.append( ", " );
String columnName = rsmd.getColumnLabel( i );
String columnType = rsmd.getColumnTypeName( i );
sb.append( columnName ).append( " " ).append( columnType );
int precision = rsmd.getPrecision( i );
if ( precision != 0 ) {
sb.append( "( " ).append( precision ).append( " )" );
}
} // for columns
sb.append( " ) " );
System.out.println( sb.toString() );
コードの上記の部分で実行すると、次の文字列が出力されます。
Create table visitors ( ip VARCHAR( 6 ), bro VARCHAR( 6 ) )
これがあなたがさらに進むのに役立つことを願っています。
同様の例は次の場所にあります。ResultSetを使用してテーブルを作成する???
更新1:
あるデータベースにのみ存在し、別のデータベースには存在しないタイプをどのように処理できますか
クライアント側のアプリケーションの結果セットのみに依存している場合は、何もできません。、などの複合データ型から適切なデータを選択する
のは、常にメインのselectクエリである必要があります。例:geometry
address
select addess.city, address.zipcode, x( geometry_column ), y( geometry_column )
geometry
データ型の例を示すために:
MySQLにはその空間サポートの定義があります。しかし、SQLServerの空間データの実装と比較してどれだけ優れているかはわかりません。
geometry
は複合データ型であるため、直接クエリでは取得できません。
そのようなデータ列からのデータを解析し、読み取り可能で識別可能なデータ形式で返す依存関数が必要です。
例:create table geom ( g geometry );
ResultSetselect g from geom
をJAVAの使用からテーブルの作成ステートメントに変換すると、unknwon
列のデータ型が得られますg
。
Create table geom ( g UNKNOWN )
を使用するx(g)
と、y(g)
列の座標関数はg
適切で許容可能なデータ型を返します。
クエリselect x(g), y(g) from geom
はに変換されます
Create table ( x(g) DOUBLE( 23, 31 ), y(g) DOUBLE( 23, 31 ) )
更新2:
結果セットは、リレーションを使用して複数のテーブルの組み合わせで生成される場合があります。結果セットフィールドが式とそのエイリアスで構成されている可能性もあります。したがって、結果の列フィールドまたはエイリアスのデータ型は動的に決定されます。メタデータは、テーブルの正確な名前、列名、およびクエリからの元の/親のデータ型を認識しません。
だから、得ることはできません
- テーブルの単一の名前とそれを使用します。
- 親列のデータ型とそれを使用します。
注:これは、 NVARCHARなどの他のすべてのクロスデータベース固有のデータ型にも適用できます。ただし、 MySQLでのNVARCHARの使用法の代わりに、この投稿を参照してください。
このような動的なデータ移行を試みる前に、同等のデータ型を知り、それに応じてそれらを使用するのはクライアントアプリケーションの責任である必要があります。
また、詳細については、Microsoft Access、MySQL、およびSQLServerのデータ型と範囲を参照してください。