diff --git a/chat2db-server/chat2db-plugins/chat2db-h2/src/main/java/ai/chat2db/plugin/h2/H2Meta.java b/chat2db-server/chat2db-plugins/chat2db-h2/src/main/java/ai/chat2db/plugin/h2/H2Meta.java index 3c5a6d3f..8d90de4d 100644 --- a/chat2db-server/chat2db-plugins/chat2db-h2/src/main/java/ai/chat2db/plugin/h2/H2Meta.java +++ b/chat2db-server/chat2db-plugins/chat2db-h2/src/main/java/ai/chat2db/plugin/h2/H2Meta.java @@ -10,15 +10,20 @@ import java.util.Map; import ai.chat2db.spi.MetaData; import ai.chat2db.spi.jdbc.DefaultMetaService; +import ai.chat2db.spi.model.Function; +import ai.chat2db.spi.model.Procedure; +import ai.chat2db.spi.model.Table; +import ai.chat2db.spi.model.Trigger; +import ai.chat2db.spi.sql.SQLExecutor; import jakarta.validation.constraints.NotEmpty; public class H2Meta extends DefaultMetaService implements MetaData { @Override - public String tableDDL(Connection connection, @NotEmpty String databaseName, String schemaName, @NotEmpty String tableName) { - return getDDL(connection,databaseName, schemaName, tableName); + public String tableDDL(Connection connection, @NotEmpty String databaseName, String schemaName, + @NotEmpty String tableName) { + return getDDL(connection, databaseName, schemaName, tableName); } - private String getDDL(Connection connection, String databaseName, String schemaName, String tableName) { try { // 查询表结构信息 @@ -48,7 +53,7 @@ public class H2Meta extends DefaultMetaService implements MetaData { // 查询表索引信息 ResultSet indexes = connection.getMetaData().getIndexInfo(databaseName, schemaName, tableName, false, - false); + false); Map> indexMap = new HashMap<>(); while (indexes.next()) { String indexName = indexes.getString("INDEX_NAME"); @@ -75,7 +80,7 @@ public class H2Meta extends DefaultMetaService implements MetaData { List columnList = entry.getValue(); String indexColumns = String.join(", ", columnList); String createIndexDDL = String.format("CREATE INDEX %s ON %s (%s);", indexName, tableName, - indexColumns); + indexColumns); System.out.println(createIndexDDL); createTableDDL.append(createIndexDDL); } @@ -86,4 +91,108 @@ public class H2Meta extends DefaultMetaService implements MetaData { } return ""; } + + private static String ROUTINES_SQL + = + "SELECT SPECIFIC_NAME, ROUTINE_COMMENT, ROUTINE_DEFINITION FROM information_schema.routines WHERE " + + "routine_type = '%s' AND ROUTINE_SCHEMA ='%s' AND " + + "routine_name = '%s';"; + + @Override + public Function function(Connection connection, @NotEmpty String databaseName, String schemaName, + String functionName) { + + String sql = String.format(ROUTINES_SQL, "FUNCTION", databaseName, functionName); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + Function function = new Function(); + function.setDatabaseName(databaseName); + function.setSchemaName(schemaName); + function.setFunctionName(functionName); + if (resultSet.next()) { + function.setSpecificName(resultSet.getString("SPECIFIC_NAME")); + function.setRemarks(resultSet.getString("ROUTINE_COMMENT")); + function.setFunctionBody(resultSet.getString("ROUTINE_DEFINITION")); + } + + return function; + }); + + } + + private static String TRIGGER_SQL + = "SELECT TRIGGER_NAME,EVENT_MANIPULATION, ACTION_STATEMENT FROM INFORMATION_SCHEMA.TRIGGERS where " + + "TRIGGER_SCHEMA = '%s' AND TRIGGER_NAME = '%s';"; + + private static String TRIGGER_SQL_LIST + = "SELECT TRIGGER_NAME FROM INFORMATION_SCHEMA.TRIGGERS where TRIGGER_SCHEMA = '%s';"; + + @Override + public List triggers(Connection connection, String databaseName, String schemaName) { + List triggers = new ArrayList<>(); + String sql = String.format(TRIGGER_SQL_LIST, databaseName); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + while (resultSet.next()) { + Trigger trigger = new Trigger(); + trigger.setTriggerName(resultSet.getString("TRIGGER_NAME")); + trigger.setSchemaName(schemaName); + trigger.setDatabaseName(databaseName); + triggers.add(trigger); + } + return triggers; + }); + } + + @Override + public Trigger trigger(Connection connection, @NotEmpty String databaseName, String schemaName, + String triggerName) { + + String sql = String.format(TRIGGER_SQL, databaseName, triggerName); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + Trigger trigger = new Trigger(); + trigger.setDatabaseName(databaseName); + trigger.setSchemaName(schemaName); + trigger.setTriggerName(triggerName); + if (resultSet.next()) { + trigger.setTriggerBody(resultSet.getString("ACTION_STATEMENT")); + } + return trigger; + }); + } + + @Override + public Procedure procedure(Connection connection, @NotEmpty String databaseName, String schemaName, + String procedureName) { + String sql = String.format(ROUTINES_SQL, "PROCEDURE", databaseName, procedureName); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + Procedure procedure = new Procedure(); + procedure.setDatabaseName(databaseName); + procedure.setSchemaName(schemaName); + procedure.setProcedureName(procedureName); + if (resultSet.next()) { + procedure.setSpecificName(resultSet.getString("SPECIFIC_NAME")); + procedure.setRemarks(resultSet.getString("ROUTINE_COMMENT")); + procedure.setProcedureBody(resultSet.getString("ROUTINE_DEFINITION")); + } + return procedure; + }); + } + + private static String VIEW_SQL + = "SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_CATALOG = '%s' AND TABLE_SCHEMA = '%s' " + + "AND TABLE_NAME = '%s';"; + + @Override + public Table view(Connection connection, String databaseName, String schemaName, String viewName) { + String sql = String.format(VIEW_SQL, databaseName, schemaName, viewName); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + Table table = new Table(); + table.setDatabaseName(databaseName); + table.setSchemaName(schemaName); + table.setName(viewName); + if (resultSet.next()) { + table.setDdl(resultSet.getString("VIEW_DEFINITION")); + } + return table; + }); + } } diff --git a/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/MysqlMetaData.java b/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/MysqlMetaData.java index 3a5a7306..da2679df 100644 --- a/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/MysqlMetaData.java +++ b/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/MysqlMetaData.java @@ -1,7 +1,6 @@ package ai.chat2db.plugin.mysql; import java.sql.Connection; -import java.sql.SQLException; import java.util.ArrayList; import java.util.List; @@ -20,13 +19,9 @@ public class MysqlMetaData extends DefaultMetaService implements MetaData { @NotEmpty String tableName) { String sql = "SHOW CREATE TABLE " + format(databaseName) + "." + format(tableName); - return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> { - try { - if (resultSet.next()) { - return resultSet.getString("Create Table"); - } - } catch (SQLException e) { - throw new RuntimeException(e); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + if (resultSet.next()) { + return resultSet.getString("Create Table"); } return null; }); @@ -37,127 +32,105 @@ public class MysqlMetaData extends DefaultMetaService implements MetaData { } private static String ROUTINES_SQL - = "SELECT SPECIFIC_NAME, ROUTINE_COMMENT, ROUTINE_DEFINITION FROM information_schema.routines WHERE routine_type = '%s' AND ROUTINE_SCHEMA ='%s' AND " - + "routine_name = '%s';"; + = + "SELECT SPECIFIC_NAME, ROUTINE_COMMENT, ROUTINE_DEFINITION FROM information_schema.routines WHERE " + + "routine_type = '%s' AND ROUTINE_SCHEMA ='%s' AND " + + "routine_name = '%s';"; @Override public Function function(Connection connection, @NotEmpty String databaseName, String schemaName, String functionName) { - String sql = String.format(ROUTINES_SQL,"FUNCTION", databaseName, functionName); - return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> { - try { - if (resultSet.next()) { - Function function = new Function(); - function.setDatabaseName(databaseName); - function.setSchemaName(schemaName); - function.setSpecificName(resultSet.getString("SPECIFIC_NAME")); - function.setRemarks(resultSet.getString("ROUTINE_COMMENT")); - function.setFunctionName(functionName); - function.setFunctionBody(resultSet.getString("ROUTINE_DEFINITION")); - return function; - } - } catch (SQLException e) { - throw new RuntimeException(e); + String sql = String.format(ROUTINES_SQL, "FUNCTION", databaseName, functionName); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + Function function = new Function(); + function.setDatabaseName(databaseName); + function.setSchemaName(schemaName); + function.setFunctionName(functionName); + if (resultSet.next()) { + function.setSpecificName(resultSet.getString("SPECIFIC_NAME")); + function.setRemarks(resultSet.getString("ROUTINE_COMMENT")); + function.setFunctionBody(resultSet.getString("ROUTINE_DEFINITION")); } - return null; + return function; }); } private static String TRIGGER_SQL - = "SELECT TRIGGER_NAME,EVENT_MANIPULATION, ACTION_STATEMENT FROM INFORMATION_SCHEMA.TRIGGERS where TRIGGER_SCHEMA = '%s' AND TRIGGER_NAME = '%s';"; + = "SELECT TRIGGER_NAME,EVENT_MANIPULATION, ACTION_STATEMENT FROM INFORMATION_SCHEMA.TRIGGERS where " + + "TRIGGER_SCHEMA = '%s' AND TRIGGER_NAME = '%s';"; private static String TRIGGER_SQL_LIST = "SELECT TRIGGER_NAME FROM INFORMATION_SCHEMA.TRIGGERS where TRIGGER_SCHEMA = '%s';"; - @Override - public List triggers(Connection connection,String databaseName, String schemaName) { + public List triggers(Connection connection, String databaseName, String schemaName) { List triggers = new ArrayList<>(); String sql = String.format(TRIGGER_SQL_LIST, databaseName); - return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> { - try { - while (resultSet.next()) { - Trigger trigger = new Trigger(); - trigger.setTriggerName(resultSet.getString("TRIGGER_NAME")); - trigger.setSchemaName(schemaName); - trigger.setDatabaseName(databaseName); - triggers.add(trigger); - } - } catch (SQLException e) { - throw new RuntimeException(e); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + while (resultSet.next()) { + Trigger trigger = new Trigger(); + trigger.setTriggerName(resultSet.getString("TRIGGER_NAME")); + trigger.setSchemaName(schemaName); + trigger.setDatabaseName(databaseName); + triggers.add(trigger); } return triggers; }); } - @Override public Trigger trigger(Connection connection, @NotEmpty String databaseName, String schemaName, String triggerName) { String sql = String.format(TRIGGER_SQL, databaseName, triggerName); - return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> { - try { - if (resultSet.next()) { - Trigger trigger = new Trigger(); - trigger.setDatabaseName(databaseName); - trigger.setSchemaName(schemaName); - trigger.setTriggerName(triggerName); - trigger.setTriggerBody(resultSet.getString("ACTION_STATEMENT")); - return trigger; - } - } catch (SQLException e) { - throw new RuntimeException(e); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + Trigger trigger = new Trigger(); + trigger.setDatabaseName(databaseName); + trigger.setSchemaName(schemaName); + trigger.setTriggerName(triggerName); + if (resultSet.next()) { + trigger.setTriggerBody(resultSet.getString("ACTION_STATEMENT")); } - return null; + return trigger; }); } @Override public Procedure procedure(Connection connection, @NotEmpty String databaseName, String schemaName, String procedureName) { - String sql = String.format(ROUTINES_SQL,"PROCEDURE", databaseName, procedureName); - return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> { - try { - if (resultSet.next()) { - Procedure procedure = new Procedure(); - procedure.setDatabaseName(databaseName); - procedure.setSchemaName(schemaName); - procedure.setSpecificName(resultSet.getString("SPECIFIC_NAME")); - procedure.setRemarks(resultSet.getString("ROUTINE_COMMENT")); - procedure.setProcedureName(procedureName); - procedure.setProcedureBody(resultSet.getString("ROUTINE_DEFINITION")); - return procedure; - } - } catch (SQLException e) { - throw new RuntimeException(e); + String sql = String.format(ROUTINES_SQL, "PROCEDURE", databaseName, procedureName); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + Procedure procedure = new Procedure(); + procedure.setDatabaseName(databaseName); + procedure.setSchemaName(schemaName); + procedure.setProcedureName(procedureName); + if (resultSet.next()) { + procedure.setSpecificName(resultSet.getString("SPECIFIC_NAME")); + procedure.setRemarks(resultSet.getString("ROUTINE_COMMENT")); + procedure.setProcedureBody(resultSet.getString("ROUTINE_DEFINITION")); } - return null; + return procedure; }); } private static String VIEW_SQL - = "SELECT TABLE_SCHEMA AS DatabaseName, TABLE_NAME AS ViewName, VIEW_DEFINITION AS definition, CHECK_OPTION, IS_UPDATABLE FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = '%s' AND TABLE_NAME = '%s';"; + = "SELECT TABLE_SCHEMA AS DatabaseName, TABLE_NAME AS ViewName, VIEW_DEFINITION AS definition, CHECK_OPTION, " + + "IS_UPDATABLE FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = '%s' AND TABLE_NAME = '%s';"; @Override public Table view(Connection connection, String databaseName, String schemaName, String viewName) { String sql = String.format(VIEW_SQL, databaseName, viewName); - return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> { - try { - if (resultSet.next()) { - Table table = new Table(); - table.setDatabaseName(databaseName); - table.setSchemaName(schemaName); - table.setName(viewName); - table.setDdl(resultSet.getString("definition")); - return table; - } - } catch (SQLException e) { - throw new RuntimeException(e); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + Table table = new Table(); + table.setDatabaseName(databaseName); + table.setSchemaName(schemaName); + table.setName(viewName); + if (resultSet.next()) { + table.setDdl(resultSet.getString("definition")); } - return null; + return table; }); } } diff --git a/chat2db-server/chat2db-plugins/chat2db-oracle/src/main/java/ai/chat2db/plugin/oracle/OracleMetaData.java b/chat2db-server/chat2db-plugins/chat2db-oracle/src/main/java/ai/chat2db/plugin/oracle/OracleMetaData.java index e4993392..634bee8f 100644 --- a/chat2db-server/chat2db-plugins/chat2db-oracle/src/main/java/ai/chat2db/plugin/oracle/OracleMetaData.java +++ b/chat2db-server/chat2db-plugins/chat2db-oracle/src/main/java/ai/chat2db/plugin/oracle/OracleMetaData.java @@ -36,51 +36,44 @@ public class OracleMetaData extends DefaultMetaService implements MetaData { = "SELECT LINE, TEXT " + "FROM ALL_SOURCE " + "WHERE TYPE = '%s' AND NAME = '%s' " - + "ORDER BY LINE;"; + + "ORDER BY LINE"; @Override public Function function(Connection connection, @NotEmpty String databaseName, String schemaName, String functionName) { String sql = String.format(ROUTINES_SQL, "FUNCTION", functionName); - return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> { - try { - StringBuilder sb = new StringBuilder(); - while (resultSet.next()) { - sb.append(resultSet.getString("TEXT") + "\n"); - } - Function function = new Function(); - function.setDatabaseName(databaseName); - function.setSchemaName(schemaName); - function.setFunctionName(functionName); - function.setFunctionBody(sb.toString()); - return function; - } catch (SQLException e) { - throw new RuntimeException(e); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + StringBuilder sb = new StringBuilder(); + while (resultSet.next()) { + sb.append(resultSet.getString("TEXT") + "\n"); } + Function function = new Function(); + function.setDatabaseName(databaseName); + function.setSchemaName(schemaName); + function.setFunctionName(functionName); + function.setFunctionBody(sb.toString()); + return function; + }); } private static String TRIGGER_SQL_LIST = "SELECT TRIGGER_NAME " - + "FROM ALL_TRIGGERS WHERE OWNER = '%s';"; + + "FROM ALL_TRIGGERS WHERE OWNER = '%s'"; @Override public List triggers(Connection connection, String databaseName, String schemaName) { List triggers = new ArrayList<>(); - return SQLExecutor.getInstance().executeSql(connection, String.format(TRIGGER_SQL_LIST, schemaName), + return SQLExecutor.getInstance().execute(connection, String.format(TRIGGER_SQL_LIST, schemaName), resultSet -> { - try { - while (resultSet.next()) { - Trigger trigger = new Trigger(); - trigger.setTriggerName(resultSet.getString("TRIGGER_NAME")); - trigger.setSchemaName(schemaName); - trigger.setDatabaseName(databaseName); - triggers.add(trigger); - } - } catch (SQLException e) { - throw new RuntimeException(e); + while (resultSet.next()) { + Trigger trigger = new Trigger(); + trigger.setTriggerName(resultSet.getString("TRIGGER_NAME")); + trigger.setSchemaName(schemaName); + trigger.setDatabaseName(databaseName); + triggers.add(trigger); } return triggers; }); @@ -91,21 +84,17 @@ public class OracleMetaData extends DefaultMetaService implements MetaData { String triggerName) { String sql = String.format(ROUTINES_SQL, "TRIGGER", triggerName); - return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> { - try { - StringBuilder sb = new StringBuilder(); - while (resultSet.next()) { - sb.append(resultSet.getString("TEXT") + "\n"); - } - Trigger trigger = new Trigger(); - trigger.setDatabaseName(databaseName); - trigger.setSchemaName(schemaName); - trigger.setTriggerName(triggerName); - trigger.setTriggerBody(resultSet.getString(sb.toString())); - return trigger; - } catch (SQLException e) { - throw new RuntimeException(e); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + StringBuilder sb = new StringBuilder(); + while (resultSet.next()) { + sb.append(resultSet.getString("TEXT") + "\n"); } + Trigger trigger = new Trigger(); + trigger.setDatabaseName(databaseName); + trigger.setSchemaName(schemaName); + trigger.setTriggerName(triggerName); + trigger.setTriggerBody(resultSet.getString(sb.toString())); + return trigger; }); } @@ -113,45 +102,35 @@ public class OracleMetaData extends DefaultMetaService implements MetaData { public Procedure procedure(Connection connection, @NotEmpty String databaseName, String schemaName, String procedureName) { String sql = String.format(ROUTINES_SQL, "PROCEDURE", procedureName); - return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> { - try { - StringBuilder sb = new StringBuilder(); - while (resultSet.next()) { - sb.append(resultSet.getString("TEXT") + "\n"); - } - Procedure procedure = new Procedure(); - procedure.setDatabaseName(databaseName); - procedure.setSchemaName(schemaName); - procedure.setProcedureName(procedureName); - procedure.setProcedureBody(sb.toString()); - return procedure; - } catch (SQLException e) { - throw new RuntimeException(e); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + StringBuilder sb = new StringBuilder(); + while (resultSet.next()) { + sb.append(resultSet.getString("TEXT") + "\n"); } + Procedure procedure = new Procedure(); + procedure.setDatabaseName(databaseName); + procedure.setSchemaName(schemaName); + procedure.setProcedureName(procedureName); + procedure.setProcedureBody(sb.toString()); + return procedure; }); } - private static String VIEW_SQL - = "SELECT VIEW_NAME, TEXT FROM ALL_VIEWS WHERE OWNER = '%s' AND VIEW_NAME = '%s';"; + = "SELECT VIEW_NAME, TEXT FROM ALL_VIEWS WHERE OWNER = '%s' AND VIEW_NAME = '%s'"; @Override public Table view(Connection connection, String databaseName, String schemaName, String viewName) { String sql = String.format(VIEW_SQL, schemaName, viewName); - return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> { - try { - if (resultSet.next()) { - Table table = new Table(); - table.setDatabaseName(databaseName); - table.setSchemaName(schemaName); - table.setName(viewName); - table.setDdl(resultSet.getString("TEXT")); - return table; - } - } catch (SQLException e) { - throw new RuntimeException(e); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + Table table = new Table(); + table.setDatabaseName(databaseName); + table.setSchemaName(schemaName); + table.setName(viewName); + if (resultSet.next()) { + table.setDdl(resultSet.getString("TEXT")); } - return null; + return table; }); } } diff --git a/chat2db-server/chat2db-plugins/chat2db-postgresql/src/main/java/ai/chat2db/plugin/postgresql/PostgreSQLMetaData.java b/chat2db-server/chat2db-plugins/chat2db-postgresql/src/main/java/ai/chat2db/plugin/postgresql/PostgreSQLMetaData.java index 830af8cf..257372c0 100644 --- a/chat2db-server/chat2db-plugins/chat2db-postgresql/src/main/java/ai/chat2db/plugin/postgresql/PostgreSQLMetaData.java +++ b/chat2db-server/chat2db-plugins/chat2db-postgresql/src/main/java/ai/chat2db/plugin/postgresql/PostgreSQLMetaData.java @@ -61,26 +61,21 @@ public class PostgreSQLMetaData extends DefaultMetaService implements MetaData { @Override public List schemas(Connection connection, String databaseName) { - return SQLExecutor.getInstance().executeSql(connection, + return SQLExecutor.getInstance().execute(connection, "SELECT catalog_name, schema_name FROM information_schema.schemata;", resultSet -> { List databases = new ArrayList<>(); - try { - while (resultSet.next()) { - Schema schema = new Schema(); - String name = resultSet.getString("schema_name"); - String catalogName = resultSet.getString("catalog_name"); - schema.setName(name); - schema.setDatabaseName(catalogName); - databases.add(schema); - } - } catch (SQLException e) { - throw new RuntimeException(e); + while (resultSet.next()) { + Schema schema = new Schema(); + String name = resultSet.getString("schema_name"); + String catalogName = resultSet.getString("catalog_name"); + schema.setName(name); + schema.setDatabaseName(catalogName); + databases.add(schema); } return databases; }); } - private static String ROUTINES_SQL = " SELECT p.proname, p.prokind, pg_catalog.pg_get_functiondef(p.oid) as \"code\" FROM pg_catalog.pg_proc p " + "where p.prokind = '%s' and p.proname='%s';"; @@ -89,21 +84,16 @@ public class PostgreSQLMetaData extends DefaultMetaService implements MetaData { public Function function(Connection connection, @NotEmpty String databaseName, String schemaName, String functionName) { - String sql = String.format(ROUTINES_SQL,"f", functionName); - return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> { - try { - if (resultSet.next()) { - Function function = new Function(); - function.setDatabaseName(databaseName); - function.setSchemaName(schemaName); - function.setFunctionName(functionName); - function.setFunctionBody(resultSet.getString("code")); - return function; - } - } catch (SQLException e) { - throw new RuntimeException(e); + String sql = String.format(ROUTINES_SQL, "f", functionName); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + Function function = new Function(); + function.setDatabaseName(databaseName); + function.setSchemaName(schemaName); + function.setFunctionName(functionName); + if (resultSet.next()) { + function.setFunctionBody(resultSet.getString("code")); } - return null; + return function; }); } @@ -118,68 +108,53 @@ public class PostgreSQLMetaData extends DefaultMetaService implements MetaData { + "\"enabled\", pg_get_triggerdef(t.oid) AS \"trigger_body\" FROM pg_trigger t JOIN pg_class c ON c.oid = t" + ".tgrelid JOIN pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = '%s';"; - @Override - public List triggers(Connection connection,String databaseName, String schemaName) { + public List triggers(Connection connection, String databaseName, String schemaName) { List triggers = new ArrayList<>(); String sql = String.format(TRIGGER_SQL_LIST, schemaName); - return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> { - try { - while (resultSet.next()) { - Trigger trigger = new Trigger(); - trigger.setTriggerName(resultSet.getString("trigger_name")); - trigger.setSchemaName(schemaName); - trigger.setDatabaseName(databaseName); - triggers.add(trigger); - } - } catch (SQLException e) { - throw new RuntimeException(e); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + while (resultSet.next()) { + Trigger trigger = new Trigger(); + trigger.setTriggerName(resultSet.getString("trigger_name")); + trigger.setSchemaName(schemaName); + trigger.setDatabaseName(databaseName); + triggers.add(trigger); } return triggers; }); } - @Override public Trigger trigger(Connection connection, @NotEmpty String databaseName, String schemaName, String triggerName) { String sql = String.format(TRIGGER_SQL, schemaName, triggerName); - return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> { - try { - if (resultSet.next()) { - Trigger trigger = new Trigger(); - trigger.setDatabaseName(databaseName); - trigger.setSchemaName(schemaName); - trigger.setTriggerName(triggerName); - trigger.setTriggerBody(resultSet.getString("trigger_body")); - return trigger; - } - } catch (SQLException e) { - throw new RuntimeException(e); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + Trigger trigger = new Trigger(); + trigger.setDatabaseName(databaseName); + trigger.setSchemaName(schemaName); + trigger.setTriggerName(triggerName); + if (resultSet.next()) { + trigger.setTriggerBody(resultSet.getString("trigger_body")); } - return null; + + return trigger; }); } @Override public Procedure procedure(Connection connection, @NotEmpty String databaseName, String schemaName, String procedureName) { - String sql = String.format(ROUTINES_SQL,"p", procedureName); - return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> { - try { - if (resultSet.next()) { - Procedure procedure = new Procedure(); - procedure.setDatabaseName(databaseName); - procedure.setSchemaName(schemaName); - procedure.setProcedureName(procedureName); - procedure.setProcedureBody(resultSet.getString("code")); - return procedure; - } - } catch (SQLException e) { - throw new RuntimeException(e); + String sql = String.format(ROUTINES_SQL, "p", procedureName); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + Procedure procedure = new Procedure(); + procedure.setDatabaseName(databaseName); + procedure.setSchemaName(schemaName); + procedure.setProcedureName(procedureName); + if (resultSet.next()) { + procedure.setProcedureBody(resultSet.getString("code")); } - return null; + return procedure; }); } @@ -189,20 +164,15 @@ public class PostgreSQLMetaData extends DefaultMetaService implements MetaData { @Override public Table view(Connection connection, String databaseName, String schemaName, String viewName) { String sql = String.format(VIEW_SQL, schemaName, viewName); - return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> { - try { - if (resultSet.next()) { - Table table = new Table(); - table.setDatabaseName(databaseName); - table.setSchemaName(schemaName); - table.setName(viewName); - table.setDdl(resultSet.getString("definition")); - return table; - } - } catch (SQLException e) { - throw new RuntimeException(e); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + Table table = new Table(); + table.setDatabaseName(databaseName); + table.setSchemaName(schemaName); + table.setName(viewName); + if (resultSet.next()) { + table.setDdl(resultSet.getString("definition")); } - return null; + return table; }); } } diff --git a/chat2db-server/chat2db-plugins/chat2db-sqlserver/src/main/java/ai/chat2db/plugin/sqlserver/SqlServerMetaData.java b/chat2db-server/chat2db-plugins/chat2db-sqlserver/src/main/java/ai/chat2db/plugin/sqlserver/SqlServerMetaData.java index 50f76edd..35af5786 100644 --- a/chat2db-server/chat2db-plugins/chat2db-sqlserver/src/main/java/ai/chat2db/plugin/sqlserver/SqlServerMetaData.java +++ b/chat2db-server/chat2db-plugins/chat2db-sqlserver/src/main/java/ai/chat2db/plugin/sqlserver/SqlServerMetaData.java @@ -1,9 +1,9 @@ package ai.chat2db.plugin.sqlserver; import java.sql.Connection; -import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import ai.chat2db.spi.MetaData; import ai.chat2db.spi.jdbc.DefaultMetaService; @@ -13,177 +13,185 @@ import ai.chat2db.spi.model.Table; import ai.chat2db.spi.model.Trigger; import ai.chat2db.spi.sql.SQLExecutor; import jakarta.validation.constraints.NotEmpty; +import org.apache.commons.lang3.StringUtils; public class SqlServerMetaData extends DefaultMetaService implements MetaData { private String functionSQL - = "CREATE FUNCTION tableSchema.ufn_GetCreateTableScript( @schema_name NVARCHAR(128), @table_name NVARCHAR" - + "(128)) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @CreateTableScript NVARCHAR(MAX); DECLARE @IndexScripts " - + "NVARCHAR(MAX) = ''; DECLARE @ColumnDescriptions NVARCHAR(MAX) = N''; SELECT @CreateTableScript = CONCAT( " - + "'CREATE TABLE [', s.name, '].[' , t.name, '] (', STUFF( ( SELECT ', [' + c.name + '] ' + tp.name + CASE " - + "WHEN tp.name IN ('varchar', 'nvarchar', 'char', 'nchar') THEN '(' + IIF(c.max_length = -1, 'MAX', CAST(c" - + ".max_length AS NVARCHAR(10))) + ')' WHEN tp.name IN ('decimal', 'numeric') THEN '(' + CAST(c.precision AS " - + "NVARCHAR(10)) + ', ' + CAST(c.scale AS NVARCHAR(10)) + ')' ELSE '' END + ' ' + CASE WHEN c.is_nullable = 1" - + " THEN 'NULL' ELSE 'NOT NULL' END FROM sys.columns c JOIN sys.types tp ON c.user_type_id = tp.user_type_id " - + "WHERE c.object_id = t.object_id FOR XML PATH(''), TYPE ).value('/', 'nvarchar(max)'), 1, 1, ''), ');' ) " - + "FROM sys.tables t JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE t.name = @table_name AND s.name = " - + "@schema_name; SELECT @IndexScripts = @IndexScripts + 'CREATE ' + CASE WHEN i.is_unique = 1 THEN 'UNIQUE ' " - + "ELSE '' END + i.type_desc + ' INDEX [' + i.name + '] ON [' + s.name + '].[' + t.name + '] (' + STUFF( ( " - + "SELECT ', [' + c.name + ']' + CASE WHEN ic.is_descending_key = 1 THEN ' DESC' ELSE ' ASC' END FROM sys" - + ".index_columns ic JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id WHERE ic" - + ".object_id = i.object_id AND ic.index_id = i.index_id ORDER BY ic.key_ordinal FOR XML PATH('') ), 1, 1, " - + "'') + ')' + CASE WHEN i.has_filter = 1 THEN ' WHERE ' + i.filter_definition ELSE '' END + ';' + CHAR(13) +" - + " CHAR(10) FROM sys.indexes i JOIN sys.tables t ON i.object_id = t.object_id JOIN sys.schemas s ON t" - + ".schema_id = s.schema_id WHERE i.type > 0 AND t.name = @table_name AND s.name " - + "= @schema_name; SELECT @ColumnDescriptions += 'EXEC sp_addextendedproperty @name=N''MS_Description'', " - + "@value=N''' + CAST(p.value AS NVARCHAR(MAX)) + ''', @level0type=N''SCHEMA'', @level0name=N''' + " - + "@schema_name + ''', @level1type=N''TABLE'', @level1name=N''' + @table_name + ''', @level2type=N''COLUMN''," - + " @level2name=N''' + c.name + ''';' + CHAR(13) + CHAR(10) FROM sys.extended_properties p JOIN sys.columns c" - + " ON p.major_id = c.object_id AND p.minor_id = c.column_id JOIN sys.tables t ON c.object_id = t.object_id " - + "JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE p.class = 1 AND t.name = @table_name AND s.name = " - + "@schema_name; SET @CreateTableScript = @CreateTableScript + CHAR(13) + CHAR(10) + @IndexScripts + CHAR(13)" - + " + CHAR(10)+ @ColumnDescriptions+ CHAR(10); RETURN @CreateTableScript; END"; - + = "CREATE FUNCTION tableSchema.ufn_GetCreateTableScript( @schema_name NVARCHAR(128), @table_name NVARCHAR" + + "(128)) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @CreateTableScript NVARCHAR(MAX); DECLARE @IndexScripts " + + "NVARCHAR(MAX) = ''; DECLARE @ColumnDescriptions NVARCHAR(MAX) = N''; SELECT @CreateTableScript = CONCAT( " + + "'CREATE TABLE [', s.name, '].[' , t.name, '] (', STUFF( ( SELECT ', [' + c.name + '] ' + tp.name + CASE " + + "WHEN tp.name IN ('varchar', 'nvarchar', 'char', 'nchar') THEN '(' + IIF(c.max_length = -1, 'MAX', CAST(c" + + ".max_length AS NVARCHAR(10))) + ')' WHEN tp.name IN ('decimal', 'numeric') THEN '(' + CAST(c.precision AS " + + "NVARCHAR(10)) + ', ' + CAST(c.scale AS NVARCHAR(10)) + ')' ELSE '' END + ' ' + CASE WHEN c.is_nullable = 1" + + " THEN 'NULL' ELSE 'NOT NULL' END FROM sys.columns c JOIN sys.types tp ON c.user_type_id = tp.user_type_id " + + "WHERE c.object_id = t.object_id FOR XML PATH(''), TYPE ).value('/', 'nvarchar(max)'), 1, 1, ''), ');' ) " + + "FROM sys.tables t JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE t.name = @table_name AND s.name = " + + "@schema_name; SELECT @IndexScripts = @IndexScripts + 'CREATE ' + CASE WHEN i.is_unique = 1 THEN 'UNIQUE ' " + + "ELSE '' END + i.type_desc + ' INDEX [' + i.name + '] ON [' + s.name + '].[' + t.name + '] (' + STUFF( ( " + + "SELECT ', [' + c.name + ']' + CASE WHEN ic.is_descending_key = 1 THEN ' DESC' ELSE ' ASC' END FROM sys" + + ".index_columns ic JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id WHERE ic" + + ".object_id = i.object_id AND ic.index_id = i.index_id ORDER BY ic.key_ordinal FOR XML PATH('') ), 1, 1, " + + "'') + ')' + CASE WHEN i.has_filter = 1 THEN ' WHERE ' + i.filter_definition ELSE '' END + ';' + CHAR(13) +" + + " CHAR(10) FROM sys.indexes i JOIN sys.tables t ON i.object_id = t.object_id JOIN sys.schemas s ON t" + + ".schema_id = s.schema_id WHERE i.type > 0 AND t.name = @table_name AND s.name " + + "= @schema_name; SELECT @ColumnDescriptions += 'EXEC sp_addextendedproperty @name=N''MS_Description'', " + + "@value=N''' + CAST(p.value AS NVARCHAR(MAX)) + ''', @level0type=N''SCHEMA'', @level0name=N''' + " + + "@schema_name + ''', @level1type=N''TABLE'', @level1name=N''' + @table_name + ''', @level2type=N''COLUMN''," + + " @level2name=N''' + c.name + ''';' + CHAR(13) + CHAR(10) FROM sys.extended_properties p JOIN sys.columns c" + + " ON p.major_id = c.object_id AND p.minor_id = c.column_id JOIN sys.tables t ON c.object_id = t.object_id " + + "JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE p.class = 1 AND t.name = @table_name AND s.name = " + + "@schema_name; SET @CreateTableScript = @CreateTableScript + CHAR(13) + CHAR(10) + @IndexScripts + CHAR(13)" + + " + CHAR(10)+ @ColumnDescriptions+ CHAR(10); RETURN @CreateTableScript; END"; @Override public String tableDDL(Connection connection, String databaseName, String schemaName, String tableName) { try { System.out.println(functionSQL); - SQLExecutor.getInstance().executeSql(connection,functionSQL.replace("tableSchema", schemaName), resultSet -> null); + SQLExecutor.getInstance().executeSql(connection, functionSQL.replace("tableSchema", schemaName), + resultSet -> null); } catch (Exception e) { //log.error("创建函数失败", e); } String ddlSql = "SELECT " + schemaName + ".ufn_GetCreateTableScript('" + schemaName + "', '" + tableName - + "') AS sql"; - return SQLExecutor.getInstance().executeSql(connection,ddlSql, resultSet -> { - try { - if (resultSet.next()) { - return resultSet.getString("sql"); - } - } catch (SQLException e) { - throw new RuntimeException(e); + + "') AS sql"; + return SQLExecutor.getInstance().execute(connection, ddlSql, resultSet -> { + if (resultSet.next()) { + return resultSet.getString("sql"); } return null; }); } private static String ROUTINES_SQL - = "SELECT type_desc, OBJECT_NAME(object_id) AS FunctionName, OBJECT_DEFINITION(object_id) AS functionDefinition FROM sys.objects WHERE type_desc IN(%s) and name = '%s' ;"; + = "SELECT type_desc, OBJECT_NAME(object_id) AS FunctionName, OBJECT_DEFINITION(object_id) AS " + + "definition FROM sys.objects WHERE type_desc IN(%s) and name = '%s' ;"; @Override public Function function(Connection connection, @NotEmpty String databaseName, String schemaName, String functionName) { - String sql = String.format(ROUTINES_SQL,"'SQL_SCALAR_FUNCTION', 'SQL_TABLE_VALUED_FUNCTION'", functionName); - return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> { - try { - if (resultSet.next()) { - Function function = new Function(); - function.setDatabaseName(databaseName); - function.setSchemaName(schemaName); - function.setFunctionName(functionName); - function.setFunctionBody(resultSet.getString("functionDefinition")); - return function; - } - } catch (SQLException e) { - throw new RuntimeException(e); + String sql = String.format(ROUTINES_SQL, "'SQL_SCALAR_FUNCTION', 'SQL_TABLE_VALUED_FUNCTION'", functionName); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + Function function = new Function(); + function.setDatabaseName(databaseName); + function.setSchemaName(schemaName); + function.setFunctionName(functionName); + if (resultSet.next()) { + function.setFunctionBody(resultSet.getString("definition")); } - return null; + return function; }); + } + @Override + public List functions(Connection connection, String databaseName, String schemaName) { + List functions = SQLExecutor.getInstance().functions(connection, databaseName, schemaName); + return functions.stream().map(function -> removeVersion(function)).collect(Collectors.toList()); + } + + private Function removeVersion(Function function) { + String fullFunctionName = function.getFunctionName(); + if (!StringUtils.isEmpty(fullFunctionName)) { + String[] parts = fullFunctionName.split(";"); + String functionName = parts[0]; + function.setFunctionName(functionName); + } + return function; + } + + @Override + public List procedures(Connection connection, String databaseName, String schemaName) { + List procedures = SQLExecutor.getInstance().procedures(connection, databaseName, schemaName); + return procedures.stream().map(procedure -> removeVersion(procedure)).collect(Collectors.toList()); + } + + private Procedure removeVersion(Procedure procedure) { + String fullProcedureName = procedure.getProcedureName(); + if (!StringUtils.isEmpty(fullProcedureName)) { + String[] parts = fullProcedureName.split(";"); + String procedureName = parts[0]; + procedure.setProcedureName(procedureName); + } + return procedure; } private static String TRIGGER_SQL - = "SELECT OBJECT_NAME(parent_obj) AS TableName, name AS triggerName, OBJECT_DEFINITION(id) AS TriggerDefinition, CASE WHEN status & 1 = 1 THEN 'Enabled' ELSE 'Disabled' END AS Status FROM sysobjects WHERE xtype = 'TR' and name = '%s';"; + = "SELECT OBJECT_NAME(parent_obj) AS TableName, name AS triggerName, OBJECT_DEFINITION(id) AS " + + "triggerDefinition, CASE WHEN status & 1 = 1 THEN 'Enabled' ELSE 'Disabled' END AS Status FROM sysobjects " + + "WHERE xtype = 'TR' and name = '%s';"; private static String TRIGGER_SQL_LIST - = "SELECT OBJECT_NAME(parent_obj) AS TableName, name AS triggerName, OBJECT_DEFINITION(id) AS TriggerDefinition, CASE WHEN status & 1 = 1 THEN 'Enabled' ELSE 'Disabled' END AS Status FROM sysobjects WHERE xtype = 'TR' "; - + = "SELECT OBJECT_NAME(parent_obj) AS TableName, name AS triggerName, OBJECT_DEFINITION(id) AS " + + "triggerDefinition, CASE WHEN status & 1 = 1 THEN 'Enabled' ELSE 'Disabled' END AS Status FROM sysobjects " + + "WHERE xtype = 'TR' "; @Override - public List triggers(Connection connection,String databaseName, String schemaName) { + public List triggers(Connection connection, String databaseName, String schemaName) { List triggers = new ArrayList<>(); - return SQLExecutor.getInstance().executeSql(connection, TRIGGER_SQL_LIST, resultSet -> { - try { - while (resultSet.next()) { - Trigger trigger = new Trigger(); - trigger.setTriggerName(resultSet.getString("triggerName")); - trigger.setSchemaName(schemaName); - trigger.setDatabaseName(databaseName); - triggers.add(trigger); - } - } catch (SQLException e) { - throw new RuntimeException(e); + return SQLExecutor.getInstance().execute(connection, TRIGGER_SQL_LIST, resultSet -> { + while (resultSet.next()) { + Trigger trigger = new Trigger(); + trigger.setTriggerName(resultSet.getString("triggerName")); + trigger.setSchemaName(schemaName); + trigger.setDatabaseName(databaseName); + triggers.add(trigger); } return triggers; }); } - @Override public Trigger trigger(Connection connection, @NotEmpty String databaseName, String schemaName, String triggerName) { String sql = String.format(TRIGGER_SQL, triggerName); - return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> { - try { - if (resultSet.next()) { - Trigger trigger = new Trigger(); - trigger.setDatabaseName(databaseName); - trigger.setSchemaName(schemaName); - trigger.setTriggerName(triggerName); - trigger.setTriggerBody(resultSet.getString("triggerName")); - return trigger; - } - } catch (SQLException e) { - throw new RuntimeException(e); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + Trigger trigger = new Trigger(); + trigger.setDatabaseName(databaseName); + trigger.setSchemaName(schemaName); + trigger.setTriggerName(triggerName); + if (resultSet.next()) { + trigger.setTriggerBody(resultSet.getString("triggerDefinition")); } - return null; + return trigger; }); } @Override public Procedure procedure(Connection connection, @NotEmpty String databaseName, String schemaName, String procedureName) { - String sql = String.format(ROUTINES_SQL,"'SQL_STORED_PROCEDURE'", procedureName); - return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> { - try { + String sql = String.format(ROUTINES_SQL, "'SQL_STORED_PROCEDURE'", procedureName); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + Procedure procedure = new Procedure(); + procedure.setDatabaseName(databaseName); + procedure.setSchemaName(schemaName); + procedure.setProcedureName(procedureName); if (resultSet.next()) { - Procedure procedure = new Procedure(); - procedure.setDatabaseName(databaseName); - procedure.setSchemaName(schemaName); - procedure.setProcedureName(procedureName); - procedure.setProcedureBody(resultSet.getString("procedureDefinition")); - return procedure; + procedure.setProcedureBody(resultSet.getString("definition")); } - } catch (SQLException e) { - throw new RuntimeException(e); + return procedure; } - return null; - }); + ); } - private static String VIEW_SQL - = "SELECT TABLE_SCHEMA, TABLE_NAME, VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = '%s' AND TABLE_NAME = '%s';"; + = "SELECT TABLE_SCHEMA, TABLE_NAME, VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = '%s' " + + "AND TABLE_NAME = '%s';"; @Override public Table view(Connection connection, String databaseName, String schemaName, String viewName) { String sql = String.format(VIEW_SQL, schemaName, viewName); - return SQLExecutor.getInstance().executeSql(connection, sql, resultSet -> { - try { - if (resultSet.next()) { - Table table = new Table(); - table.setDatabaseName(databaseName); - table.setSchemaName(schemaName); - table.setName(viewName); - table.setDdl(resultSet.getString("VIEW_DEFINITION")); - return table; - } - } catch (SQLException e) { - throw new RuntimeException(e); + return SQLExecutor.getInstance().execute(connection, sql, resultSet -> { + Table table = new Table(); + table.setDatabaseName(databaseName); + table.setSchemaName(schemaName); + table.setName(viewName); + if (resultSet.next()) { + table.setDdl(resultSet.getString("VIEW_DEFINITION")); } - return null; + return table; }); } } diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/sql/ResultSetFunction.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/sql/ResultSetFunction.java new file mode 100644 index 00000000..6acde3b6 --- /dev/null +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/sql/ResultSetFunction.java @@ -0,0 +1,9 @@ +package ai.chat2db.spi.sql; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public interface ResultSetFunction { + + R apply(ResultSet t) throws SQLException; +} diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/sql/SQLExecutor.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/sql/SQLExecutor.java index 8b38199d..41794586 100644 --- a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/sql/SQLExecutor.java +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/sql/SQLExecutor.java @@ -85,7 +85,26 @@ public class SQLExecutor { return function.apply(rs); } } - } catch (SQLException e) { + } catch (Exception e) { + throw new RuntimeException(e); + } + return null; + } + + public R execute(Connection connection, String sql, ResultSetFunction function) { + if (StringUtils.isBlank(sql)) { + return null; + } + log.info("execute:{}", sql); + try (Statement stmt = connection.createStatement();) { + boolean query = stmt.execute(sql); + // 代表是查询 + if (query) { + try (ResultSet rs = stmt.getResultSet();) { + return function.apply(rs); + } + } + } catch (Exception e) { throw new RuntimeException(e); } return null; @@ -288,7 +307,7 @@ public class SQLExecutor { while (resultSet.next()) { n++; tables.add(buildTable(resultSet)); - if (n >= 5000) {// 最多只取5000条 + if (n >= 1000) {// 最多只取1000条 break; } }