我正在连接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());
}
}
我只是不确定如何从数据库获取信息并将其写入分隔文件。提前谢谢!
答案 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
向量中添加了str2
,results
,那么resultString
的值为str1, str2
,您可以在此处写入一旦使用BufferedWriter out
。
另请在初始化的两个方面使用Generics
:
Vector<String> results = new Vector<String>();