/* * 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 += ""; } s += "\n"; } s += "
" + rowdata[c] + "
"; /* クローズ処理 */ 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; } }