ORACLE10导出XML

1.安装xmldom,方法如下:
  先在oem中手动创建一个名字为"XDB_TS"的表空间
  在oracle服务器上,在命令行中切换到F:\oracle\product\10.2.0\db_1\RDBMS\ADMIN目录,执行如下命令安装xmldom包。
  sqlplus /nolog
  sql>connect sys/pwd@sid as sysdba;
  sql>@catqm.sql password XDB_TS TEMP
  命令格式:catqm.sql xdb数据库用户的密码 xdb数据库用户的表空间 xdb数据库用户的临时表空间
  详细见:http://www.stanford.edu/dept/itss/docs/oracle/10g/appdev.101/b10790/appaman.htm#CACIBCBA

2. GRANT javauserpriv to 当前用户;
   GRANT javasyspriv to 当前用户;
   以sys用户登陆执行以下语句:
   GRANT EXECUTE ON xmldom TO public;

3. 存储过程如下:
   

Sql代码
CREATE OR REPLACE PROCEDURE Pr_Frame_Xml_Gen IS 
  /******************************************************************************  
  利用job来调度该存储过程将公共数据库的统计数据生成为<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">xml</B>文件,以便多维分析系统生成饼图数据。  
  作者:李凯飞  
  编写时间:2009-08-05  
  ******************************************************************************/  
  workload_file_30 VARCHAR2(128) := 'f:\dwfx_xml\frame.<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">xml</B>';  
  currentFLMC      VARCHAR2(128);  
  CURSOR cur_mc IS 
    SELECT DISTINCT 名称 FROM frame;  
  CURSOR cur IS 
    select 名称, 分类名称, 人数  
      FROM frame  
     WHERE 名称 = currentFLMC  
     ORDER BY 分类名称 DESC;  
  personRow cur%ROWTYPE; --获取游标的行变量  
  doc       xmlDom.DOMDocument := xmldom.newDOMDocument; -- 创建文档对象  
  main_node xmlDom.DOMNode := xmldom.makeNode(doc); -- 获得文档节点  
  root_elmt xmlDom.DOMElement := xmldom.createElement(doc,  
                                                      '多维分析展示系统'); -- 创建根元素  
  --==================================================  
  --以下定义元素  
  tjfs_elmt xmlDom.DOMElement; --定义统计方式元素  
  fl_elmt   xmlDom.DOMElement; --定义分类元素  
  --==================================================  
  --以下定义节点  
  root_node xmlDom.DOMNode; --定义统计数据节点  
  tjfs_node xmlDom.DOMNode; --定义统计方式节点  
  fl_node   xmlDom.DOMNode; --定义分类节点  
BEGIN 
  -- 向文档节点加入根节点:<多维分析展示系统></多维分析展示系统>  
  root_node := xmldom.appendChild(main_node, xmldom.makeNode(root_elmt));  
  FOR cur_tjlx_loop IN cur_mc LOOP  
    currentFLMC := cur_tjlx_loop.名称;  
    --===========================================================================--  
    --创建统计类型节点  
    --===========================================================================--  
    tjfs_elmt := xmldom.createElement(doc, '统计方式'); --创建统计数据  
    tjfs_node := xmldom.appendChild(root_node, xmldom.makeNode(tjfs_elmt));  
    xmlDom.SETATTRIBUTE(tjfs_elmt, '名称', cur_tjlx_loop.名称);  
    --===========================================================================--  
    --创建各统计类别下的统计指标项  
    --===========================================================================--  
    --打开游标  
    OPEN cur;  
    --遍历游标  
    LOOP  
      FETCH cur  
        INTO personRow;  
      EXIT WHEN cur%NOTFOUND;  
      --===========================================================================--  
      fl_elmt := xmldom.createElement(doc, '分类'); --创建分类元素  
      fl_node := xmldom.appendChild(tjfs_node, xmldom.makeNode(fl_elmt));  
      --===========================================================================--  
      --向PERSON节点加入属性下列属性  
      xmlDom.SETATTRIBUTE(fl_elmt, '分类名称', personRow.分类名称);  
      xmlDom.SETATTRIBUTE(fl_elmt, '人数', personRow.人数);  
      --===========================================================================--  
    END LOOP;  
    CLOSE cur;  
  END LOOP;  
  --写入硬盘  
  xmlDom.writeToFile(doc, workload_file_30, 'UTF-8');  
 
  --发送文件到web服务器中  
  --Pr_Ftp ( 'ftp -s:D:\gds_oemrep_xml_data\autoftp.conf' );  
EXCEPTION  
  WHEN OTHERS THEN 
    DBMS_OUTPUT.PUT_LINE(SQLERRM);  
    RAISE;  
END Pr_Frame_Xml_Gen; 

