创建一个dir,用动态sql拼游标,然后xmldom生成xml文件导出。大体上是这个思路。

解决方案 »

  1.   

    -- 给你一个现成的,表名传入时,要用大写。SQL> create directory xmlfiledir as 'c:\' ;目录已创建。SQL> create user test identified by test default tablespace users ;用户已创建。SQL> grant connect , resource , dba to test ;授权成功。SQL> grant read , write on directory xmlfiledir to test ;授权成功。SQL> conn test/test
    已连接。SQL> create table x as select * from dba_objects where rownum<10;表已创建。
    SQL> create or replace procedure gen_xml_bytname(p_tname varchar2)
      2  as
      3    type type_cur is ref cursor;
      4    cur       type_cur;
      5    m_strsql  varchar2(2000);
      6    m_rowinfo varchar2(2000);
      7    hfile Utl_File.file_type  ;
      8    dwCount int := 0 ;
      9  begin
     10    m_strsql := 'select ';
     11    for x in (select cname from col where tname = p_tname) loop
     12      m_strsql := m_strsql || '''<' || x.cname || '>'' || ' || x.cname || ' |
    | ''</' || x.cname || '>'' || chr(10) ||' ;
     13    end loop;
     14    m_strsql := substr( m_strsql ,1,length(m_strsql) -2) || ' as c  from ' ||
     p_tname;
     15    dbms_output.put_line(m_strsql) ;
     16
     17    open cur for m_strsql;
     18    hfile := Utl_file.fopen('XMLFILEDIR',p_tname || '.xml','W') ;
     19    utl_file.put_line(hfile,'<?xml version="1.0" encoding="utf-8"?>  ');
     20    utl_file.put_line(hfile,'<' || p_tname  || '>');
     21    loop
     22      fetch cur into m_rowinfo;
     23      exit when cur%notfound;
     24      dwCount := dwCount + 1 ;
     25      utl_file.put_line(hfile,'<rowno>' || dwCount || '</rowno>');
     26      utl_file.put_line(hfile,m_rowinfo);
     27    end loop;
     28    utl_file.put_line(hfile,'<' || p_tname || '>');
     29    utl_file.fclose_all;
     30    close cur;
     31  end;
     32  /过程已创建。SQL> call gen_xml_bytname('X');调用完成。SQL> exit
    从 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options 断
    开C:\Documents and Settings\Administrator>type c:\x.xml
    <?xml version="1.0" encoding="utf-8"?>
    <X>
    <rowno>1</rowno>
    <OWNER>SYS</OWNER>
    <OBJECT_NAME>ICOL$</OBJECT_NAME>
    <SUBOBJECT_NAME></SUBOBJECT_NAME>
    <OBJECT_ID>20</OBJECT_ID>
    <DATA_OBJECT_ID>2</DATA_OBJECT_ID>
    <OBJECT_TYPE>TABLE</OBJECT_TYPE>
    <CREATED>02-4月 -10</CREATED>
    <LAST_DDL_TIME>02-4月 -10</LAST_DDL_TIME>
    <TIMESTAMP>2010-04-02:13:18:38</TIMESTAMP>
    <STATUS>VALID</STATUS>
    <TEMPORARY>N</TEMPORARY>
    <GENERATED>N</GENERATED>
    <SECONDARY>N</SECONDARY>
    <NAMESPACE>1</NAMESPACE>
    <EDITION_NAME></EDITION_NAME>
    ...................
    ...................
    <rowno>9</rowno>
    <OWNER>SYS</OWNER>
    <OBJECT_NAME>I_CDEF2</OBJECT_NAME>
    <SUBOBJECT_NAME></SUBOBJECT_NAME>
    <OBJECT_ID>54</OBJECT_ID>
    <DATA_OBJECT_ID>54</DATA_OBJECT_ID>
    <OBJECT_TYPE>INDEX</OBJECT_TYPE>
    <CREATED>02-4月 -10</CREATED>
    <LAST_DDL_TIME>02-4月 -10</LAST_DDL_TIME>
    <TIMESTAMP>2010-04-02:13:18:38</TIMESTAMP>
    <STATUS>VALID</STATUS>
    <TEMPORARY>N</TEMPORARY>
    <GENERATED>N</GENERATED>
    <SECONDARY>N</SECONDARY>
    <NAMESPACE>4</NAMESPACE>
    <EDITION_NAME></EDITION_NAME><X>C:\Documents and Settings\Administrator>
      

  2.   


    谢谢高手指点,试了一下,但是报ORA-06502和ORA-06512的错,忽略后可以继续执行成功,但是报错是哪里的问题啊,求解!
      

  3.   

    代码放下载了,名字是给wmxcn2000,谢谢帮忙!
      

  4.   

    1. 你把 m_rowinfo varchar2(2000) 的长度改成 32000 ,应该太短了
    2.确认你这张表,没有 lob 类型的字段。
      

  5.   

    确定表里都没有lob类型,长度改了,但是仍然报错,列数较少的没问题,但是实验了几个列数20多的表都报错。
      

  6.   

    确定表里都没有lob类型,长度改了,但是仍然报错,列数较少的没问题,但是实验了几个列数20多的表都报错。
    行数多了,也报错吗?
      

  7.   

    确定表里都没有lob类型,长度改了,但是仍然报错,列数较少的没问题,但是实验了几个列数20多的表都报错。
    行数多了,也报错吗?
    行数试了20多行,列数10内的没有问题,但是行数少,列数多的报错。