上周遇到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中的Define和Const区别

    我们经常把不经常变的值定义成常量,常量一般用全部大写来表示,前面不加美元符号,那么define和const有什么区别呢? 常量是一个简单的标识符.在脚本执行期间该值不能改变(除了所谓的魔术常量,他们其 ...

  2. java_List集合及其实现类

    第一章:List集合_List接口介绍 1).特点       1).有序的: 2).可以存储重复元素: 3).可以通过索引访问: List<String> list = new Arra ...

  3. Java 学习笔记 使用synchronized实现生产者消费者模式

    说明 Object.wait()使当前的线程进入到等待状态(进入到等待队列) Object.notifyAll() 唤醒等待中的全部线程 Object.notify() 随机唤醒一个线程 代码 con ...

  4. TF.VARIABLE、TF.GET_VARIABLE、TF.VARIABLE_SCOPE以及TF.NAME_SCOPE关系

    1. tf.Variable与tf.get_variable tensorflow提供了通过变量名称来创建或者获取一个变量的机制.通过这个机制,在不同的函数中可以直接通过变量的名字来使用变量,而不需要 ...

  5. 【20190129】CSS-垂直水平居中相关

    元素居中是HTML和CSS永恒的问题,记录一下我使用的居中方法: 1. 块状元素水平居中,主要用于页面整体布局:   margin: 0 auto; 2. 文字水平居中,适用于内联元素或inline- ...

  6. 性能测试 基于Python结合InfluxDB及Grafana图表实时采集Linux多主机性能数据

    基于Python结合InfluxDB及Grafana图表实时采集Linux多主机性能数据   by:授客 QQ:1033553122 实现功能 测试环境 环境搭建 使用前提 使用方法 运行程序 效果展 ...

  7. CentOS7安装MySQL并配置账户等

    注意: 有的Centos版本默认安装了mariadb, 可以先将其卸载 检查mariadb是否安装 yum list installed | grep mariadb 卸载mariadb( all ) ...

  8. cannot be run because the QueueReader subsystem failed to load

    前阵子一数据库服务器的事务日志开始暴增,当时使用下面脚本检查发现该数据库的log_reuse_wait_desc 一直处于REPLICATION状态, 也就是说在事务复制过程中,与发布相关的事务仍未传 ...

  9. Swift代理的使用

    Swift代理的使用 协议规定了用来实现某一特定功能所必需的方法和属性. 任意能够满足协议要求的类型被称为遵循(conform)这个协议. 类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议 ...

  10. jenkins自动化工具使用教程(转)

    自动化构建.测试.部署.代码检测越来越重要.主要有一下几点原因 企业做大,项目变多,多端支持(web,h5,小程序等) 微服务提倡高内聚低耦合,项目因拆分变多 DevOps自动化运维流行 集群化,高可 ...