0

Oracle データベースに接続し、複数のテーブルにクエリを実行しています。私の現在のコードは、接続を作成し、クエリを含む PL/SQL 関数を呼び出します。結果セットを取得したら、それを Vector に追加します (各クエリの結果のレコード数がわからないため)。

私の問題は、ベクターから区切られたファイルを書き込む方法がわからないことです。結果セットを追加すると、それは単なる 1 つの巨大な文字列になると思います。クエリから各フィールドを受け取り、それらの間を区切り、行を分離できるようにする必要があります。

これが私のコードです:

 public static void main(String[] args) throws SQLException {

    // instantiate db connection
    try {
        Class.forName("oracle.jdbc.driver.OracleDriver");
    }catch (Exception e) {
        throw new SQLException("Oracle JDBC is not available", e);
    }

    // define connection string and parameters
    String url = "jdbc:oracle:thin:@//host:port/sid";
    Connection conn = DriverManager.getConnection(url, "USERNAME","PASSWORD");


    CallableStatement stmt = conn.prepareCall("{? = CALL <functionname>(?)}");

    // get result set and add to a Vector
    ResultSet rs = stmt.executeQuery();
    Vector<String> results = new Vector();
    while ( rs.next() ){
        results.add(rs.getString(1));
    }

    // close result set, sql statement, and connection
    rs.close();
    stmt.close();
    conn.close();

    // write Vector to output file,
    // where the file name format is MMddyyyy.txt
    try {

    Calendar cal = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("MMddyyyy");
    String dateStr = sdf.format(cal.getTime());

    FileWriter fwrite = new FileWriter(dateStr + ".txt");
    BufferedWriter out = new BufferedWriter(fwrite);

    for(int i = 0; i < results.size(); i++)
    {
        String temp = results.elementAt(i);
        out.write(temp);
    }

    out.close();

}catch (Exception e) {
    System.err.println("Error: " + e.getMessage());
}
}

データベースから情報を取得して区切りファイルに書き込む方法がわかりません。前もって感謝します!

4

2 に答える 2

1

それぞれのフィールドの数が不明な場合はrows、おそらく不可能です。データベースからすべてのフィールド値を取得するには、各フィールドのタイプとフィールドの数を知る必要があるためです。

ただし、固定数のフィールドがある場合の例を投稿します。

4 columns行ごとにあるとします。これを表形式で表示するには、 を使用する必要がありますList of List

を使用している場合はVector、 を使用してVector of Listください。

以下に例を示しList of Listます: -

List<List<String>> results = new ArrayList<List<String>>();

while ( rs.next() ) {
    List<String> tempList = new ArrayList<String>();
    tempList.add(rs.getString(1));
    tempList.add(rs.getString(2));
    tempList.add(rs.getString(3));
    tempList.add(rs.getString(4));

    results.add(tempList);
}

次に、それを印刷するには、次のループを使用します: -

for (List<String> innerList: results) {
    for (String fields: innerList) {
        System.out.print(fields + "\t");
    }
    System.out.println();
}

に同じ形式で書き込むことができますBufferedWriter

于 2012-11-07T18:52:08.663 に答える
0

結果の文字列から波括弧 ( ) を使用results.toString()して切り捨て、すべての値をカンマ区切りでファイルに一度に書き込みます。[]

    //toString() returns comma separated string values enclosed in []
    String resultString = results.toString();

    //truncate leading '[' and termincating ']'
    resultString = resultString.substring(1, resultString.length()-1);

    //if comma is not your delimiter then use String.replaceAll() 
    //to replace `,` with your delimiter

    //write comma separated elements all at once
    out.write(resultString);

したがって、ここでベクトルに を追加した場合はstr1、をstr2使用してすぐに書き込むことができる値として を持ち ます。resultsresultStringstr1, str2BufferedWriter out

またGenerics、初期化の両側で次のように使用してください。

     Vector<String> results = new Vector<String>();
于 2012-11-07T18:43:41.247 に答える