CREATE OR REPLACE PROCEDURE Pr_Frame_Xml_Gen IS
  /******************************************************************************
  利用job来调度该存储过程将公共数据库的统计数据生成为xml文件,以便多维分析系统生成饼图数据。
  作者:李凯飞
  编写时间:2009-08-05
  ******************************************************************************/
  workload_file_30 VARCHAR2(128) := 'f:\dwfx_xml\frame.xml';
  currentFLMC      VARCHAR2(128);
  CURSOR cur_mc IS
    SELECT DISTINCT 名称 FROM frame;
  CURSOR cur IS
    select 名称, 分类名称, 人数
      FROM frame
     WHERE 名称 = currentFLMC
     ORDER BY 分类名称 DESC;
  personRow cur%ROWTYPE; --获取游标的行变量
  doc       xmlDom.DOMDocument := xmldom.newDOMDocument; -- 创建文档对象
  main_node xmlDom.DOMNode := xmldom.makeNode(doc); -- 获得文档节点
  root_elmt xmlDom.DOMElement := xmldom.createElement(doc,
                                                      '多维分析展示系统'); -- 创建根元素
  --==================================================
  --以下定义元素
  tjfs_elmt xmlDom.DOMElement; --定义统计方式元素
  fl_elmt   xmlDom.DOMElement; --定义分类元素
  --==================================================
  --以下定义节点
  root_node xmlDom.DOMNode; --定义统计数据节点
  tjfs_node xmlDom.DOMNode; --定义统计方式节点
  fl_node   xmlDom.DOMNode; --定义分类节点
BEGIN
  -- 向文档节点加入根节点:<多维分析展示系统></多维分析展示系统>
  root_node := xmldom.appendChild(main_node, xmldom.makeNode(root_elmt));
  FOR cur_tjlx_loop IN cur_mc LOOP
    currentFLMC := cur_tjlx_loop.名称;
    --===========================================================================--
    --创建统计类型节点
    --===========================================================================--
    tjfs_elmt := xmldom.createElement(doc, '统计方式'); --创建统计数据
    tjfs_node := xmldom.appendChild(root_node, xmldom.makeNode(tjfs_elmt));
    xmlDom.SETATTRIBUTE(tjfs_elmt, '名称', cur_tjlx_loop.名称);
    --===========================================================================--
    --创建各统计类别下的统计指标项
    --===========================================================================--
    --打开游标
    OPEN cur;
    --遍历游标
    LOOP
      FETCH cur
        INTO personRow;
      EXIT WHEN cur%NOTFOUND;
      --===========================================================================--
      fl_elmt := xmldom.createElement(doc, '分类'); --创建分类元素
      fl_node := xmldom.appendChild(tjfs_node, xmldom.makeNode(fl_elmt));
      --===========================================================================--
      --向PERSON节点加入属性下列属性
      xmlDom.SETATTRIBUTE(fl_elmt, '分类名称', personRow.分类名称);
      xmlDom.SETATTRIBUTE(fl_elmt, '人数', personRow.人数);
      --===========================================================================--
    END LOOP;
    CLOSE cur;
  END LOOP;
  --写入硬盘
  xmlDom.writeToFile(doc, workload_file_30, 'UTF-8');

  --发送文件到web服务器中
  --Pr_Ftp ( 'ftp -s:D:\gds_oemrep_xml_data\autoftp.conf' );
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
    RAISE;
END Pr_Frame_Xml_Gen;


4. 执行后,在oracle 9i中,运行正常,在oracle10中执行 xmlDom.writeToFile时报
   ora-29280 ora-06512 SYS.UTL_FILE 路径错误.
   解决方式如下:
   1、创建你打算输出文件的目录(mkdir dwfx_xml),如:f:\dwfx_xml
   2、用文本编辑器打开x:\oracle\product\10.2.0\db_1\database\initkyy.ora文件;
   3、在后面追加如下行:
      *.utl_file_dir='F:\dwfx_xml'
   4、重新启动数据库;
   5、在sqlplus中用下面的命令检查是否生效
   SQL>  show parameter utl_file_dir;
   NAME                                 TYPE        VALUE
   ------------------------------------ ----------- --------------
   utl_file_dir                         string      F:\dwfx_xml
   如果utl_file_dir 参数的value不是你设置的目录或为空(缺省为空),则说明你的设置未生效。



5.生成后内容如下:

  

Xml代码
   <?<B style="COLOR: black; BACKGROUND-COLOR: #99ff99">xml</B> version="1.0" encoding="UTF-8"?> 
<多维分析展示系统> 
  <统计方式 名称="教职工按学历分布饼状图"> 
    <分类 分类名称="专科及以下" 人数="3650"/> 
    <分类 分类名称="硕士" 人数="1014"/> 
    <分类 分类名称="博士" 人数="907"/> 
    <分类 分类名称="本科" 人数="2019"/> 
  </统计方式> 
  <统计方式 名称="研究生政治面貌分布情况统计饼图"> 
    <分类 分类名称="中国农工民主党党员" 人数="12"/> 
    <分类 分类名称="无党派民主人士" 人数="1"/> 
    <分类 分类名称="群众" 人数="1605"/> 
    <分类 分类名称="九三学社社员" 人数="2"/> 
  </统计方式> 
</多维分析展示系统> 

   <?xml version="1.0" encoding="UTF-8"?>
<多维分析展示系统>
  <统计方式 名称="教职工按学历分布饼状图">
    <分类 分类名称="专科及以下" 人数="3650"/>
    <分类 分类名称="硕士" 人数="1014"/>
    <分类 分类名称="博士" 人数="907"/>
    <分类 分类名称="本科" 人数="2019"/>
  </统计方式>
  <统计方式 名称="研究生政治面貌分布情况统计饼图">
    <分类 分类名称="中国农工民主党党员" 人数="12"/>
    <分类 分类名称="无党派民主人士" 人数="1"/>
    <分类 分类名称="群众" 人数="1605"/>
    <分类 分类名称="九三学社社员" 人数="2"/>
  </统计方式>
</多维分析展示系统>

你可能感兴趣的:(oracle,sql,xml,Web,F#)