SourceTermAnalysisSystem_java/jeecg-module-sync/src/main/java/org/jeecg/OracleToPgSync.java

151 lines
5.2 KiB
Java
Raw Normal View History

2025-09-28 14:45:34 +08:00
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类型
}
}
}