package db;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class DbUpload {
// 主方法
public static void main(String[] args) {
try {
List<DbModel> listTab = getListTab();
Map<String, List<DbModel>> map = getListCol(listTab);
db_down(listTab, map);
} catch (Exception e) {
e.printStackTrace();
}
}
// --------------- DB Start --------------------
public static List<DbModel> getListTab() throws Exception {
List<DbModel> tabList = new ArrayList<DbModel>();
// 定义了数据库连接串
String dbUrl = getProValue("DB.Url");
// 数据库的用户名
String user = getProValue("DB.NAME");
// 数据库的用户口令
String password = getProValue("DB.PASSWORD");
// 加载jdbc-odbc bridge驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");
// 与url指定的数据源建立连接
Connection c = DriverManager.getConnection(dbUrl, user, password);
// 采用Statement进行查询
PreparedStatement p = c
.prepareStatement("SELECT A.TABLE_NAME, B.COMMENTS FROM DBA_TABLES A,USER_TAB_COMMENTS B WHERE A.TABLE_NAME=B.TABLE_NAME AND OWNER=? ");
p.setString(1, user);
ResultSet r = p.executeQuery();
while (r.next()) {
DbModel model = new DbModel();
model.setTableName(r.getString(1));
model.setTableComments(r.getString(2));
tabList.add(model);
}
r.close();
p.close();
c.close();
return tabList;
}
public static Map<String, List<DbModel>> getListCol(List<DbModel> modelList)
throws Exception {
Map<String, List<DbModel>> m = new HashMap<String, List<DbModel>>();
// 定义了数据库连接串
String dbUrl = getProValue("DB.Url");
// 数据库的用户名
String user = getProValue("DB.NAME");
// 数据库的用户口令
String password = getProValue("DB.PASSWORD");
// 加载jdbc-odbc bridge驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");
// 与url指定的数据源建立连接
String sql = "SELECT DISTINCT(A.COLUMN_NAME),A.COMMENTS ,B.DATA_TYPE,B.DATA_LENGTH "
+ "FROM USER_COL_COMMENTS A, ALL_TAB_COLUMNS B "
+ "WHERE A.TABLE_NAME = B.TABLE_NAME AND A.TABLE_NAME = ?";
if (modelList.size() != 0 && modelList != null) {
for (int i = 0; i < modelList.size(); i++) {
Connection c = DriverManager.getConnection(dbUrl, user,
password);
PreparedStatement p = null;
ResultSet r = null;
List<DbModel> tabList = new ArrayList<DbModel>();
// 采用Statement进行查询
p = c.prepareStatement(sql);
p.setString(1, modelList.get(i).getTableName());
r = p.executeQuery();
while (r.next()) {
DbModel model = new DbModel();
model.setColName(r.getString(1));
model.setColComments(r.getString(2));
model.setDataType(r.getString(3));
model.setDataLength(r.getString(4));
tabList.add(model);
}
m.put(modelList.get(i).getTableName(), tabList);
r.close();
p.close();
c.close();
}
}
return m;
}
// --------------------DB End -----------------------
// -------------Properties Start-----------------------
public static String getProValue(String key) throws Exception {
Configuration config = new PropertiesConfiguration(
"filePath.properties");
String value = config.getString(key);
return value;
}
// -------------Properties End-----------------------
// -----------------------DB down start----------------------
private static void db_down(List<DbModel> tab,
Map<String, List<DbModel>> col) throws Exception {
String outputFile = getProValue("DOWN_FILE_PATH");
// 工作簿
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
String tableName = "";
String tableComments = "";
if (tab.size() != 0 && tab != null) {
for (int i = 0; i < tab.size(); i++) {
tableName = tab.get(i).getTableName();
tableComments = tab.get(i).getTableComments();
List<DbModel> colList = col.get(tableName);
// 创建sheet页
HSSFSheet hssfsheet = hssfworkbook.createSheet();
// sheet名称乱码处理
hssfworkbook.setSheetName(i, tableName);
hssfsheet.setColumnWidth(0, 20 * 256);
hssfsheet.setColumnWidth(1, 30 * 256);
hssfsheet.setColumnWidth(2, 15 * 256);
if (colList.size() != 0 && colList != null) {
//------------------表 名称 start--------------
// 取得第一行
HSSFRow hssfrow_table_title = hssfsheet.createRow(0);
HSSFCell cell_table_title_name = hssfrow_table_title.createCell((short) 0);
cell_table_title_name.setCellType(HSSFCell.CELL_TYPE_STRING);
cell_table_title_name.setCellValue(changeCharset("表名称"));
HSSFCell cell_table_title_0 = hssfrow_table_title.createCell((short) 1);
cell_table_title_0.setCellType(HSSFCell.CELL_TYPE_STRING);
cell_table_title_0.setCellValue(changeCharset(tableName));
HSSFCell cell_table_title_1 = hssfrow_table_title.createCell((short) 2);
cell_table_title_1.setCellType(HSSFCell.CELL_TYPE_STRING);
cell_table_title_1.setCellValue(changeCharset(tableComments));
//------------------表 名称 start--------------
// -------------标题 start----------------------
// 取得第一行
HSSFRow hssfrow = hssfsheet.createRow(1);
// 创建第一个单元格 并处理乱码
HSSFCell cell_t_0 = hssfrow.createCell((short) 0);
cell_t_0.setCellType(HSSFCell.CELL_TYPE_STRING);
// 对第1个单元格赋值
cell_t_0.setCellValue(changeCharset("字段"));
// 创建第1个单元格 并处理乱码
HSSFCell cell_t_1 = hssfrow.createCell((short) 1);
cell_t_1.setCellType(HSSFCell.CELL_TYPE_STRING);
// 对第1个单元格赋值
cell_t_1.setCellValue(changeCharset("注释"));
// 创建第2个单元格 并处理乱码
HSSFCell cell_t_2 = hssfrow.createCell((short) 2);
cell_t_2.setCellType(HSSFCell.CELL_TYPE_STRING);
// 对第2个单元格赋值
cell_t_2.setCellValue(changeCharset("类型"));
// 创建第3个单元格 并处理乱码
HSSFCell cell_t_3 = hssfrow.createCell((short) 3);
cell_t_3.setCellType(HSSFCell.CELL_TYPE_STRING);
// 对第4个单元格赋值
cell_t_3.setCellValue(changeCharset("长度"));
// -------------标题 End----------------------
for (int j = 0; j < colList.size(); j++) {
HSSFRow hssfrow_c = hssfsheet.createRow(j + 2);
HSSFCell cell_c_0 = hssfrow_c.createCell((short) 0);
cell_c_0.setCellType(HSSFCell.CELL_TYPE_STRING);
cell_c_0.setCellValue(changeCharset(colList.get(j)
.getColName()));
HSSFCell cell_c_1 = hssfrow_c.createCell((short) 1);
cell_c_1.setCellType(HSSFCell.CELL_TYPE_STRING);
cell_c_1.setCellValue(changeCharset(colList.get(j)
.getColComments()));
HSSFCell cell_c_2 = hssfrow_c.createCell((short) 2);
cell_c_2.setCellType(HSSFCell.CELL_TYPE_STRING);
cell_c_2.setCellValue(changeCharset(colList.get(j)
.getDataType()));
HSSFCell cell_c_3 = hssfrow_c.createCell((short) 3);
cell_c_3.setCellType(HSSFCell.CELL_TYPE_STRING);
cell_c_3.setCellValue(changeCharset(colList.get(j)
.getDataLength()));
}
}
}
}
// 输出
System.out.println("PATH:"+outputFile);
FileOutputStream fileoutputstream = new FileOutputStream(outputFile);
hssfworkbook.write(fileoutputstream);
fileoutputstream.close();
System.out.println("文件生成完了。。。。。。。。。。。。。。。。");
}
// -----------------------DB down End----------------------
// ------------字符编码 Start---------------------------
private static String changeCharset(String str) throws Exception {
if (str != null) {
// 用默认字符编码解码字符串。
byte[] bs = str.getBytes();
// 用新的字符编码生成字符串
return new String(bs, "UTF-8");
}
return "";
}
// ------------字符编码 End---------------------------
}
分享到:
相关推荐
OGG增量抽取Oracle业务数据到kafka部署手册 OGG(Oracle GoldenGate)是一种数据集成工具,用于实时集成和复制数据 zwischen Oracle 数据库和 Kafka 消息队列。下面是 OGG 增量抽取 Oracle 业务数据到 Kafka 的部署...
本文将探讨如何实现一个工具,用于在Oracle和SQL Server数据库之间进行数据的抽取与转换。Oracle是广受欢迎的关系型数据库管理系统,而SQL Server是微软公司推出的另一款强大的数据库平台。在不同的数据库系统间进行...
在描述中提到的"odu直接抽取oracle数据文件",意味着ODU3.9能够直接操作Oracle数据库的数据文件,而无需通过SQL*Plus或其他查询工具。这在处理大规模数据时尤其有用,因为它可以避免网络传输的延迟,并且能直接对...
Flume二次开发,支持抽取MYSQL Oracle数据库数据 以JSON格式推送至Kafka。 demo: sql_json.sources.sql_source.type = com.hbn.rdb.source.SQLSource sql_json.sources.sql_source.connectionurl = jdbc:oracle:...
Oracle 中抽取随机数的多种方法 在 Oracle 中抽取随机数是许多应用场景中常见的问题,例如在某个活动中需要随机取出一些符合条件的用户,以颁发获奖通知或其它消息。本文将通过实例讲解如何抽取随机数的多种方法。 ...
抽取数据库表的脚本,创建在sys帐户下面,具体使用方法见说明
- 通过对Oracle数据库的索引结构进行分析,实现了智能的多表关联抽取,提高了数据抽取的效率。 #### 四、结论与展望 综上所述,基于Oracle_Linux环境的数据抽取技术为解决企业数据管理问题提供了一种有效的方法。...
在本场景中,我们将探讨如何使用Kettle从Oracle数据库中的两个表之间实现增量数据抽取,且这个过程并不依赖于时间戳。 首先,理解增量抽取的概念至关重要。增量抽取是从源系统中提取自上次抽取以来发生改变的新数据...
在具体的实现方式上,Oracle Simple 和 Oracle Consistent 是采用同步方式进行增量数据抽取的,ODI 通过在源系统相关表上添加触发器,将变化数据插入到增量表中。触发器的调用是包含在交易中的,这就决定了变化数据...
通过源码,开发者可以学习到Oracle如何处理损坏的表空间、数据块以及记录格式,这对于数据库管理员和数据库开发者来说是一份宝贵的教育资源。 `init.dul` 文件是DUL工具的初始化脚本,它包含了执行数据恢复任务的...
* 视图:ALL_SOURCE_TABLES 源表、ALL_PUBLISHED_COLUMNS 发布的表列、All_Subscribed_Columns 订阅的表列、All_Subscriptions 所有订阅、All_Subscribed_Tables 已经订阅的表 Oracle CDC 是一种高效的数据增量处理...
例如,`Multi-tableFullDataAcquisition.kjb`很可能是定义了一个定时作业,该作业定期执行多个数据抽取任务,从源系统中获取所有表的最新数据。 - **Kettle作业(Job)**:是Kettle中用于协调多个转换或者作业的...
在本节中,我们将详细介绍 Kettle 数据抽取的全量抽取过程,包括新建抽取转换流、输入控件的选择、输出控件的选择、全量抽取的业务表前处理等内容。 1. 新建抽取转换流 在 Kettle 中,新建一个转换流非常简单,只...
ASM自动跨所有可用的存储设备分条数据库文件(包括数据文件、临时表空间文件、重做日志文件、闪回恢复区以及spfile),并且大多数数据库文件使用1MB的条带大小。ASM还可以选择用于实现镜像功能。以下是与ASM集成时,...
1. **新建转换**:在 Kettle 中创建一个新的转换,用于从 Oracle 数据库抽取数据至 Hive 表。 - **配置 Hadoop 连接**:指定 Hadoop 集群的主机名(例如:192.168.0.180)、Hive 数据库名称(例如:jykj)、端口号...
在这个场景中,用户通过编写Kettle作业或转换,实现对数据库中的所有表进行循环抽取,并将数据导出到CSV文件。 描述中提到,“通过kettle循环抽取整库数据至CSV文件”,这表明操作的目标是获取整个数据库的所有表的...