使用Oracle数据库表中的自定义XML标记生成XML文件

时间:2013-01-22 19:28:37

标签: sql xml oracle file-io plsql

我正在使用oracle数据库9ir2 我需要将一些表转换为带有自定义格式标记的xml文件。

例如: 我想从emp表中的某些列生成XML,然后生成一个名为“myxmlfile.xml”的文件,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<entity-engine-xml>
 <myxmlfile
  EMPNO="8401"
  ENAME="JHON"
  HIREDATE="1988-12-30"
  SAL="5000"
  DEPTNO="10"

 />
 <myxmlfile
    ...
 />
 <myxmlfile
    ...
 />
</entity-engine-xml>
  1. 如何使用上面的标签生成自定义XML文件,并且每次用户需要这样做时,换句话说“使用pl / sql的每个用户请求”,如何使用oracle XML函数输出自定义的所需标签?
  2. 如何将xmltype转换为varchar2 ??? ... to_char()函数无法将XMLtype转换为char。
  3. 在客户端创建XML文件的最简单方法是什么?
  4. 注意:用户应用程序在XP PC上运行,由旧的oracle开发人员工具forms6i构建。

1 个答案:

答案 0 :(得分:3)

您使用XMLELEMENT等执行此操作

select xmlelement("entity-engine-xml",
                  xmlagg(
                    xmlelement(
                      "myxmlfile", 
                      xmlattributes(empno as "EMPNO",
                                    ename as "ENAME",
                                    to_char(hiredate, 'yyyy-mm-dd') as "HIREDATE",
                                    sal as "SAL",
                                    deptno as "DEPTNO"
                                    )
                    )
                  )
                 ).getclobval()
  from emp;

how to convert xmltype to varchar2 ???

这是一个getStringVal函数。即在我上面的例子中看到我使用了getClobval。有一个getstringval()等价物。

编辑: 假脱机:

set trims on feedback off heading off long 50000 linesize 32767 pagesize 0
col c format a32767
spool c:\temp\foo.xml
select xmlelement("entity-engine-xml",
                  xmlagg(
                    xmlelement(
                      "myxmlfile", 
                      xmlattributes(empno as "EMPNO",
                                    ename as "ENAME",
                                    to_char(hiredate, 'yyyy-mm-dd') as "HIREDATE",
                                    sal as "SAL",
                                    deptno as "DEPTNO"
                                    )
                    )
                  )
                 ).transform(xmltype('<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>')) c
  from emp;
spool off