在得到一些回复之后,目前的情况是我正在使用这个技巧:http://www.ibm.com/developerworks/xml/library/x-tipbigdoc5.html(清单1.将ResultSet转换为XML),以及来自http://www.megginson.com/downloads/的XMLWriter for Java 。基本上,它从数据库中读取日期并将它们作为字符写入文件,使用列名创建开始和结束标记。在这样做时,我需要对输入流进行两处更改,即日期和数字。
// 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");
}
获取结果的SQL具有to_number
命令(例如to_number(sif.ID) ID
)和to_date
命令(例如TO_DATE (sif.datum_do, 'DD.MM.RRRR') datum_do
)。问题是返回日期是时间戳,这意味着我没有得到14.02.2010
而是14.02.2010 00:00:000
所以我必须将其格式化为dd.mm.yyyy
格式。第二个问题是数字;由于某种原因,它们在数据库中为varchar2
并且可以具有需要被剥离的前导零;我猜我可以使用trim
函数在我的SQL中执行此操作,因此Util.transformToHTML
是不必要的(为了澄清,这是方法):
public static String transformToHTML(Integer number) {
String result = "";
try {
result = number.toString();
} catch (Exception e) {}
return result;
}
我想知道的是 a)我可以按照我想要的格式获取日期,并跳过额外的处理,从而缩短 处理时间? b)有更好的方法吗?我们讨论的是50 MB - 250 MB文件大小类别的XML文件。
答案 0 :(得分: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。
格式化日期非常简单,to_char和to_number()知道前导零是没有意义的:
> select to_char(sysdate, 'ddmmyyyy') from dual;
TO_CHAR(
--------
08062010
> select to_number('0003') from dual;
TO_NUMBER('0003')
-----------------
3
答案 1 :(得分:0)
对不起,如果我没有准确回答你的问题,你应该看一下castor project。它提供了一个非常好的API,用于将xml数据传输到java对象到数据库持久性,反之亦然。
答案 2 :(得分:0)
如果你正在使用MSSQL,你应该为你的日期问题尝试以下方法:
SELECT CONVERT(VARCHAR(10), sif.datum_do, 104) AS datum_do_format
对于你的第二个问题我现在没有解决方案,对不起。
答案 3 :(得分:0)