zoukankan      html  css  js  c++  java
  • 工作小结: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');

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

  • 相关阅读:
    CSS3—— 2D转换 3D转换 过渡 动画
    CSS3——边框 圆角 背景 渐变 文本效果
    CSS3——表单 计数器 网页布局 应用实例
    CSS3——提示工具 图片廓 图像透明 图像拼接技术 媒体类型 属性选择器
    CSS3——对齐 组合选择符 伪类 伪元素 导航栏 下拉菜单
    CSS3——分组和嵌套 尺寸 display显示 position定位 overflow float浮动
    CSS3——盒子模型 border(边框) 轮廓(outline)属性 margin外边距 padding填充
    Eclipse连接数据库报错Local variable passwd defined in an enclosing scope must be final or effectively final
    数据库——单表查询
    数据库——添加,修改,删除
  • 原文地址:https://www.cnblogs.com/jianshuai520/p/10096273.html
Copyright © 2011-2022 走看看