在做数据开发或者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. wiremock设置接口入参的判断条件

    一.wiremock管理台url: http://192.168.37.8:7777/__admin/swagger-ui/ 可重启测试桩,获取响应信息等操作  二.设置接口响应入参的判断条件 如当影 ...

  2. java进阶(22)--Collection接口

    一.基本概念呢 1.Collection在没有使用泛型之前的,Collection中可存储所有Object所有子类型 使用泛型后,Collection只能存储某个具体类型.   二.collectio ...

  3. Spring AOP原来是这样实现的

    Spring AOP 技术实现原理 在Spring框架中,AOP(面向切面编程)是通过代理模式和反射机制来实现的.本文将详细介绍Spring AOP的技术实现原理,包括JDK动态代理和CGLIB代理的 ...

  4. NewStarCTF 2023 公开赛道 WEEK2|CRYPTO全解

    一.滴啤 题目信息 from Crypto.Util.number import * import gmpy2 from flag import flag def gen_prime(number): ...

  5. [转帖]003、体系结构之TiKV持久化

    TiKV架构和作用 数据持久化 分布式一致性 MVCC 分布式事务 Coprocessor coprocessor : 协同处理器. 可以将一些SQL计算交给TiKV处理.不需要将TiKV所有数据通过 ...

  6. [转帖]tidb 搭建私有镜像库

    https://docs.pingcap.com/zh/tidb/stable/tiup-mirror 在构建私有云时,通常会使用隔离的网络环境,此时无法访问 TiUP 的官方镜像.因此,TiUP 提 ...

  7. [转帖]ansible 安装 K8S

    作者:山河已无恙链接:https://www.zhihu.com/question/315497851/answer/2898814729来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  8. shell补遗_一个巨简单的保证服务存活的脚本

    Shell补遗 背景 公司一台机器总是会在没有更新补丁的情况下启动失败. 查看所有的配置都没有问题. 但是就是不启动 没办法,准备写一个检查进行启动. 最近写shell很少. 所以总结一下. 思路 判 ...

  9. 混沌测试平台 Chaos Mesh

    混沌测试平台 Chaos Mesh Chaos Mesh 是PingCap团队研发的一款用于测试kubernetes环境的工具.通过人为地在集群中注入故障来检测集群对故障的处理以及恢复能力.更详细信息 ...

  10. 一文详解 Netty 组件

    作者:京东物流 张弓言 一.背景 Netty 是一款优秀的高性能网络框架,内部通过 NIO 的方式来处理网络请求,在高负载下也能可靠和高效地处理 I/O 操作 作为较底层的网络通信框架,其被广泛应用在 ...