PLSQL_PLSQL读和写XML文件方式(案例)

简介: 2012-05-01 Created By BaoXinjian 一、写XML文件 Step1. 创建测试目录 --创建测试目录 CREATE OR REPLACE DIRECTORY bxjxml AS '/home/oracle/bxjxml'; --目录权限分配 GRA...

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_file
IS
   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

ERP技术讨论群: 288307890
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建
相关文章
|
2月前
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
79 1
|
4月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
1月前
|
XML Android开发 数据格式
Eclipse 创建 XML 文件
Eclipse 创建 XML 文件
28 2
|
1月前
|
Java Maven
maven项目的pom.xml文件常用标签使用介绍
第四届人文,智慧教育与服务管理国际学术会议(HWESM 2025) 2025 4th International Conference on Humanities, Wisdom Education and Service Management
140 8
|
2月前
|
XML JavaScript Java
java与XML文件的读写
java与XML文件的读写
31 3
|
2月前
|
XML 存储 缓存
C#使用XML文件的详解及示例
C#使用XML文件的详解及示例
116 0
|
2月前
|
XML 存储 Web App开发
查看 XML 文件
查看 XML 文件
|
3月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
70 1
|
5月前
|
XML Java 数据库
配置applicationContext.xml文件
配置applicationContext.xml文件
|
5月前
|
XML Java 数据格式
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法