• 工作小结:xml文件导入到oracle


    上周遇到xml文件导入到oracle数据库中,发现正常的xml转成excle格式导入,只针对于1m以下的xml文件。当xml文件太大的时候,就没有作用了。

    这时候,我找到了两种办法,一个是java,一个是数据库的存储过程,但是数据库的存储过程还有些问题,需要自己琢磨一会。

    现在就展示java的用法将xml文件导入到oracle数据库中:

      首先需要三个jar包:

    dom4j-1.6.1.jar(因为采用dom4j辅助存入,所以这个是必要的)

    jaxen-1.1.1.jar(使用dom4j解析XML时,要快速获取某个节点的数据,使用XPath是个不错的方法)

    ojdbc6.jar(和数据库打交道)

     

    jar包可以直接在maven官网中下载,方便快捷。

     导入到数据库的xml文件的格式为:

    一:DbUtil类:

    package com.wj;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    
    
    public class DbUtil {
        /**
         * @throws SQLException
         * @Title: getConnection
         * @Description: 取得Connection
         * @param @return
         * @return Connection
         * @throws
         */
        public static Connection getConnection() {
            // 加载驱动,使用反射来实现
            Connection conn = null;
            try {
                            //驱动连接
                 Class.forName("oracle.jdbc.driver.OracleDriver");
                // 连接
                 String url = "jdbc:oracle:thin:@10.10.54.44:15211:credit";
                 String username = "creditxf";  //连接数据库的用户名
                 String password = "credit";     //连接数据库的密码
                 conn = DriverManager.getConnection(url, username, password);  //进行连接
            } catch (ClassNotFoundException e) {
                
                e.printStackTrace();
            } catch (Exception e) {
                
                e.printStackTrace();
            }
            return conn;
            
        }
    
        public static void close(PreparedStatement pstmt, Connection conn) {
            try{
                if(conn !=null){
                    conn.close();
                }
            }catch(Exception  e){
            }finally{
                try{
                    if(pstmt!=null){
                        pstmt.close();
                    }
                }catch(Exception  e){
                    e.printStackTrace();
                }
            }
            
            
        }
    
    }

    二:TestXMLImport

    package com.wj;
    import java.io.File;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.Iterator;
    import java.util.List;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
     
    public class TestXMLImport {
     
        public static void main(String[] args) throws SQLException {
            // TODO Auto-generated method stub
    //        执行插入的SQL语句,
            String sql="insert into TB_SWZJ_AJNSRMD(NSRSBH, XH, NSRMC, PJND) values (?, ?, ?, ?)";
            Connection conn = null;
            PreparedStatement pstmt = null;
            try {
                conn = DbUtil.getConnection();
                pstmt = conn.prepareStatement(sql);
    //            读取xml文件存放的路径
                Document doc=new SAXReader().read(new File("D:\JAVADEMO\XML\xml\TB_SWZJ_AJNSRMD_00001.xml"));
    //            查找对应的信息,从XMl中找对应的层层关系,我的xml文件中,一开始只是Rows,然后每条数据为Row。
                List itemList= doc.selectNodes("/Rows/Row");
    //            遍历
                for(Iterator iter=itemList.iterator();iter.hasNext();){
                    Element el=(Element) iter.next();
    //                使用Element的elementText属性取值,将值一一取出来,这个没有取xml文件中TRANS_DM_TONG_INSERTDATE字段,是因为我需要
              系统时间作为时间字段,默认时间为sysdate
    String NSRSBH=el.elementText("NSRSBH"); String XH=el.elementText("XH"); String NSRMC=el.elementText("NSRMC"); String PJND=el.elementText("PJND"); // 通过pstmt赋值 pstmt.setString(1, NSRSBH); pstmt.setString(2, XH); pstmt.setString(3,NSRMC); pstmt.setString(4, PJND); pstmt.addBatch(); } pstmt.executeBatch(); // 提示 System.out.println("将XML导入数据库成功"); } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ // 关闭 DbUtil.close(pstmt,conn); } } }

    这样就可以将数据导入到数据库里面了,亲测有效。

    下面放出我困惑很久的存储过程(亲测无效,但是我依旧不知道怎么办的) 执行无结果,运行不报错:

    CREATE OR REPLACE PROCEDURE addRow(file_path VARCHAR2,log_path VARCHAR2)
     AS
     --//XML解析器
    xmlPar XMLPARSER.parser := XMLPARSER.NEWPARSER;
     --//DOM文档对象
     doc xmldom.DOMDocument;
     len integer;
     RowNodes xmldom.DOMNodeList;
     chilNodes xmldom.DOMNodeList;
     tempNode xmldom.DOMNode;
     tempArrMap xmldom.DOMNamedNodeMap;
     --================================
     --以下变量用于获取XML节点的值
     XH varchar2(20);
     NSRSBH varchar2(200);
     NSRMC varchar2(500);
     PJND varchar2(200);
     TRANS_DM_TONG_INSERTDATE TIMESTAMP(6);
     tmp integer;
     --================================
     BEGIN
       xmlPar := xmlparser.newParser;
       xmlparser.setErrorLog( xmlPar, log_path);
       xmlparser.parse(xmlPar, file_path);
       doc := xmlparser.getDocument( xmlPar );
       -- 释放解析器实例
       xmlparser.freeParser(xmlPar);
       -- 获取所有Row元素
       RowNodes := xmldom.getElementsByTagName( doc, 'Row' );
       len := xmldom.getLength( RowNodes );
       --遍历所有Row元素
       FOR i in 0..len-1
       LOOP
         --获取第i个Row
         tempNode := xmldom.item( RowNodes, i );
         --所有属性
         tempArrMap := xmldom.getAttributes(tempNode);
         --获取所有子节点
         chilNodes := xmldom.getChildNodes(tempNode);
         --获取子节点的个数
         tmp := xmldom.GETLENGTH( chilNodes );
         --获取各个子节点的值
         NSRSBH := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 0 )));
         XH := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 1 )));
         NSRMC := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 2 )));
         PJND := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 3 )));
         TRANS_DM_TONG_INSERTDATE := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 4 )));
    
         --插入数据
         INSERT INTO TB_SWZJ_AJNSRMD VALUES (NSRSBH,XH,NSRMC,PJND,TRANS_DM_TONG_INSERTDATE);
         COMMIT;
       END LOOP;
       -- 释放文档对象
       xmldom.freeDocument(doc);
       EXCEPTION
        WHEN OTHERS THEN
          DBMS_output.PUT_LINE(SQLERRM);
     END addRow;

    运行:
    call addRow('D:/DEMO/ANS.xml','D:/DEMO/xmllog.txt');

    有大哥帮小弟解决 这个问题的,小弟感激不尽。

  • 相关阅读:
    Attach Volume 操作(Part II)
    Attach Volume 操作(Part I)
    Create Volume 操作(Part III)
    Create Volume 操作(Part II)
    Linux 内核Coding Style整理
    内核工具 – Sparse 简介
    IP101A芯片默认物理地址(PHY Adress)确定
    嵌入式设备上的 Linux 系统开发
    嵌入式Linux开发系列之一: 走进嵌入式Linux的世界
    嵌入式 Linux 应用:概述
  • 原文地址:https://www.cnblogs.com/jianshuai520/p/10096273.html
Copyright © 2020-2023  润新知