2012-11-07 2 views
0

Oracle 데이터베이스에 연결하고 여러 테이블을 쿼리하고 있습니다. 현재 코드가 연결을 생성하고 쿼리가 포함 된 PL/SQL 함수를 호출합니다. 일단 결과가 설정되면 벡터에 추가합니다 (각 쿼리가 발생할 레코드의 수가 확실하지 않으므로).구분 된 파일에 Java 벡터 쓰기

내 문제는 벡터에서 구분 된 파일을 쓰는 방법을 잘 모르겠다는 것입니다. 일단 결과 세트를 추가하면, 그것은 단지 하나의 거대한 문자열 일 것입니다. 나는 쿼리에서 각 필드를 받아 들일 수 있어야하고 그들 사이를 구분할 수 있어야하고 행을 분리하여 유지해야한다. 제가 DB에서 정보를 얻고 구분 된 파일에 쓰기에 대해 갈 방법 만 확실하지 오전

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 (임시 + 구분 기호);'? –

+0

아마도. 나는 결과에 대한 큰 이해를하지 못했을 것이다. 요소 (i). 벡터의 요소가 내 결과 집합의 각 필드를 반영하고 있습니까? 벡터가 서식을 유지합니까 (예 : 결과 집합에 행 당 10 개의 필드, 10 개의 행이 있습니다. 벡터가 그렇게 보일까요?) 아마도 생각보다 쉽습니다 ... – Phoenix

+0

그러나 각 행의 첫 번째 필드를 당신의 벡터. 정확히 무엇을 원하십니까? 예를 올리십시오. –

답변

1

:

은 또한 초기의 모두 측면을 Generics을 사용하십시오. 데이터베이스에서 모든 필드 값을 가져 오기 때문에 각 필드의 유형 및 필드 수를 알아야합니다.

그러나 필드 수가 고정되어있을 때 예제를 게시 할 예정입니다.

행당 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

정말 답변을 주시면 감사하겠습니다. Vector of List는 저에게 효과적입니다. 각 행의 첫 번째 필드를 사용하는 것에 대해 지금 말하고있는 것을 봅니다. 특정 필드를 사용하여 특정 정보의 플랫 파일을 빌드 할 것이기 때문에 각 쿼리에는 설정된 수의 필드가 있습니다. 다시 한 번 감사드립니다! – Phoenix

+0

@Phoenix .. 맞아. 그래서 각 행의 필드 수를 모르는 경우에는 할 수 없습니다. 이제 가지고 계셨으므로 문제를 해결할 수 있습니다. 그리고 당신은 환영합니다 :) –

0

results.toString()을 사용하고 결과 문자열에서 중괄호 ({})를 절단하여 모든 값을 쉼표로 한 번에 파일에 씁니다. 와 다음 resultString 당신이 results 벡터에 str1, str2을 추가 한 경우 그래서 여기

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

, 당신은 당신의 BufferedWriter out를 사용하여 한 번에 쓸 수 있습니다 str1, str2 같은 값을 가지고있다. 당신이 당신의 rows의 각 필드의 수에 대한 확신이 있다면 아마, 그것은 할 수 없습니다,

 Vector<String> results = new Vector<String>(); 
관련 문제