在做数据开发或者ETL工作中,经常会遇到需要在客户端将Oracle数据库中的某些表的数据导出,提供给其他人员使用的情况。

     下面介绍我之前实施的一种方法:(该方法不是最好的办法,但是可以勉强使用,仅供参考)

实现逻辑:

1、编写Java程序(DBToFile.java),读取配置文件中的数据库连接信息,将表中的数据查询出来,并生成文件;

2、通过shell脚本(run-KF00001.sh、run-KF00002.sh)设置Java程序中需要的环境变量信息,并执行java程序;

3、通过启动脚本(run-day.sh),依次执行第2步的多个shell脚本。

一、编写java程序(DBToFile.java)

import java.io.File;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Properties;
import java.util.Iterator;
import java.util.Map.Entry; public class DBToFile {
public final static int PREPARE_OK = 0;
public final static int RET_CONF_ERROR = 10;
public final static int RET_ENV_ERROR = 15;
public final static int RET_RUNTIME_ERROR = 5;
public final static String DBTF_SQL = "DBTF_SQL";
public final static String DBTF_OUTPUT_DIR = "DBTF_OUTPUT_DIR";
public final static String DBTF_OUTPUT_FILE = "DBTF_OUTPUT_FILE";
public final static String DBTF_OUTPUT = "DBTF_OUTPUT";
public final static String JDBC_CLASS_NAME = "oracle.jdbc.driver.OracleDriver";
public final static String CONFIG_FILE = "DBToFile.conf";
public final static char SEPARATOR = 0x01;
//
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
// public static void main(String[] args) {
File outputFile = null;
BufferedWriter bw = null;
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//
StringBuffer sb = null;
int rowCount = 0;
long tt = 0L; Properties props = new Properties();
int ret = loadConf(props);
if (PREPARE_OK != ret) {
System.exit(ret);
}
ret = loadEnv(props);
if (PREPARE_OK != ret) {
System.exit(ret);
}
showProperties(props);
//data transfer
try {
tt = System.currentTimeMillis();
outputFile = new File(props.getProperty(DBTF_OUTPUT) + ".avl");
bw = new BufferedWriter(new FileWriter(outputFile));
conn = getConn(props);
conn.createStatement();
stmt = conn.createStatement();
rs = stmt.executeQuery(props.getProperty(DBTF_SQL));
int count = rs.getMetaData().getColumnCount();
String v = null;
while (rs.next()) {
sb = new StringBuffer();
for (int i = 1; i <= count; i++) {
v = rs.getString(i);
if (null == v) {
v = "";
} else {
v = v.replaceAll("\r|\n", " ").trim();
}
sb.append(v);
if (i < count) {
sb.append(SEPARATOR);
}
}
bw.write(sb.toString());
bw.newLine();
rowCount++;
}
bw.flush();
tt = System.currentTimeMillis() - tt;
writeCheckFile(props.getProperty(DBTF_OUTPUT), props.getProperty(DBTF_OUTPUT_FILE), rowCount, outputFile.length());
log("Output " + rowCount + " rows, " + outputFile.length() + " bytes, within " + tt + " ms.");
} catch (IOException ioe) {
ioe.printStackTrace();
log("Output File Error");
System.exit(RET_RUNTIME_ERROR);
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
log("Java CLASSPATH Error");
System.exit(RET_RUNTIME_ERROR);
} catch (SQLException sqle) {
sqle.printStackTrace();
log("DB Error");
System.exit(RET_RUNTIME_ERROR);
} finally {
CloseWriter(bw);
closeConn(conn);
}
} private static void writeCheckFile(String n, String nn, int c, long s) {
try {
FileWriter writer = new FileWriter(n + ".chk", false);
writer.write(nn + "," + c + "," + s);
writer.close();
} catch (IOException ioe) {
ioe.printStackTrace();
log("Output Check File Error");
}
} public static int loadEnv(Properties p) {
Map<String, String> env = System.getenv();
String v = env.get(DBTF_SQL);
if (null == v || v.length() < 10) {
log("Env DBTF_SQL Error");
return RET_ENV_ERROR;
} else {
p.put(DBTF_SQL, v.trim());
}
String d = env.get(DBTF_OUTPUT_DIR);
if (null == d || d.length() < 0) {
log("Env DBTF_OUTPUT_DIR Error");
return RET_ENV_ERROR;
}
File f = new File(d);
if (!f.exists() || !f.isDirectory()) {
log("Env DBTF_OUTPUT_DIR Error");
return RET_ENV_ERROR;
} else {
String n = env.get(DBTF_OUTPUT_FILE);
if (null == n || n.length() < 1) {
log("Env DBTF_OUTPUT_FILE Error");
return RET_ENV_ERROR;
} else {
p.put(DBTF_OUTPUT_DIR, d.trim());
p.put(DBTF_OUTPUT_FILE, n.trim());
p.put(DBTF_OUTPUT, d.trim() + n.trim());
}
}
return PREPARE_OK;
} public static int loadConf(Properties p) {
FileInputStream fis = null;
String v;
try {
fis = new FileInputStream(CONFIG_FILE);
p.load(fis);
fis.close();
v = p.getProperty("DB_URL");
if (null == v || v.length() < 7) {
log("Config File DB_URL Error");
return RET_CONF_ERROR;
}
v = p.getProperty("DB_USERNAME");
if (null == v || v.length() < 1) {
log("Config File DB_USERNAME Error");
return RET_CONF_ERROR;
}
v = p.getProperty("DB_PASSWORD");
if (null == v || v.length() < 4) {
log("Config File DB_PASSWORD Error");
return RET_CONF_ERROR;
}
return PREPARE_OK;
} catch (IOException ioe) {
ioe.printStackTrace();
log("Config File Error");
return RET_CONF_ERROR;
} finally {
fis = null;
}
} public static void CloseWriter(BufferedWriter bw) {
try {
if (null != bw) {
bw.close();
}
} catch(IOException e) {
e.printStackTrace();
}
} public static Connection getConn(Properties p) throws ClassNotFoundException, SQLException {
Class.forName(JDBC_CLASS_NAME);
return DriverManager.getConnection(
p.getProperty("DB_URL"),
p.getProperty("DB_USERNAME"),
p.getProperty("DB_PASSWORD"));
} public static void closeConn(Connection conn) {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
conn = null;
}
} private static void showProperties(Properties prop) {
Iterator<Entry<Object, Object>> it = prop.entrySet().iterator();
while (it.hasNext()) {
Entry<Object, Object> entry = it.next();
log(entry.getKey() + ":" + entry.getValue());
}
} private static void log(String s) {
String d = sdf.format(new Date());
System.out.println("<" + d + ">" + s);
} }

