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 tables = getAllOracleTables(); // 同步每个表 for (String table : tables) { System.out.println("正在同步表: " + table); syncTable(table); } System.out.println("所有表同步完成!"); } catch (SQLException e) { e.printStackTrace(); } } /** * 获取Oracle用户下的所有表 */ private static List getAllOracleTables() throws SQLException { List 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类型 } } }