上周遇到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. [PHP] 控制反转依赖注入的日常使用

    控制反转:控制权交给了自己的类 依赖注入:依赖另一个类,我没有手动去new它 <?php /*我自己要用的类*/ class User { private $name; private $age ...

  2. [Go] golang的range循环遍历通道

    range循环会无限在channels上面迭代 package main import ( "fmt" "time" ) func main() { //创建一 ...

  3. Hdu 3001 Travelling 状态DP

    题目大意 一次旅游,经过所有城市至少一次,并且任何一座城市访问的次数不能超过两次,求最小费用 每个城市最多访问两次,用状态0,1,2标识访问次数 把城市1~N的状态按照次序连接在一起,就组成了一个三进 ...

  4. Android Studio 关于沉浸式状态栏

    values-v19/style.xml <style name="AppTheme" parent="Theme.AppCompat.Light.NoAction ...

  5. prufer序列笔记

    prufer序列 度娘的定义 Prufer数列是无根树的一种数列.在组合数学中,Prufer数列由有一个对于顶点标过号的树转化来的数列,点数为n的树转化来的Prufer数列长度为n-2. 对于一棵确定 ...

  6. 上传漏洞总结-upload-labs

    介绍: Upload-labs是一个所有类型的上传漏洞的靶场 项目地址:https://github.com/c0ny1/upload-labs 思维导图: 小试牛刀: Pass-01 客户端js检查 ...

  7. offic|集成|协同OA|移动办公|

    随着互联网时代的日新月异,移动通讯技术的飞速发展,移动网络技术的更新换代,手机.平板电脑等移动设备越来越智能化.越来越多样化,人们对移动办公的需求也在日益增长.在此背景下北京博信施科技有限公司自主研发 ...

  8. IEC104协议规约解析

    一.四遥信息体基地址范围 104调度规约有1997年和2002年两个版本,在流程上没有什么变化,02版只是在97版上扩展了遥测.遥信等信息体基体址,区别如下: 类别 1997版基地址 2002版基地址 ...

  9. Parcelable encountered IOException writing serializable object

    异常: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object 这是在in ...

  10. Android Studio获取开发版SHA1值和发布版SHA1值的史上最详细方法

    前言: 今天我想把百度地图的定位集成到项目中来,想写个小小的案例,实现一下,但在集成百度地图时首先要申请秘钥,申请秘钥要用到SHA1值,所以今天就来总结一下怎样去获取这个值吧,希望对大家有帮助. 正常 ...