博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PLSQL_PLSQL读和写XML文件方式(案例)
阅读量:7043 次
发布时间:2019-06-28

本文共 5832 字,大约阅读时间需要 19 分钟。

2012-05-01 Created By BaoXinjian

一、写XML文件


Step1. 创建测试目录

--创建测试目录CREATE OR REPLACE DIRECTORY bxjxml AS '/home/oracle/bxjxml'; --目录权限分配GRANT READ, WRITE ON DIRECTORY bxjxml TO public;

 

Step2. 写文件

DECLARE   f_emp        UTL_FILE.FILE_TYPE;   v_sql        VARCHAR2 (1000);   myclob       CLOB;BEGIN   v_sql := 'SELECT   mgr.first_name manager,                      emp.first_name || emp.last_name empname,                      emp.email               FROM   hr.employees emp, hr.employees mgr              WHERE   emp.manager_id = mgr.employee_id                AND   mgr.first_name IN ('''|| 'Alberto'|| ''','''|| 'Gerald'|| ''')';   DBMS_OUTPUT.put_line (v_sql);   SELECT   DBMS_XMLGEN.GETXML (v_sql) INTO myclob FROM DUAL;   f_emp := UTL_FILE.FOPEN ('BXJXML','BXJXML.XML','W',32767);   UTL_FILE.PUT (f_emp, myclob);   UTL_FILE.FCLOSE (f_emp);END;/

Step3. 查看输出结果

 

二、读XML文件


Step.1 创建读取XML文件的Package

CREATE OR REPLACE PROCEDURE parse_xml_fileIS   p_max_size              NUMBER := DBMS_LOB.lobmaxsize;   src_offset              NUMBER := 1;   dst_offset              NUMBER := 1;   lang_ctx                NUMBER := NLS_CHARSET_ID ('UTF8');   default_csid CONSTANT   INTEGER := NLS_CHARSET_ID ('ZHS16GBK');   warning                 NUMBER;   l_file_number           PLS_INTEGER := 0;   l_count                 NUMBER;   l_bfile                 BFILE;   l_clob                  CLOB;   l_commitelement         xmldom.DOMElement;   l_parser                DBMS_XMLPARSER.Parser;   l_doc                   DBMS_XMLDOM.DOMDocument;   l_nl                    DBMS_XMLDOM.DOMNodeList;   l_n                     DBMS_XMLDOM.DOMNode;   rootnode                DBMS_XMLDOM.DOMNode;   parent_rootnode         DBMS_XMLDOM.DOMNode;   file_length             NUMBER;   block_size              BINARY_INTEGER;   l_rootnode_name         VARCHAR2 (200);   l_status                VARCHAR2 (1000);   l_recerrcode            VARCHAR2 (1000);   l_failcount             VARCHAR2 (200);   l_reccount              VARCHAR2 (200);   l_name                  VARCHAR2 (1000);   l_comments              VARCHAR2 (2000);   l_exists                BOOLEAN;   FUNCTION convertclobtoxmlelement (p_document IN CLOB)      RETURN xmldom.DOMElement   IS      x_commitelement   xmldom.DOMElement;      l_parser          xmlparser.Parser;   BEGIN      l_parser := xmlparser.newParser;      xmlparser.parseClob (l_parser, p_document);      x_commitelement :=         xmldom.getDocumentElement (xmlparser.getDocument (l_parser));      RETURN x_commitelement;   END convertclobtoxmlelement;BEGIN   UTL_FILE.fgetattr ('BXJXML','bxjxml.xml',l_exists,file_length,block_size);   IF NOT l_exists   THEN      DBMS_OUTPUT.put_line ('XML File not exist!!!');      RETURN;   END IF;   l_bfile := BFILENAME ('BXJXML', 'bxjxml.xml');   DBMS_LOB.createtemporary (l_clob, TRUE);   DBMS_LOB.open (l_bfile, DBMS_LOB.lob_readonly);   DBMS_LOB.loadclobfromfile (l_clob, l_bfile,  p_max_size, dst_offset, src_offset, default_csid, lang_ctx, warning);   l_file_number := DBMS_LOB.fileexists (l_bfile);   IF l_file_number = 0   THEN      DBMS_OUTPUT.put_line ('XML File Convert Failed!!!');      RETURN;   END IF;   DBMS_LOB.close (l_bfile);   l_parser := DBMS_XMLPARSER.newParser;   BEGIN      DBMS_XMLPARSER.parseClob (l_parser, l_clob);   EXCEPTION      WHEN OTHERS      THEN         DBMS_OUTPUT.put_Line ('XML File Not Full!!!');         RETURN;   END;   l_doc := DBMS_XMLPARSER.getDocument (l_parser);   DBMS_LOB.freetemporary (l_clob);   rootnode := xmldom.makeNode ( xmldom.getDocumentElement (xmlparser.getDocument (l_parser)) );   l_rootnode_name := xmldom.getNodeName (rootnode);   DBMS_OUTPUT.put_line ('The root node name of the XML File is :' || l_rootnode_name);   DBMS_XSLPROCESSOR.valueOf (rootnode, 'RecCount/text()', l_reccount);   DBMS_XSLPROCESSOR.valueOf (rootnode, 'FailCount/text()', l_Failcount);   DBMS_OUTPUT.put_line(   'The name of the Current Node in The File is : ' || l_rootnode_name                        || '''s elements RecCount,FailCount Value is :'|| l_reccount|| ','|| l_Failcount);   l_status := xmldom.getAttribute (xmldom.makeElement (rootnode), 'Status');   DBMS_OUTPUT.put_line(   'The name of the Current Node in The File is : '|| l_rootnode_name|| '''s elements Status Value is :'|| l_status);   l_nl := DBMS_XMLDOM.getElementsByTagName (l_doc, 'Item');   l_count := DBMS_XMLDOM.getLength (l_nl);   FOR cur_emp IN 0 .. DBMS_XMLDOM.getLength (l_nl) - 1   LOOP      l_n := DBMS_XMLDOM.item (l_nl, cur_emp);      DBMS_XSLPROCESSOR.valueOf (l_n, 'Name/text()', l_name);      DBMS_XSLPROCESSOR.valueOf (l_n, 'Comment/text()', l_comments);      parent_rootnode := DBMS_XMLDOM.getParentNode (l_n);      l_rootnode_name := xmldom.getNodeName (parent_rootnode);      l_recerrcode := xmldom.getAttribute (xmldom.makeElement (parent_rootnode),'RecErrCode');      DBMS_OUTPUT.put_line(   'Name :'|| l_name|| ' ,Comment = ' || l_comments|| ', RecErrCode = ' || l_recerrcode);   END LOOP;   DBMS_XMLPARSER.freeParser (l_parser);   DBMS_XMLDOM.freeDocument (l_doc);EXCEPTION   WHEN OTHERS   THEN      DBMS_LOB.freetemporary (l_clob);      DBMS_XMLPARSER.freeParser (l_parser);      DBMS_XMLDOM.freeDocument (l_doc);END;

 

