设为首页 收藏本站
查看: 708|回复: 0

[经验分享] 从Oracle中提取xml文档

[复制链接]

尚未签到

发表于 2016-8-8 06:42:42 | 显示全部楼层 |阅读模式
--                PACKAGE OF DBMS_SQL 游标执行流程
  --
  --                      -----------
  --                    | open_cursor |
  --                      -----------
  --                           |
  --                           |
  --                           v
  --                         -----
  --          ------------>| parse |
  --         |               -----
  --         |                 |
  --         |                 |---------
  --         |                 v         |
  --         |           --------------  |
  --         |-------->| bind_variable | |
  --         |     ^     -------------   |
  --         |     |           |         |
  --         |      -----------|         |
  --         |                 |<--------
  --         |                 v
  --         |               query?---------- yes ---------
  --         |                 |                           |
  --         |                no                           |
  --         |                 |                           |
  --         |                 v                           v
  --         |              -------                  -------------
  --         |----------->| execute |            ->| define_column |
  --         |              -------             |    -------------
  --         |                 |------------    |          |
  --         |                 |            |    ----------|
  --         |                 v            |              v
  --         |           --------------     |           -------
  --         |       ->| variable_value |   |  ------>| execute |
  --         |      |    --------------     | |         -------
  --         |      |          |            | |            |
  --         |       ----------|            | |            |
  --         |                 |            | |            v
  --         |                 |            | |        ----------
  --         |                 |<-----------  |----->| fetch_rows |
  --         |                 |              |        ----------
  --         |                 |              |            |
  --         |                 |              |            v
  --         |                 |              |    --------------------
  --         |                 |              |  | column_value         |
  --         |                 |              |  | variable_value       |
  --         |                 |              |    ---------------------
  --         |                 |              |            |
  --         |                 |<--------------------------
  --         |                 |
  --          -----------------|
  --                           |
  --                           v
  --                      ------------
  --                    | close_cursor |
  --                      ------------
  --
  ---------------

  -------------
