SourceTermAnalysisSystem_java/jeecg-module-sync/src/main/java/org/jeecg/OracleToPgSync.java
2025-09-28 14:45:34 +08:00

151 lines
5.2 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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类型
}
}
}