fix dm table ddl query and dm-schema-export

This commit is contained in:
zgq
2024-03-21 21:50:25 +08:00
parent 485fbe3a7d
commit fd344c8577
2 changed files with 59 additions and 40 deletions

View File

@ -34,9 +34,10 @@ public class DMDBManage extends DefaultDBManage implements DBManage {
}
private void exportTables(Connection connection, StringBuilder sqlBuilder, String schemaName, boolean containData) throws SQLException {
try (Statement statement = connection.createStatement(); ResultSet tables = statement.executeQuery("SELECT TABLE_NAME FROM ALL_TABLES where OWNER='" + schemaName + "' and TABLESPACE_NAME='MAIN'")) {
while (tables.next()) {
String tableName = tables.getString(1);
String sql =String.format("SELECT TABLE_NAME FROM ALL_TABLES where OWNER='%s' and TABLESPACE_NAME='MAIN'", schemaName);
try (ResultSet resultSet = connection.createStatement().executeQuery(sql)) {
while (resultSet.next()) {
String tableName = resultSet.getString("TABLE_NAME");
exportTable(connection, tableName, schemaName, sqlBuilder, containData);
}
}
@ -54,49 +55,61 @@ public class DMDBManage extends DefaultDBManage implements DBManage {
String formatSchemaName = format(schemaName);
String formatTableName = format(tableName);
if (resultSet.next()) {
sqlBuilder.append("DROP TABLE IF EXISTS ").append(formatSchemaName).append(".").append(formatTableName).append(";\n")
.append(resultSet.getString(2)).append("\n");
String comment = resultSet.getString(1);
sqlBuilder.append("DROP TABLE IF EXISTS ").append(formatSchemaName).append(".").append(formatTableName)
.append(";").append("\n")
.append(resultSet.getString("ddl")).append("\n");
String comment = resultSet.getString("comments");
if (StringUtils.isNotBlank(comment)) {
sqlBuilder.append("COMMENT ON TABLE ").append(formatSchemaName).append(".").append(formatTableName)
.append(" IS ").append("'").append(comment).append("';");
}
exportTableColumnComment(connection, schemaName, tableName, sqlBuilder);
}
if (containData) {
exportTableData(connection, tableName, sqlBuilder);
exportTableData(connection, schemaName, tableName, sqlBuilder);
}
}
}
private void exportTableColumnComment(Connection connection, String schemaName, String tableName, StringBuilder sqlBuilder) throws SQLException {
String sql =String.format("select COLNAME,COMMENT$ from SYS.SYSCOLUMNCOMMENTS\n" +
"where SCHNAME = '%s' and TVNAME = '%s'and TABLE_TYPE = 'TABLE';", schemaName,tableName);
try(ResultSet resultSet = connection.createStatement().executeQuery(sql)) {
while (resultSet.next()) {
String columnName = resultSet.getString("COLNAME");
String comment = resultSet.getString("COMMENT$");
sqlBuilder.append("COMMENT ON COLUMN ").append(format(schemaName)).append(".").append(format(tableName))
.append(".").append(format(columnName)).append(" IS ").append("'").append(comment).append("';").append("\n");
}
}
}
private void exportTableData(Connection connection, String tableName, StringBuilder sqlBuilder) throws SQLException {
StringBuilder insertSql = new StringBuilder();
try (Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("select * from " + tableName)) {
private void exportTableData(Connection connection, String schemaName, String tableName, StringBuilder sqlBuilder) throws SQLException {
String sql =String.format("SELECT * FROM %s.%s",schemaName,tableName);
try (ResultSet resultSet = connection.createStatement().executeQuery(sql)) {
ResultSetMetaData metaData = resultSet.getMetaData();
while (resultSet.next()) {
insertSql.append("INSERT INTO ").append(tableName).append(" VALUES (");
sqlBuilder.append("INSERT INTO ").append(tableName).append(" VALUES (");
for (int i = 1; i <= metaData.getColumnCount(); i++) {
String value = resultSet.getString(i);
if (Objects.isNull(value)) {
insertSql.append("NULL");
sqlBuilder.append("NULL");
} else {
insertSql.append("'").append(value).append("'");
sqlBuilder.append("'").append(value).append("'");
}
if (i < metaData.getColumnCount()) {
insertSql.append(", ");
sqlBuilder.append(", ");
}
}
insertSql.append(");\n");
sqlBuilder.append(");\n");
}
insertSql.append("\n");
sqlBuilder.append("\n");
}
sqlBuilder.append(insertSql);
}
private void exportViews(Connection connection, String schemaName, StringBuilder sqlBuilder) throws SQLException {
DatabaseMetaData metadata = connection.getMetaData();
try (ResultSet resultSet = metadata.getTables(null, schemaName, null, new String[]{"VIEW"})) {
try (ResultSet resultSet = connection.getMetaData().getTables(null, schemaName, null, new String[]{"VIEW"})) {
while (resultSet.next()) {
String viewName = resultSet.getString("TABLE_NAME");
exportView(connection, viewName, schemaName, sqlBuilder);
@ -105,16 +118,16 @@ public class DMDBManage extends DefaultDBManage implements DBManage {
}
private void exportView(Connection connection, String viewName, String schemaName, StringBuilder sqlBuilder) throws SQLException {
try (Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT DBMS_METADATA.GET_DDL('VIEW','" + viewName + "','" + schemaName + "') FROM DUAL;")) {
String sql = String.format("SELECT DBMS_METADATA.GET_DDL('VIEW','%s','%s') as ddl FROM DUAL;", viewName, schemaName);
try (ResultSet resultSet = connection.createStatement().executeQuery(sql)) {
if (resultSet.next()) {
sqlBuilder.append(resultSet.getString(1)).append("\n");
sqlBuilder.append(resultSet.getString("ddl")).append("\n");
}
}
}
private void exportProcedures(Connection connection, String schemaName, StringBuilder sqlBuilder) throws SQLException {
DatabaseMetaData metaData = connection.getMetaData();
try (ResultSet resultSet = metaData.getProcedures(null, schemaName, null)) {
try (ResultSet resultSet = connection.getMetaData().getProcedures(null, schemaName, null)) {
while (resultSet.next()) {
String procedureName = resultSet.getString("PROCEDURE_NAME");
exportProcedure(connection, schemaName,procedureName, sqlBuilder);
@ -133,7 +146,7 @@ public class DMDBManage extends DefaultDBManage implements DBManage {
private void exportTriggers(Connection connection, String schemaName, StringBuilder sqlBuilder) throws SQLException {
String sql =String.format(TRIGGER_SQL_LIST, schemaName);
try (Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(sql)) {
try (ResultSet resultSet = connection.createStatement().executeQuery(sql)) {
while (resultSet.next()) {
String triggerName = resultSet.getString("TRIGGER_NAME");
exportTrigger(connection,schemaName, triggerName, sqlBuilder);
@ -143,7 +156,7 @@ public class DMDBManage extends DefaultDBManage implements DBManage {
private void exportTrigger(Connection connection, String schemaName, String triggerName, StringBuilder sqlBuilder) throws SQLException {
String sql = String.format(TRIGGER_SQL, schemaName,triggerName);
try (Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(sql)) {
try (ResultSet resultSet = connection.createStatement().executeQuery(sql)) {
if (resultSet.next()) {
sqlBuilder.append(resultSet.getString("TRIGGER_BODY")).append("\n");
}

View File

@ -40,23 +40,29 @@ public class DMMetaData extends DefaultMetaService implements MetaData {
(SELECT dbms_metadata.get_ddl('TABLE', '%s', '%s') FROM dual) AS ddl
FROM dual;
""";
String selectObjectDDLSQL = String.format(sql, tableName, tableName, schemaName);
return SQLExecutor.getInstance().execute(connection, selectObjectDDLSQL, resultSet -> {
try {
if (resultSet.next()) {
String ddl = resultSet.getString("ddl");
String comment = resultSet.getString("comments");
if (StringUtils.isNotBlank(comment)) {
return ddl +"\n"+ "COMMENT ON TABLE " + format(schemaName) + "." + format(tableName) +
" IS " + "'" + comment + "';";
}
return ddl;
StringBuilder ddlBuilder = new StringBuilder();
String tableDDLSql = String.format(sql, tableName, tableName, schemaName);
SQLExecutor.getInstance().execute(connection, tableDDLSql, resultSet -> {
if (resultSet.next()) {
String ddl = resultSet.getString("ddl");
String comment = resultSet.getString("comments");
if (StringUtils.isNotBlank(comment)) {
ddlBuilder.append(ddl).append("\n").append("COMMENT ON TABLE ").append(format(schemaName))
.append(".").append(format(tableName)).append(" IS ").append("'").append(comment).append("';");
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
return null;
});
String columnCommentsSql =String.format("select COLNAME,COMMENT$ from SYS.SYSCOLUMNCOMMENTS\n" +
"where SCHNAME = '%s' and TVNAME = '%s'and TABLE_TYPE = 'TABLE';", schemaName,tableName);
SQLExecutor.getInstance().execute(connection, columnCommentsSql, resultSet->{
while (resultSet.next()) {
String columnName = resultSet.getString("COLNAME");
String comment = resultSet.getString("COMMENT$");
ddlBuilder.append("COMMENT ON COLUMN ").append(format(schemaName)).append(".").append(format(tableName))
.append(".").append(format(columnName)).append(" IS ").append("'").append(comment).append("';").append("\n");
}
});
return ddlBuilder.toString();
}
private static String ROUTINES_SQL