/************************************************************************************************************
存储过程名称:up_exptoxml
参数1:XMLfilepath in varchar2  接收将要生成的文件名(可带路径)
参数2:sqlQuery in varchar2 接收用户输入的查询字符串,默认值为:"select * from stockmarket"
参数3:flag in varchar2 标志位,说明第二个参数的来源(即由用户输入还是来自于文件)默认值:
       "sql",即由用户输入
使用方法:
         1、默认方式:exec up_exptoxml(xmlfilepath) //将stockmarket表中的数据全部取出
                                                      保存到参数xmlfilepath指定的文件中
         2、用户指定查询语句方式:
            //将用户指定的查询语句所生成的结果集保存到参数xmlfilepath所指定的文件中
            1)exec up_exptoxml(xmlfilepath,'select stockname,buydate from stockmarket')
                                                
            //如果用户认为查询语句过长,直接输入不方便,也可以将语句保存成*.txt文件,
            //存储过程执行方式如下:
            2)exec up_exptoxml(xmlfilepath,'filepath,filename','file');
            该方式下存储过程将指定目录,指定文件中的sql语句读出并执行,将所生成的结果集保存到参数xmlfilepath
            所指定的文件中
功能:按照用户要求将查询结果保存为xml文件
************************************************************************************************************/
create or replace procedure up_exptoxml(XMLfilepath in varchar2, sqlQuery varchar2:='select * from stockmarket',flag varchar2:='sql') is
sqlstr_from_file clob;--保存sql查询字符串
document xmldom.DOMDocument;--文档对象
rootelement xmldom.DOMElement;--根元素
stockRecord xmldom.DOMElement;--记录
stockfield xmldom.DOMElement;--字段
l_cursor integer;--存储游标变量返回值
l_col_cot integer;--游标所包含的列数
l_desc_tab dbms_sql.desc_tab;--定义desc_tab类型的集合
tempfield dbms_sql.Varchar2_Table;--定义Varchar2_Table类型的集合
tempdate dbms_sql.Date_Table;--定义Date_Table类型的集合
tempnode xmldom.DOMNode;--定义临时节点
text xmldom.DOMText;--定义文本节点
executenum integer;--存储游标执行返回值
--fieldvalue varchar2(50);
sqlfile utl_file.file_type;
parameter exception;--自定义异常
begin
  if upper(flag)<>'SQL'and upper(flag)<>'FILE' then
     raise parameter;--如果flag参数不为上述两个选项,则抛出参数异常
  elsif upper(flag)='SQL' then
     sqlstr_from_file:=sqlQuery;
  else
     --调用存储过程以读取文件中存放的sql查询字符串
     readFile(sqlQuery,sqlstr_from_file);
  end if;
  l_cursor:=dbms_sql.open_cursor;
  dbms_sql.parse(l_cursor,sqlstr_from_file,dbms_sql.native);--解析游标
  
  dbms_sql.describe_columns(l_cursor,l_col_cot,l_desc_tab);--获取列描述信息
  for def in 1..l_col_cot loop
      if l_desc_tab(def).col_type=1 then
         tempfield(def):='';--初始化集合元素
         dbms_sql.define_column(l_cursor,def,tempfield(def),50);--定义列
      else
         tempdate(def):=sysdate;--初始化集合元素
         dbms_sql.define_column(l_cursor,def,tempdate(def));--定义列
      end if;
  end loop;
  executenum:=dbms_sql.execute(l_cursor);--执行游标
  
  document:=xmldom.newDOMDocument;--生成文档对象
  rootelement:=xmldom.createElement(document,'StockTable');--生成根元素
  loop--循环结果集(列方向)
      if dbms_sql.fetch_rows(l_cursor)>0 then
         stockrecord:=xmldom.createElement(document,'Stock');--建立临时记录元素
         for i in 1..l_col_cot loop--(循环列,行方向)
             stockfield:=xmldom.createElement(document,l_desc_tab(i).col_name);--建立字段元素
             if l_desc_tab(i).col_type=1 then--col_type=1 表示varchar2类型
                  --dbms_sql.define_column(l_cursor,i,tempfield(i),50);
                  dbms_sql.column_value(l_cursor,i,tempfield(i));
                  text:=xmldom.createTextNode(document,tempfield(i));
             else --col_type=12 表示date类型
                  --dbms_sql.define_column(l_cursor,i,tempdate(i));
                  dbms_sql.column_value(l_cursor,i,tempdate(i));
                  text:=xmldom.createTextNode(document,to_char(tempdate(i),'yyyy-mm-dd HH24:MI:SS'));
             end if;
             --将文本节点添加到字段节点
             tempnode:=xmldom.appendChild(xmldom.makeNode(stockfield),xmldom.makeNode(text));
             --将字段节点添加到记录节点
             tempnode:=xmldom.appendChild(xmldom.makeNode(stockrecord),xmldom.makeNode(stockfield));
         end loop;
         --将记录节点添加到根节点
         tempnode:=xmldom.appendChild(xmldom.makeNode(rootelement),xmldom.makeNode(stockrecord));
      else
          --no more row to copy
          dbms_sql.close_cursor(l_cursor);--遍历游标结束,关闭游标
          exit;
      end if;
   end loop;
   --将根节点添加到文档
   tempnode:=xmldom.appendChild(xmldom.makeNode(document),xmldom.makeNode(rootelement));
   xmldom.setVersion(document,'1.0');
   xmldom.writeToFile(document,XMLfilepath);
  exception
       when parameter then
            raise_application_error(-20004,'必须以"sql"或者"file"方式指定sql语句的来源');
       when others then
            if dbms_sql.is_open(l_cursor) then
               dbms_sql.close_cursor(l_cursor);
            end if;
            raise_application_error(-20005,'未知异常,游标已关闭!');
end up_exptoxml;
/

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-254420-1-1.html 上篇帖子: Oracle解释xml文档存入数据库 下篇帖子: 在oracle中元素形成一个xml
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表