2012-11-07 58 views
0

我连接到Oracle数据库并查询多个表。我当前的代码创建连接并调用包含查询的PL/SQL函数。一旦我有结果集,我将它添加到Vector(因为我不确定每个查询将导致的记录数)。将Java向量写入分隔文件

我的问题是,我不确定如何从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()); 
} 
} 

我只是不知道该如何去从数据库获取信息,并将其写入到分隔的文件。提前致谢!

+0

您的意思是:-'out.write(temp + delimiter);'? –

+0

也许吧。我可能对results.elementAt(i)没有很好的理解。矢量中的元素是否反映了结果集中每个字段的内容?该矢量是否保持格式(例如,我的结果集每行有10个字段,10行,这个矢量会是这样吗?)也许这比我想象的要容易... – Phoenix

+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

+0

我真的很感谢答案,列表矢量将为我工作。我看到你现在说的关于使用每一行的第一个字段。每个查询都会有一定数量的字段,因为我将使用特定的字段来构建特定信息的平面文件。再次感谢!! – Phoenix

+0

@Phoenix ..的确如此。这就是为什么如果你不知道每一行中的字段数量,你就无法做到这一点。现在你已经掌握了它,你可以在你的问题中使用它。不客气:) –

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

所以在这里,如果你已经在results矢量添加str1str2,然后用resultString具有作为str1, str2,您可以使用您的BufferedWriter out写一次。

还请都使用Generics两侧初始化为:

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