0

我正在连接到 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());
}
}

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

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

因此,如果您在Vector 中添加了 , 则str1具有值 as ,您可以使用.str2resultsresultStringstr1, str2BufferedWriter out

也请Generics在初始化的两侧使用:

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