/*
* Created on 2003/12/01
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package ushi.jdbc;
import java.sql.*;
/**
* 指定された表(またはビュー)に関する情報を抽出したり、
* SQL文を自動生成したりするユーティリティクラスです。
*/
public class TableDefUtil {
/**
* 引数で指定された表の列定義情報を、HTMLのTABLE形式にまとめた文字列で返します。
*
* @param con Connectionオブジェクト。接続されていること。
* このメソッド内では接続終了処理は行いません。
* @param tableName 表またはビューの名前。なお、;など不正な文字が含まれていないか
* 事前にチェックしておくことがセキュリティ上重要です。
* (このメソッド内では行いません)
* @return 生成されたHTML文字列
*/
public static String getTableDefHTML(Connection con, String tableName) throws SQLException {
/* SELECT文を実行し、ResultSetMetaData情報を取得します。*/
Statement st = con.createStatement();
ResultSet rset = st.executeQuery("SELECT * FROM " + tableName + " WHERE 1 = 2");
ResultSetMetaData rsmd = rset.getMetaData();
int colc = rsmd.getColumnCount();
/* HTML文字列を生成 */
String s = "
";
String[] rowdata = new String[9];
for (int i = 1; i <= colc; i++) {
int tcno = 0;
rowdata[tcno++] = String.valueOf(i);
rowdata[tcno++] = rsmd.getColumnName(i);
rowdata[tcno++] = rsmd.getColumnClassName(i);
rowdata[tcno++] = rsmd.getColumnTypeName(i);
rowdata[tcno++] = String.valueOf(rsmd.getColumnDisplaySize(i));
rowdata[tcno++] = String.valueOf(rsmd.getPrecision(i));
rowdata[tcno++] = String.valueOf(rsmd.getScale(i));
rowdata[tcno++] = String.valueOf(rsmd.isCaseSensitive(i));
rowdata[tcno++] = String.valueOf(rsmd.isNullable(i));
// ↓columnLabelは一般にcolumnNameと同じ
//rowdata[2] = rsmd.getColumnLabel(i);
// 下の2つはclasses12.zipではサポートされていない
//rowdata[1] = rsmd.getCatalogName(i);
//rowdata[8] = rsmd.getTableName(i);
s += "";
for (int c = 0; c < rowdata.length; c++) {
s += "" + rowdata[c] + " | ";
}
s += "
\n";
}
s += "
";
/* クローズ処理 */
rset.close();
st.close();
return s;
}
/**
* 引数で指定された表の列定義情報から、SQL*Loaderの標準的な制御ファイルの記述
* (タブ区切り、APPENDモード)を生成して返します。
*
* @param con Connectionオブジェクト。接続されていること。
* このメソッド内では接続終了処理は行いません。
* @param tableName 表またはビューの名前。なお、;など不正な文字が含まれていないか
* 事前にチェックしておくことがセキュリティ上重要です。
* (このメソッド内では行いません)
* @return 生成された制御ファイル記述
*/
public static String getLoaderCtlDesc(Connection con, String tableName) throws SQLException {
/* SELECT文を実行し、ResultSetMetaData情報を取得します。*/
Statement st = con.createStatement();
ResultSet rset = st.executeQuery("SELECT * FROM " + tableName + " WHERE 1 = 2");
ResultSetMetaData rsmd = rset.getMetaData();
int colc = rsmd.getColumnCount();
/* 制御ファイル記述を生成 */
String s = "LOAD DATA INFILE '" + tableName.toLowerCase() + ".txt'\n";
s += "APPEND INTO TABLE " + tableName + "\n";
s += "FIELDS TERMINATED BY X'09'\n";
/* OPTIONALLY ENCLOSED BY '"' はつけません。*/
s += "TRAILING NULLCOLS\n";
s += "(\n";
for (int i = 1; i <= colc; i++) {
if(i > 1){
s += ", ";
}
s += rsmd.getColumnName(i);
String typeName = rsmd.getColumnTypeName(i);
if(typeName != null && typeName.toUpperCase().equals("DATE")){
/* DATE型の場合、フォーマットを指定 */
s += " DATE \"YYYY/MM/DD HH24:MI:SS\"";
}
if(i % 5 == 4){
s += "\n";
}
}
s += ")\n";
/* クローズ処理 */
rset.close();
st.close();
return s;
}
/**
* 引数で指定された表の列定義情報から、SELECT文を生成して返します。
*
* @param con Connectionオブジェクト。接続されていること。
* このメソッド内では接続終了処理は行いません。
* @param tableName 表またはビューの名前。なお、;など不正な文字が含まれていないか
* 事前にチェックしておくことがセキュリティ上重要です。
* (このメソッド内では行いません)
* @return 生成されたSELECT文記述
*/
public static String getSelectStatement(Connection con, String tableName) throws SQLException {
/* SELECT文を実行し、ResultSetMetaData情報を取得します。*/
Statement st = con.createStatement();
ResultSet rset = st.executeQuery("SELECT * FROM " + tableName + " WHERE 1 = 2");
ResultSetMetaData rsmd = rset.getMetaData();
int colc = rsmd.getColumnCount();
/* SELECT文を生成 */
String s = "SELECT ";
for (int i = 1; i <= colc; i++) {
if(i > 1){
s += ", ";
}
s += rsmd.getColumnName(i);
if(i % 5 == 4){
s += "\n";
}
}
s += " FROM " + tableName;
/* クローズ処理 */
rset.close();
st.close();
return s;
}
/**
* 引数で指定された表の列定義情報から、INSERT文を生成して返します。
*
* @param con Connectionオブジェクト。接続されていること。
* このメソッド内では接続終了処理は行いません。
* @param tableName 表またはビューの名前。なお、;など不正な文字が含まれていないか
* 事前にチェックしておくことがセキュリティ上重要です。
* (このメソッド内では行いません)
* @return 生成されたINSERT文記述
*/
public static String getInsertStatement(Connection con, String tableName) throws SQLException {
/* SELECT文を実行し、ResultSetMetaData情報を取得します。*/
Statement st = con.createStatement();
ResultSet rset = st.executeQuery("SELECT * FROM " + tableName + " WHERE 1 = 2");
ResultSetMetaData rsmd = rset.getMetaData();
int colc = rsmd.getColumnCount();
/* SELECT文を生成 */
String s = "INSERT INTO " + tableName + "(\n";
String v = "(\n";
for (int i = 1; i <= colc; i++) {
if(i > 1){
s += ", ";
v += ", ";
}
s += rsmd.getColumnName(i);
v += "?";
if(i % 5 == 4){
s += "\n";
v += "\n";
}
}
v += ")";
s += ") VALUES " + v;
/* クローズ処理 */
rset.close();
st.close();
return s;
}
}