工作小结: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');
有大哥帮小弟解决 这个问题的,小弟感激不尽。
工作小结:xml文件导入到oracle的更多相关文章
- 如何将XML文件导入Excel中
如下图所示为一个规范的XML文件,在Excel中可以将规范的XML文件导入到Excel成为规范的表格.具体有如下几种方法: 工具/原料 Excel 方法/步骤 单击“数据”选项卡下的“ ...
- 【DRP】採用dom4j完毕XML文件导入数据库
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/lantingxv_jing/article/details/37762523 xml文件在如 ...
- 如何将dmp文件导入到Oracle
一.概述 在将dmp文件导入到Oracle中之前,需要先创建一个orcale用户.然后使用该用户名和密码,以imp的方式将数据导入到oracle中. 二.执行步骤 1.登陆oracle数据库 a.sq ...
- 如何将dmp文件导入到oracle数据库中
如何将dmp文件导入到oracle数据库中 1.首先,我们可以先建立自己的一个用户表空间,创建表空间的格式如下: CREATE TABLESPACE certification(表空间的名字) DAT ...
- 【java项目实战】dom4j解析xml文件,连接Oracle数据库
简单介绍 dom4j是由dom4j.org出品的一个开源XML解析包.这句话太官方.我们还是看一下官方给出的解释.例如以下图: dom4j是一个易于使用的.开源的,用于解析XML,XPath和XSLT ...
- SpringIOC注入模块中xml文件导入其他xml文件配置
如果我们在spring框架中配置了多个xml文件,我们可以在读取配置文件的时候把这些xml文件一下全都读取 也可以只读一个总的xml文件,在这个总的xml文件中把其他的xml全都都导入进来. 例如: ...
- Excel和XML文件导入
using System;using System.Collections;using System.Collections.Generic;using System.Configuration;us ...
- Sqoop 将hdfs上的文件导入到oracle中,关于date类型的问题
近期的项目中,需要将hadoop运行完成的结果(存在于hdfs上)导入到oracle中,但是在用sqoop导入hdfs中的日期字段'2016-03-01'时,sqoop报错,说date类型必须为'yy ...
- TXT文件导入到ORACLE数据库中
--创建表 (sqlplus执行) drop table cjw; ),phone ),city ),born ),adressJob ),mail )); ### txt导入到oracle cat ...
随机推荐
- .NET [MVC] 利用特性捕捉异常
声明:本代码只适用于.NET MVC. 先创建一个类继承ActionFilterAttribute这个抽象类以及实现IExceptionFilter接口,并实现它的方法OnException. 代码如 ...
- xdebug配置
[XDebug] ;指定性能分析文件的存放目录 xdebug.profiler_output_dir="D:\phpStudy\tmp\xdebug" xdebug.trace_o ...
- PHP中的Define和Const区别
我们经常把不经常变的值定义成常量,常量一般用全部大写来表示,前面不加美元符号,那么define和const有什么区别呢? 常量是一个简单的标识符.在脚本执行期间该值不能改变(除了所谓的魔术常量,他们其 ...
- Leetcode 807 Max Increase to Keep City Skyline 不变天际线
Max Increase to Keep City Skyline In a 2 dimensional array grid, each value grid[i][j] represents th ...
- 前端面试:谈谈 JS 垃圾回收机制
摘要: 不是每个人都回答的出来... 最近看到一些面试的回顾,不少有被面试官问到谈谈JS 垃圾回收机制,说实话,面试官会问这个问题,说明他最近看到一些关于 JS 垃圾回收机制的相关的文章,为了 B 格 ...
- 解决No 'Access-Control-Allow-Origin' header is present on the requested resource.跨域问题(后台(java)解决方法)
附:前端常见跨域解决方案(全) 跨域错误 解决方法 在后台写一个过滤器来改写请求头 附上一个前端不知所以然的后台java代码: public class CorsFilter implements F ...
- Numpy数组数据文件的读写
一.引言 读写数据文件的重要性就不必多说了. 二.读取列表形式数据的文件 1.我们写几行CSV格式(列表形式,两值之间逗号隔开)的数据. id,height,age 1,175,20 2,168,18 ...
- Android细笔记--DataStorage
Shared Preferences 即使应用被杀了,shared preference也还是存在的 Internal Storage 创建于internal的文件只对本应用开放权限,即使手机用户本身 ...
- 测者的测试技术手册:AI的自动化单元测试
测者的测试技术手册:AI的自动化单元测试 谈新技术:AI的自动化单元测试
- Docker Data Center系列(一)- 快速搭建云原生架构的实践环境
本系列文章演示如何快速搭建一个简单的云原生架构的实践环境. 基于这个基础架构,可以持续部署微服务架构的应用栈,演练敏捷开发过程,提升DevOps实践能力. 1 整体规划 1.1 拓扑架构 1.2 基础 ...