配置文件(DBToFile.conf)

DB_URL=jdbc:oracle:thin:@10.32.8.195:1521:orcl
DB_USERNAME=scott
DB_PASSWORD=scott
LOG_LEVEL=DEBUG

上面的Java程序,需要编译成class文件。

javac  DBToFile.java

二、编写运行shell脚本(run-KF00001.sh、run-KF00002.sh)

#!/bin/bash

export LANG="zh_CN.UTF-8"
export THE_LAST_DAY=`date -d yesterday +%Y%m%d` export BIANHAO="KF00001"
export DBTF_SQL="select * from V_COMPLAINT_ALERT_INTERFACE where DATE_STAMP = "$THE_LAST_DAY
export DBTF_OUTPUT_DIR="/srv/BigData/bdkfsj/"$THE_LAST_DAY"/" export DBTF_OUTPUT_FILE=$BIANHAO$THE_LAST_DAY
export JAVA_HOME=/srv/BigData/bdkfsj/jdk1.7.0_71
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/mylib/ojdbc6.jar cd /srv/BigData/bdkfsj/bin/
java DBToFile
RET=$?
if [ $RET -ne 0 ]; then
echo "Generate Data File FAILED, ERROR_ID = $RET"
exit 2
else
exit 0
fi

备注:1、运行shell脚本的服务器必须要安装jdk,并配置好环境变量;

2、CLASSPATH中需要使用odbc6.jar,这里我是放在 $JAVA_HOME/mylib/ 目录下。

三、编辑启动shell脚本(run-day.sh)

#!/bin/bash

export THE_NEW_DIR=/srv/BigData/bdkfsj/`date -d yesterday +%Y%m%d`
mkdir $THE_NEW_DIR /srv/BigData/bdkfsj/bin/run-KF00001.sh
/srv/BigData/bdkfsj/bin/run-KF00002.sh
/srv/BigData/bdkfsj/bin/run-KF00003.sh
/srv/BigData/bdkfsj/bin/run-KF00004.sh
/srv/BigData/bdkfsj/bin/run-KF00005.sh
/srv/BigData/bdkfsj/bin/run-KF00006.sh
/srv/BigData/bdkfsj/bin/run-KF00007.sh
/srv/BigData/bdkfsj/bin/run-KF00008.sh
/srv/BigData/bdkfsj/bin/run-KF00009.sh
/srv/BigData/bdkfsj/bin/run-KF00010.sh

四、设置定时作业,每天凌晨1点钟执行导出任务。

crontab   -e

0 1 * * * sh /srv/BigData/bdkfsj/bin/run-day.sh 

5、预期结果

(1)每天会自动生成一个日期目录,这里是生成前一天的日期。(可以在run-day.sh中修改生成目录的日期)

(2)会自动导出的数据生成到avl文件中,同时生成chk文件(存放文件名,记录数,文件大小)用来做校验,防止数据确实不完整。

(3)可以通过vi命令查看导出的avl数据文件,文件是已^A作为分隔符。

(4)通过cat命令可以查看chk校验文件信息。

文件名为:KF0000120201115,记录数: 44, 文件大小:951

