上周遇到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');

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

工作小结:xml文件导入到oracle的更多相关文章

  1. 如何将XML文件导入Excel中

    如下图所示为一个规范的XML文件,在Excel中可以将规范的XML文件导入到Excel成为规范的表格.具体有如下几种方法:   工具/原料   Excel 方法/步骤     单击“数据”选项卡下的“ ...

  2. 【DRP】採用dom4j完毕XML文件导入数据库

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/lantingxv_jing/article/details/37762523     xml文件在如 ...

  3. 如何将dmp文件导入到Oracle

    一.概述 在将dmp文件导入到Oracle中之前,需要先创建一个orcale用户.然后使用该用户名和密码,以imp的方式将数据导入到oracle中. 二.执行步骤 1.登陆oracle数据库 a.sq ...

  4. 如何将dmp文件导入到oracle数据库中

    如何将dmp文件导入到oracle数据库中 1.首先,我们可以先建立自己的一个用户表空间,创建表空间的格式如下: CREATE TABLESPACE certification(表空间的名字) DAT ...

  5. 【java项目实战】dom4j解析xml文件,连接Oracle数据库

    简单介绍 dom4j是由dom4j.org出品的一个开源XML解析包.这句话太官方.我们还是看一下官方给出的解释.例如以下图: dom4j是一个易于使用的.开源的,用于解析XML,XPath和XSLT ...

  6. SpringIOC注入模块中xml文件导入其他xml文件配置

    如果我们在spring框架中配置了多个xml文件,我们可以在读取配置文件的时候把这些xml文件一下全都读取 也可以只读一个总的xml文件,在这个总的xml文件中把其他的xml全都都导入进来. 例如: ...

  7. Excel和XML文件导入

    using System;using System.Collections;using System.Collections.Generic;using System.Configuration;us ...

  8. Sqoop 将hdfs上的文件导入到oracle中,关于date类型的问题

    近期的项目中,需要将hadoop运行完成的结果(存在于hdfs上)导入到oracle中,但是在用sqoop导入hdfs中的日期字段'2016-03-01'时,sqoop报错,说date类型必须为'yy ...

  9. TXT文件导入到ORACLE数据库中

    --创建表 (sqlplus执行) drop table cjw; ),phone ),city ),born ),adressJob ),mail )); ### txt导入到oracle cat ...

随机推荐

  1. docker 创建mysql镜像,并成功进行远程连接

    1.安装 1.1 拉取镜像 docker pull mysql 拉取成功可以验证一下 docker images 1.2 创建并启动一个mysql容器 docker run --name ly-mys ...

  2. c# API接收Base64转图片

    /// <summary> /// API接收Base64转图片 /// </summary> /// <param name="Img">图片 ...

  3. Java开发笔记(七十三)常见的程序异常

    一个程序开发出来之后,无论是用户还是程序员,都希望它稳定地运行,然而程序毕竟是人写的,人无完人哪能不犯点错误呢?就算事先考虑得天衣无缝,揣着一笔巨款跑去岛国买了栋抗震性能良好的海边别墅,谁料人算不如天 ...

  4. Eclipse Ctrl+Space 无法工作的问题

    Window->preference->Keys 然后找到content Assist,然后重新设置为自己想要的Short cut 就好了

  5. iptables配置管理

    iptables规则 内核netfilter的规则: iptables的规则: 基本操作 实践:往iptables中插入一条规则:禁止基于端口号为22的所有客户端访问(等于是禁止基于SSH的客户端连接 ...

  6. C#设计模式之二十一访问者模式(Visitor Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第九个模式,该模式是[访问者模式],英文名称是:Visitor Pattern.如果按老规矩,先从名称上来看看这个模式,我根本不能获得任何对理解该模式有用的 ...

  7. 【代码笔记】Web-CSS-CSS Positioning

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  8. 后端开发者的Vue学习之路(五)

    目录 上节内容回顾 使用第三方组件库 如何发起请求 请求错误处理 请求带参 以get的方式带参: 以post的方式带参: 封装处理 请求的配置 axios实例 实现调用自定义函数来发起请求 抽取axi ...

  9. Dynamics CRM图表高级话题:创建跨实体的图表

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复147或者20150728可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 制作图表你会发现,在界面上只能选 ...

  10. RecycleView设置顶部分割线(记录一个坑)

    大家都知道,想给RecycleView设置分割线可以重写RecyclerView.ItemDecoration 项目过程中,遇到一个需求:RecycleView顶部有一条灰色的间隔,我想到了给Recy ...