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