将Java矢量写入分隔文件

时间:2012-11-07 18:36:57

标签: java oracle plsql

我正在连接Oracle数据库并查询多个表。我当前的代码创建连接并调用包含查询的PL / SQL函数。一旦我有了结果集,我就把它添加到Vector中(因为我不确定每个查询将产生的记录数)。

我的问题是我不确定如何从Vector编写分隔文件。我想,一旦我将结果集添加到它,它只是一个巨大的字符串。我需要能够从查询中接收每个字段并在它们之间分隔,并保持行分开。

这是我的代码:

 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());
}
}

我只是不确定如何从数据库获取信息并将其写入分隔文件。提前谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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向量中添加了str2results,那么resultString的值为str1, str2,您可以在此处写入一旦使用BufferedWriter out

另请在初始化的两个方面使用Generics

     Vector<String> results = new Vector<String>();