151 lines
5.2 KiB
Java
151 lines
5.2 KiB
Java
|
|
package org.jeecg;
|
|||
|
|
|
|||
|
|
import java.sql.*;
|
|||
|
|
import java.util.ArrayList;
|
|||
|
|
import java.util.List;
|
|||
|
|
|
|||
|
|
public class OracleToPgSync {
|
|||
|
|
|
|||
|
|
// 数据库连接配置
|
|||
|
|
private static final String ORACLE_URL = "jdbc:oracle:thin:@//127.0.0.1:1521/orcl";
|
|||
|
|
private static final String ORACLE_USER = "idctest";
|
|||
|
|
private static final String ORACLE_PASSWORD = "12345678";
|
|||
|
|
|
|||
|
|
private static final String PG_URL = "jdbc:postgresql://127.0.0.1:5432/oracleToPg";
|
|||
|
|
private static final String PG_USER = "postgres";
|
|||
|
|
private static final String PG_PASSWORD = "root";
|
|||
|
|
|
|||
|
|
public static void main(String[] args) {
|
|||
|
|
try {
|
|||
|
|
// 获取Oracle用户下的所有表
|
|||
|
|
List<String> tables = getAllOracleTables();
|
|||
|
|
|
|||
|
|
// 同步每个表
|
|||
|
|
for (String table : tables) {
|
|||
|
|
System.out.println("正在同步表: " + table);
|
|||
|
|
syncTable(table);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
System.out.println("所有表同步完成!");
|
|||
|
|
} catch (SQLException e) {
|
|||
|
|
e.printStackTrace();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取Oracle用户下的所有表
|
|||
|
|
*/
|
|||
|
|
private static List<String> getAllOracleTables() throws SQLException {
|
|||
|
|
List<String> tables = new ArrayList<>();
|
|||
|
|
|
|||
|
|
try (Connection oracleConn = DriverManager.getConnection(ORACLE_URL, ORACLE_USER, ORACLE_PASSWORD)) {
|
|||
|
|
DatabaseMetaData metaData = oracleConn.getMetaData();
|
|||
|
|
|
|||
|
|
// 获取当前用户下的所有表
|
|||
|
|
try (ResultSet rs = metaData.getTables(null, ORACLE_USER.toUpperCase(), "%", new String[]{"TABLE"})) {
|
|||
|
|
while (rs.next()) {
|
|||
|
|
String tableName = rs.getString("TABLE_NAME");
|
|||
|
|
tables.add(tableName.toUpperCase()); // 表名转为大写
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return tables;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 同步单个表
|
|||
|
|
*/
|
|||
|
|
private static void syncTable(String tableName) throws SQLException {
|
|||
|
|
try (Connection oracleConn = DriverManager.getConnection(ORACLE_URL, ORACLE_USER, ORACLE_PASSWORD);
|
|||
|
|
Connection pgConn = DriverManager.getConnection(PG_URL, PG_USER, PG_PASSWORD)) {
|
|||
|
|
|
|||
|
|
// 1. 获取表结构并创建PG表
|
|||
|
|
createPgTable(oracleConn, pgConn, tableName);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 在PostgreSQL中创建表结构(表名和字段名全大写)
|
|||
|
|
*/
|
|||
|
|
private static void createPgTable(Connection oracleConn, Connection pgConn, String tableName)
|
|||
|
|
throws SQLException {
|
|||
|
|
|
|||
|
|
// 获取Oracle表结构
|
|||
|
|
DatabaseMetaData oracleMeta = oracleConn.getMetaData();
|
|||
|
|
ResultSet columns = oracleMeta.getColumns(null, ORACLE_USER.toUpperCase(), tableName, "%");
|
|||
|
|
|
|||
|
|
StringBuilder createSql = new StringBuilder("CREATE TABLE IF NOT EXISTS \"")
|
|||
|
|
.append(tableName.toUpperCase()).append("\" (");
|
|||
|
|
|
|||
|
|
boolean first = true;
|
|||
|
|
while (columns.next()) {
|
|||
|
|
if (!first) {
|
|||
|
|
createSql.append(", ");
|
|||
|
|
}
|
|||
|
|
first = false;
|
|||
|
|
|
|||
|
|
String columnName = columns.getString("COLUMN_NAME").toUpperCase();
|
|||
|
|
String typeName = columns.getString("TYPE_NAME");
|
|||
|
|
int dataType = columns.getInt("DATA_TYPE");
|
|||
|
|
int columnSize = columns.getInt("COLUMN_SIZE");
|
|||
|
|
int decimalDigits = columns.getInt("DECIMAL_DIGITS");
|
|||
|
|
String isNullable = columns.getString("IS_NULLABLE");
|
|||
|
|
|
|||
|
|
// 转换Oracle数据类型到PostgreSQL
|
|||
|
|
String pgType = convertOracleTypeToPg(typeName, dataType, columnSize, decimalDigits);
|
|||
|
|
|
|||
|
|
// 所有列名都用双引号包围,确保大小写敏感
|
|||
|
|
createSql.append("\"").append(columnName).append("\" ")
|
|||
|
|
.append(pgType);
|
|||
|
|
|
|||
|
|
if ("NO".equalsIgnoreCase(isNullable)) {
|
|||
|
|
createSql.append(" NOT NULL");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
createSql.append(")");
|
|||
|
|
|
|||
|
|
// 执行创建表
|
|||
|
|
try (Statement stmt = pgConn.createStatement()) {
|
|||
|
|
stmt.execute(createSql.toString());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Oracle数据类型转换为PostgreSQL数据类型
|
|||
|
|
*/
|
|||
|
|
private static String convertOracleTypeToPg(String oracleType, int dataType, int size, int decimalDigits) {
|
|||
|
|
switch (oracleType.toUpperCase()) {
|
|||
|
|
case "VARCHAR2":
|
|||
|
|
case "NVARCHAR2":
|
|||
|
|
case "CHAR":
|
|||
|
|
case "NCHAR":
|
|||
|
|
return "VARCHAR(" + (size > 0 ? size : 255) + ")";
|
|||
|
|
case "NUMBER":
|
|||
|
|
if (decimalDigits > 0) {
|
|||
|
|
return "NUMERIC(" + size + "," + decimalDigits + ")";
|
|||
|
|
} else if (size > 0) {
|
|||
|
|
return "NUMERIC(" + size + ")";
|
|||
|
|
} else {
|
|||
|
|
return "NUMERIC";
|
|||
|
|
}
|
|||
|
|
case "DATE":
|
|||
|
|
return "TIMESTAMP";
|
|||
|
|
case "TIMESTAMP":
|
|||
|
|
return "TIMESTAMP";
|
|||
|
|
case "CLOB":
|
|||
|
|
return "TEXT";
|
|||
|
|
case "BLOB":
|
|||
|
|
return "BYTEA";
|
|||
|
|
case "FLOAT":
|
|||
|
|
return "FLOAT8";
|
|||
|
|
case "BINARY_FLOAT":
|
|||
|
|
return "FLOAT4";
|
|||
|
|
case "BINARY_DOUBLE":
|
|||
|
|
return "FLOAT8";
|
|||
|
|
default:
|
|||
|
|
return "TEXT"; // 默认转为TEXT类型
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|