Step2. 测试Procedure,并确认输出结果

BEGIN   parse_xml_file;EXCEPTION WHEN OTHERS THEN  DBMS_OUTPUT.put_line (SQLCODE || SQLERRM);END;--The root node name of the XML File is :Dfile--The name of the Current Node in The File is : Dfile's elements --RecCount,FailCount Value is :200,1--The name of the Current Node in The File is : Dfile's elements Status --Value is :3--Name :test1 ,Comment = BXJCOMMENT1, RecErrCode = 2901--Name :test2 ,Comment = BXJCOMMENT2, RecErrCode = 2901--Name :test3 ,Comment = BXJCOMMENT3, RecErrCode = 2902--Name :test4 ,Comment = BXJCOMMENT4, RecErrCode = 2902

 

Thanks and Regards

转载于:https://www.cnblogs.com/eastsea/p/4218229.html

你可能感兴趣的文章
note 8 字符串
查看>>
thinkphp 3.2.3 连接sql server 2014
查看>>
求曲线上的动点到直线的距离的最值
查看>>
不等式证明中的断想
查看>>
用动态观点解决问题
查看>>
dingding
查看>>
[吴恩达机器学习笔记]15非监督学习异常检测7-8使用多元高斯分布进行异常检测...
查看>>
Alpha冲刺——day2
查看>>
向数组中插入元素~~和冒泡排序~~
查看>>
Django Rest Framework
查看>>
博客内容进度插件的实现
查看>>
Codeforces Round #470 (rated, Div. 2, based on VK Cup 2018 Round 1) C.Producing Snow
查看>>
Http 缓存机制
查看>>
Android性能优化9-ANR完全解析
查看>>
C#是否简单?
查看>>
测试使用live writer
查看>>
js获取剪贴板内容
查看>>
开始学会记录
查看>>
一个技术人员35岁之前要做的10件事
查看>>
ajax提交form(文本数据以及文件上传)
查看>>