2014-11-26 5 views
1

날짜별로 테이블에 데이터를 내보내려고하므로 jdbc를 사용하여 Java 프로그램을 작성합니다. 내가 서버에 프로그램을 실행할 때 데이터베이스가 또 다른 단절, 나는이 program.But에서 데이터베이스에 연결하는 동안jdbc를 사용하여 postgresql에서 .csv 파일로 데이터를 내보내는 방법은 무엇입니까?

public void exportData(Connection conn,String filename) { 

     Statement stmt; 
     String query; 
     try { 
      stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, 
        ResultSet.CONCUR_UPDATABLE); 

      SimpleDateFormat dateFormat = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss"); 
      Date startDate = dateFormat.parse("2014-08-21 00:00:00"); 
      Date endDate = dateFormat.parse("2014-08-22 00:00:00"); 

      Calendar startCalendar = Calendar.getInstance(); 
      startCalendar.setTime(startDate); 

      Calendar endCalendar = Calendar.getInstance(); 
      endCalendar.setTime(endDate); 

      Calendar thisDayCalendar = startCalendar; 

      while(!thisDayCalendar.after(endCalendar)){ 
       Date thisDayDate = thisDayCalendar.getTime(); 
       thisDayCalendar.add(Calendar.DATE, 1); 
       Date nextDayDate = thisDayCalendar.getTime(); 

       String thisDayString = dateFormat.format(thisDayDate); 
       String nextDayString = dateFormat.format(nextDayDate); 

       SimpleDateFormat dateFormat1 = new SimpleDateFormat ("yyyy-MM-dd"); 
       String fileDateString = dateFormat1.format(thisDayDate); 

       //For comma separated file 
       query ="COPY (SELECT * FROM signals WHERE date_time >= '" + thisDayString + 
         "' AND date_time < '" +nextDayString + "') TO " +filename + fileDateString + ".csv delimiter ','"; 

       stmt.executeQuery(query); 
      //System.out.println(query); 

      } 

     } catch(Exception e) { 
      e.printStackTrace(); 
      stmt = null; 
     } 
    } 

이 프로그램은 서버에서 실행되고, 난 단지 수퍼 유저가 복사 할 수있어 오류 또는 파일에서 : 나는 온라인 솔루션을 검색하고 명령을 '\ 복사'하지만 컴파일 할 때, 또 다른 오류가 말했다 psql 프로그램을 사용하려고

org.postgresql.util.PSQLException: ERROR: must be superuser to COPY to or from a file 
    Hint: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone. 
     at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2161) 
     at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1890) 
     at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255) 
     at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:560) 
     at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:403) 
     at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:283) 
     at DBase.exportData(ExportSignal.java:85) 
     at ExportSignal.main(ExportSignal.java:23) 

'\'자바에 잘못된 이스케이프 문자는 그래서 "이중 슬래시 복사"썼다 인 프로그램을 실행할 때 구문 오류가 발생했습니다.

query ="\COPY (SELECT * FROM signals WHERE date_time >= '" + thisDayString + 
          "' AND date_time < '" +nextDayString + "') TO " +filename + fileDateString + ".csv delimiter ','"; 

누구나 프로그램을 실행하거나 "\ copy"의 잘못된 이스케이프 문자 문제를 해결하는 방법을 알고 있습니까?

+0

http://jdbc.postgresql.org/documentation/publicapi/org/postgresql/copy/CopyManager로 출력 텍스트를 포맷합니다. html –

+0

다음 링크는 도움을 드릴 수 있습니다. http://stackoverflow.com/questions/1517635/save-pl-pgsql-output-from-postgresql-to-a-csv-file –

+0

Thanks @BhavinPanchani, 나는 지침을 따른다. , "\ copy"는 명령어 라인으로 작동하지만이 자바 프로그램에서 동작합니다 – chenchenmomo

답변

2

오류가 오류를 보여줍니다 또는 현재 사용자가 파일을 작성하기에 충분한 권한을 가지고 있지 것 같다 파일

에서 복사하기 위해 수퍼 유저 여야합니다. 사용자에게 쓰기 위치에 대한 사용 권한을 제공하거나 파일에 쓸 수있는 충분한 권한이있는 사용자 계정에서 프로그램을 실행하십시오.

+0

명령 줄에서 수퍼 유저 권한없이 COPY 대신이 \ query를 실행하려면 \ copy를 사용할 수 있지만 java 프로그램에서는 '\ copy'를 사용하는 것이 이스케이프 문자로 불법이지만 '이중 슬래시 복사'를 시도하면 postgresql 예외 구문 오류입니다. 어떤 방법으로 이것을 해결할 수 있을지 궁금합니다. – chenchenmomo

+0

@Chenlu 제가 대답으로 추가 한 방법을 참조하십시오. – MaxMarchuk

7

이 경우 CopyManager을 사용하는 것이 좋습니다.

Connection connection = DriverManager.getConnection(url); 
CopyManager copyManager = new CopyManager((BaseConnection) connection); 
File file = new File("/tmp/output.csv"); 
FileOutputStream fileOutputStream = new FileOutputStream(file); 

//and finally execute the COPY command to the file with this method: 
copyManager.copyOut("COPY (" + query + ") TO STDOUT WITH (FORMAT CSV)", fileOutputStream); 

이 방법은 수퍼 유저로 전환 할 필요가 없습니다 올바르게 CSV

+0

데이터베이스에서 열의 이름을 가져 오는 방법은 무엇입니까? –

+1

@PenaPintada http://stackoverflow.com/questions/1054984/how-can-i-get-column-names-from-a-table-in-sql-server – MaxMarchuk

관련 문제