2010-06-08 1 views
1

일부 응답을 얻은 후, 현재 팁은 http://www.ibm.com/developerworks/xml/library/x-tipbigdoc5.html (Listing 1. ResultSet을 XML로 변환) 및 XMLWriter for Java를 http://www.megginson.com/downloads/ 에서 사용하고있다. 기본적으로 데이터베이스에서 날짜를 읽고 문자로 파일에 씁니다. 열 이름을 사용하여 열기 및 닫기 태그를 만듭니다. 그렇게하는 동안 입력 스트림, 즉 날짜와 숫자를 두 가지 변경해야합니다.데이터베이스에서 대량의 데이터를 XML로 저장할 수있는 방법 (속도 문제, 제 3 부)

// Iterate over the set 
     while (rs.next()) { 
      w.startElement("row"); 
      for (int i = 0; i < count; i++) { 
       Object ob = rs.getObject(i + 1); 
       if (rs.wasNull()) { 
        ob = null; 
       } 
       String colName = meta.getColumnLabel(i + 1); 
       if (ob != null) { 
        if (ob instanceof Timestamp) { 
         w.dataElement(colName, Util.formatDate((Timestamp)ob, dateFormat)); 
        } 
        else if (ob instanceof BigDecimal){ 
         w.dataElement(colName, Util.transformToHTML(new Integer(((BigDecimal)ob).intValue()))); 
        } 
        else { 
         w.dataElement(colName, ob.toString()); 
        } 

       } else { 
        w.emptyElement(colName); 
       } 

      } 
      w.endElement("row"); 
     } 

결과가 to_number 명령 (예컨대 to_number(sif.ID) ID) 및 to_date 명령 (예컨대 TO_DATE (sif.datum_do, 'DD.MM.RRRR') datum_do)이 SQL 얻는다. 문제는 반환하는 날짜가 타임 스탬프이므로 즉, dd.mm.yyyy 형식으로 서식을 지정해야하므로 14.02.2010이 아니라 14.02.2010 00:00:000이되는 것을 의미합니다. 두 번째 문제는 숫자입니다. 웬일인지, 그들은 데이터베이스에 varchar2와 같은 스트립 된 필요가 선행 0을 가질 수 있습니다;

public static String transformToHTML(Integer number) { 
String result = ""; 
try { 
    result = number.toString(); 
} catch (Exception e) {} 
return result; 

} 내가 알고 싶습니다 무엇

가 이다 : 나는 Util.transformToHTML 불필요한 그래서 나는 trim 기능 내 SQL에서 그렇게 할 수 같은데요 (설명을 위해, 여기에 방법입니다) a) 원하는 형식으로 날짜를 가져와 추가 처리를 건너 뛸 수 있으므로 처리 시간을 단축 할 수 있습니까? b) 더 좋은 방법이 있나요? 우리는 50MB - 250MB 파일 크기 범주에있는 XML 파일에 대해 이야기하고 있습니다.

답변

0

귀하의 질문에 대한 정확한 답변을 드릴 수 없지만 castor project을 살펴보아야 할 경우 죄송합니다. xml-data를 java 객체로 데이터베이스 영속성으로, 그 반대로도 전송할 수있는 매우 우수한 API를 제공합니다. 당신은 MSSQL을 사용하는 경우

+0

나는 그것을 조사 할 것이다, tnx. – Andrija

0

당신은 당신 날짜 문제에 대해 다음을 시도해야합니다 :

SELECT CONVERT(VARCHAR(10), sif.datum_do, 104) AS datum_do_format 

를 두 번째 문제를 들어 내가 지금 해결책이없는, 미안 해요.

+0

DB 내부의 형 변환이 코드보다 빠르다는 것은 확실하지 않습니다. XML 파일에서 무엇을하는지, 어디에 위치하는지에 따라 다릅니다. – eugeneK

+0

글쎄, 내가 파일을 생성 한 후에, 그것은 압축되어 사람들은 그것을 다운로드 할 수 있다고 이메일을 통해 통보 받는다. – Andrija

3

SQLXML 또는 dbms_xmlgen을 사용해 보셨습니까? 아마 더 빠른 방법 일 것이고 결과를 Blob로 얻을 수 있습니다. dbms_xmlgen의 출력은 출력과 매우 유사합니다. 예 (출처 : http://awads.net/wp/2005/12/19/producing-xml-from-sql-using-cursor-expressions/가) :

보시다시피
select dbms_xmlgen.getxml(' 
    2   select department_name 
    3   from departments 
    4   where department_id in (20,110) 
    5   ') xml 
    6 from dual 
    7/

XML 
-------------------------------------------------- 
<?xml version="1.0"?> 
<ROWSET> 
<ROW> 
    <DEPARTMENT_NAME>Marketing</DEPARTMENT_NAME> 
</ROW> 
<ROW> 
    <DEPARTMENT_NAME>Accounting</DEPARTMENT_NAME> 
</ROW> 
</ROWSET> 

select xmlelement ("company", 
      xmlagg (xmlelement ("department", 
      xmlelement ("name", dept.department_name), 
      xmlelement ("emps", 
      (select xmlagg (xmlelement ("employee", 
       xmlattributes (emp.employee_id as "id"), 
       xmlforest (emp.first_name as "first_name"))) 
      from employees emp 
      where emp.department_id = dept.department_id) 
         ) 
        ) 
      ) 
     ).getClobVal() xml 
from departments dept 

<company> 
    <department> 
     <name>Marketing</name> 
     <emps> 
      <employee id = "201"> 
       <first_name>Michael</first_name> 
      </employee> 
      <employee id = "202"> 
       <first_name>Pat</first_name> 
      </employee> 
     </emps> 
    </department> 
    <department> 
     <name>Accounting</name> 
     <emps> 
      <employee id = "205"> 
       <first_name>Shelley</first_name> 
      </employee> 
      <employee id = "206"> 
       <first_name>William</first_name> 
      </employee> 
     </emps> 
    </department> 
</company> 

, 당신은 getclobval와 CLOB로 출력을 얻을 수있다(). 당신은 XML의 형식을 제어 할 경우 Simple XML을 사용할 수 있습니다

> select to_char(sysdate, 'ddmmyyyy') from dual; 

TO_CHAR(
-------- 
08062010 
> select to_number('0003') from dual; 

TO_NUMBER('0003') 
----------------- 
       3 
+0

데이터베이스에서이 작업을 수행하면 앱의 전체 로직이 변경되지만 어쨌든 제안 해 주셔서 감사합니다. to_number에 관해서는, 나는 가지고 있지만 그것은 선행 제로를 제거하지 않는다; 그것을 위해 to_char 함수, tnx를 사용하여 다시 테스트 할 것입니다. – Andrija

+0

또한 LTRIM으로 선행 0을 제거 할 수 있습니다 (예 : SELECT LTRIM ('0003', '0') FROM DUAL. – Tommi

0

: 날짜 포맷

는 앞에 0이 의미가 있다는 것을 알고 TO_CHAR 및 TO_NUMBER() 꽤 간단하다. XML 직렬화 및 비 직렬화 프레임 워크에 대해 매우 높은 성능의 Java POJO를 제공합니다. 또한 언급 한 날짜와 같은 다양한 유형의 직렬화를 가로 챌 수 있습니다. 변형을 구현함으로써 단순히 날짜 형식을 변환 할 수 있습니다. 이 자습서에서는 가능한 내용을 여기에 설명합니다 Simple.

+0

캐스터 프로젝트 제안과 마찬가지로 살펴볼 것입니다. 감사합니다. – Andrija

관련 문제