Java-将Oracle中某个表的数据导出成数据文件的更多相关文章

  1. Pl/sql 如何将oracle的表数据导出成excel文件?

    oracle将表数据导出成excel文件的方法 1)在SQL窗体上,查询需要导出的数据 --查询数据条件-- ; 结果视图 2)在查询结果的空白处,右键选择Copy to Excel 3) 查看导出e ...

  2. mysql中数据导出成excel文件语句

    代码如下 复制代码 mysql>select * from xi_table into outfile ’d:test.xls’; 导出为txt文件:  代码如下 复制代码 select * f ...

  3. dataview将excel表格的数据导出成txt文件

    有时候需要处理大量的数据,且这些数据又存在于excel表格内,在平时的时候,我是非常喜欢这样的数据的,因为只要是excel表格内的数据,处理起来的方法就很方便.也可能我平时遇见的数据总是以一种杂乱无章 ...

  4. 数据库数据导出成XML文件

    在数据库中,怎样把库中的数据导出XML文件, sql语句如下: SELECT *  FROM 表名 FOR XML AUTO, ELEMENTS

  5. es实战之数据导出成csv文件

    从es将数据导出分两步: 查询大量数据 将数据生成文件并下载 本篇主要是将第二步,第一步在<es实战之查询大量数据>中已讲述. csv vs excel excel2003不能超过6553 ...

  6. python导出oracle中的表内容,并生成excel文件

    export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK; ### 如果oracle表中有中文输出,为防止乱码,执行脚本前,需要先制定字符集: #!/usr/bin/pyth ...

  7. vue.js纯前端处理如何将后台返回来的csv数据导出成csv文件

    需要实现一个下载csv文件的功能,但后台没有对这个下载文件进行处理,而是将csv数据传给前台而已,需要前台做一下处理. 这是按钮的代码: <a> <el-button size=&q ...

  8. 安卓端数据导出成txt文件

    toExport() { if (this.dataList == false) { this.$createDialog({ type: "alert", content: &q ...

  9. plsql 把数据导出成为 .sql文件,记住了

    今天上午,同事 提醒我.可以直接把数据导出成 .sql 文件,类似于 反编译.见下图

  10. 向oracle中的表插入数据的方法

    向oracle中的表插入数据的方法有以下几种: 假设表名为User 第一种方法:select t.*,rowid from User t;-->点击钥匙那个标记就可向表中添加数据 第二种方法:s ...

随机推荐

  1. Vue项目实现导入导出Excel表格功能

    前提:在我的项目中我使用的是ElementUi前端UI框架,用到的是里面的Upload上传组件. 第一步:需要安装三个依赖 npm install -S file-saver xlsx  (这里其实安 ...

  2. webpack4.0+简要

    一.webpack简介 webpack 是当下十分流行的一款静态模块打包工具,将JS.CSS.HTML.图片等各种静态资源视为一个个模块,通过一个或者多个入口文件通过解析依赖关系生成一个依赖图,最终打 ...

  3. freeswitch的ACL规则

    概述 freeswitch是一款好用的VOIP开源软交换平台. VOIP公共网络中的安全问题是最重要的问题,我们必须对网络端口的访问权限做出限制. ACL全称Access Control List,意 ...

  4. keystore 与 trust store 的区别 及 keytool 常用命令

    本文为博主原创,未经允许不得转载: 1. key store 与 trust store 区别 2. java 配置 单向认证与双向认证的过程 3. key store 与 trust store 常 ...

  5. Java 如何将Excel转换为TXT文本格式

    TXT文件是一种非常简单.通用且易于处理的文本格式.在处理大规模数据时,将Excel转为TXT纯文本文件可以提高处理效率.此外,许多编程语言和数据处理工具都有内置的函数和库来读取和处理TXT文件,因此 ...

  6. [转帖]Linux中的inode到底是什么

    https://www.jianshu.com/p/6aa4d7ef17de inode 是什么? 要了解 Linux 操作系统上的 inode 前,我们先来说说 Linux操作系统上的文件.对于 L ...

  7. [转帖]Kafka高可用 — KRaft集群搭建

    Apache Kafka Raft 是一种共识协议,它的引入是为了消除 Kafka 对 ZooKeeper 的元数据管理的依赖,被社区称之为 Kafka Raft metadata mode,简称 K ...

  8. [转帖]Intel“革命性”X86s架构,带来哪些颠覆及影响?

    https://www.eet-china.com/mp/a221822.html 英特尔发布了一份新的白皮书(Intel X86-S扩展架构规格),计划简化其处理器指令集架构(ISA).英特尔提供了 ...

  9. 【转帖】Linux性能优化(四)——BCC性能监控工具

    一.BCC简介 1.BCC简介 BCC是一个Python库,简化了eBPF应用的开发过程,并收集了大量性能分析相关的eBPF应用.BCC为BPF开发提供了不同的前端支持,包括Python和Lua,实现 ...

  10. MAT的简单学习

    背景说明 Java遇到问题之后比较浅层的跟踪解决办法: jps 查看进程的main jar包 对应的进程信息 jstack 查看 堆栈信息 top -Hp PID 实时查看具体的CPU进程信息. 如果 ...