1.修复mysql数据库因数据库名包含特殊字符导致的报错问题
2.修复oracle分页语句错误 3.oracle表信息sql补全
This commit is contained in:
@@ -3,80 +3,89 @@
|
|||||||
<mapper namespace="com.zyplayer.doc.db.framework.db.mapper.base.BaseMapper">
|
<mapper namespace="com.zyplayer.doc.db.framework.db.mapper.base.BaseMapper">
|
||||||
|
|
||||||
<resultMap id="TableColumnDescDtoMap" type="com.zyplayer.doc.db.framework.db.dto.TableColumnDescDto" >
|
<resultMap id="TableColumnDescDtoMap" type="com.zyplayer.doc.db.framework.db.dto.TableColumnDescDto" >
|
||||||
<result column="TABLE_NAME" property="tableName" jdbcType="VARCHAR" />
|
<result column="TABLE_NAME" property="tableName" jdbcType="VARCHAR" />
|
||||||
<result column="COLUMN_NAME" property="name" jdbcType="VARCHAR" />
|
<result column="COLUMN_NAME" property="name" jdbcType="VARCHAR" />
|
||||||
<result column="DATA_TYPE" property="type" jdbcType="VARCHAR" />
|
<result column="DATA_TYPE" property="type" jdbcType="VARCHAR" />
|
||||||
<result column="NULLABLE" property="nullable" jdbcType="VARCHAR" />
|
<result column="NULLABLE" property="nullable" jdbcType="VARCHAR" />
|
||||||
<result column="COMMENTS" property="description" jdbcType="VARCHAR" />
|
<result column="COMMENTS" property="description" jdbcType="VARCHAR" />
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
<resultMap id="QueryTableColumnDescDtoMap" type="com.zyplayer.doc.db.framework.db.dto.QueryTableColumnDescDto" >
|
<resultMap id="QueryTableColumnDescDtoMap" type="com.zyplayer.doc.db.framework.db.dto.QueryTableColumnDescDto" >
|
||||||
<result column="TABLE_NAME" property="tableName" jdbcType="VARCHAR" />
|
<result column="TABLE_NAME" property="tableName" jdbcType="VARCHAR" />
|
||||||
<result column="COLUMN_NAME" property="columnName" jdbcType="VARCHAR" />
|
<result column="COLUMN_NAME" property="columnName" jdbcType="VARCHAR" />
|
||||||
<result column="COMMENTS" property="description" jdbcType="VARCHAR" />
|
<result column="COMMENTS" property="description" jdbcType="VARCHAR" />
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
<!-- 获取用户列表 -->
|
<!-- 获取用户列表 -->
|
||||||
<select id="getDatabaseList" resultType="com.zyplayer.doc.db.framework.db.dto.DatabaseInfoDto">
|
<select id="getDatabaseList" resultType="com.zyplayer.doc.db.framework.db.dto.DatabaseInfoDto">
|
||||||
select USERNAME dbName from all_users
|
select USERNAME dbName from all_users
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="getTableStatus" resultType="com.zyplayer.doc.db.controller.vo.TableStatusVo">
|
<select id="getTableStatus" resultType="com.zyplayer.doc.db.controller.vo.TableStatusVo">
|
||||||
select 1
|
select dt.TABLE_NAME as name,
|
||||||
</select>
|
dt.NUM_ROWS as "rows",
|
||||||
|
dt.AVG_ROW_LEN as avgRowLength,
|
||||||
|
do.CREATED as createTime,
|
||||||
|
do.LAST_DDL_TIME as updateTime,
|
||||||
|
dtc.COMMENTS as "comment"
|
||||||
|
from dba_tables dt
|
||||||
|
left join dba_objects do on do.owner = dt.owner and do.object_name = dt.table_name
|
||||||
|
left join dba_tab_comments dtc on dtc.owner = dt.owner and dtc.table_name = dt.table_name
|
||||||
|
where dt.owner = #{dbName} and dt.table_name = #{tableName}
|
||||||
|
</select>
|
||||||
|
|
||||||
<!-- 获取表列表 -->
|
<!-- 获取表列表 -->
|
||||||
<select id="getTableList" resultType="com.zyplayer.doc.db.framework.db.dto.TableInfoDto">
|
<select id="getTableList" resultType="com.zyplayer.doc.db.framework.db.dto.TableInfoDto">
|
||||||
select t.OWNER as dbName,t.TABLE_NAME as tableName,c.COMMENTS as tableComment from all_tables t left join user_tab_comments c on t.TABLE_NAME = c.TABLE_NAME
|
select t.OWNER as dbName,t.TABLE_NAME as tableName,c.COMMENTS as tableComment from all_tables t left join user_tab_comments c on t.TABLE_NAME = c.TABLE_NAME
|
||||||
<where>
|
<where>
|
||||||
<if test="dbName != null">t.owner = #{dbName}</if>
|
<if test="dbName != null">t.owner = #{dbName}</if>
|
||||||
</where>
|
</where>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!-- 获取表字段集合 -->
|
<!-- 获取表字段集合 -->
|
||||||
<select id="getTableColumnList" resultMap="TableColumnDescDtoMap">
|
<select id="getTableColumnList" resultMap="TableColumnDescDtoMap">
|
||||||
select t.TABLE_NAME,t.COLUMN_NAME,t.DATA_TYPE,case t.NULLABLE when 'Y' then '1' when 'N' then '0' end NULLABLE, c.COMMENTS
|
select t.TABLE_NAME,t.COLUMN_NAME,t.DATA_TYPE,case t.NULLABLE when 'Y' then '1' when 'N' then '0' end NULLABLE, c.COMMENTS
|
||||||
from user_tab_columns t left join user_col_comments c on t.COLUMN_NAME = c.COLUMN_NAME and t.TABLE_NAME = c.TABLE_NAME
|
from user_tab_columns t left join user_col_comments c on t.COLUMN_NAME = c.COLUMN_NAME and t.TABLE_NAME = c.TABLE_NAME
|
||||||
<where>
|
<where>
|
||||||
t.table_name in (select table_name from all_tables where owner = #{dbName} )
|
t.table_name in (select table_name from all_tables where owner = #{dbName} )
|
||||||
<if test="tableName != null"> and t.TABLE_NAME = #{tableName}</if>
|
<if test="tableName != null"> and t.TABLE_NAME = #{tableName}</if>
|
||||||
</where>
|
</where>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!-- 条件查询表字段 -->
|
<!-- 条件查询表字段 -->
|
||||||
<select id="getTableAndColumnBySearch" resultMap="QueryTableColumnDescDtoMap">
|
<select id="getTableAndColumnBySearch" resultMap="QueryTableColumnDescDtoMap">
|
||||||
select t.TABLE_NAME,t.COLUMN_NAME,t.DATA_TYPE,case t.NULLABLE when 'Y' then 1 when 'N' then 0 end NULLABLE, c.COMMENTS
|
select t.TABLE_NAME,t.COLUMN_NAME,t.DATA_TYPE,case t.NULLABLE when 'Y' then 1 when 'N' then 0 end NULLABLE, c.COMMENTS
|
||||||
from user_tab_columns t
|
from user_tab_columns t
|
||||||
left join user_col_comments c on t.COLUMN_NAME = c.COLUMN_NAME and t.TABLE_NAME = c.TABLE_NAME
|
left join user_col_comments c on t.COLUMN_NAME = c.COLUMN_NAME and t.TABLE_NAME = c.TABLE_NAME
|
||||||
where t.TABLE_NAME = #{tableName} AND (t.COLUMN_NAME like #{searchText} or c.COMMENTS like #{searchText})
|
where t.TABLE_NAME = #{tableName} AND (t.COLUMN_NAME like #{searchText} or c.COMMENTS like #{searchText})
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!-- 条件查询表 -->
|
<!-- 条件查询表 -->
|
||||||
<select id="getTableDescList" resultType="com.zyplayer.doc.db.framework.db.dto.TableDescDto">
|
<select id="getTableDescList" resultType="com.zyplayer.doc.db.framework.db.dto.TableDescDto">
|
||||||
select t.OWNER,t.TABLE_NAME as tableName,c.COMMENTS as description
|
select t.OWNER,t.TABLE_NAME as tableName,c.COMMENTS as description
|
||||||
from all_tables t
|
from all_tables t
|
||||||
left join user_tab_comments c on t.TABLE_NAME = c.TABLE_NAME
|
left join user_tab_comments c on t.TABLE_NAME = c.TABLE_NAME
|
||||||
<where>
|
<where>
|
||||||
<if test="dbName != null">and t.owner = #{dbName}</if>
|
<if test="dbName != null">and t.owner = #{dbName}</if>
|
||||||
<if test="tableName != null">and t.TABLE_NAME = #{tableName}</if>
|
<if test="tableName != null">and t.TABLE_NAME = #{tableName}</if>
|
||||||
</where>
|
</where>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!-- 增加表注释 -->
|
<!-- 增加表注释 -->
|
||||||
<insert id="updateTableDesc">
|
<insert id="updateTableDesc">
|
||||||
comment on table ${dbName}.${tableName} is #{new Desc}
|
comment on table ${dbName}.${tableName} is #{new Desc}
|
||||||
</insert>
|
</insert>
|
||||||
|
|
||||||
<!-- 增加表字段注释 -->
|
<!-- 增加表字段注释 -->
|
||||||
<insert id="updateTableColumnDesc">
|
<insert id="updateTableColumnDesc">
|
||||||
comment on column ${dbName}.${tableName}.${columnName} is #{new Desc}
|
comment on column ${dbName}.${tableName}.${columnName} is #{new Desc}
|
||||||
</insert>
|
</insert>
|
||||||
|
|
||||||
<delete id="deleteTableLineData">
|
<delete id="deleteTableLineData">
|
||||||
delete from ${dbName}.${tableName} where
|
delete from ${dbName}.${tableName} where
|
||||||
<foreach collection="lineParam.entrySet()" index="key" item="value">
|
<foreach collection="lineParam.entrySet()" index="key" item="value">
|
||||||
${key} = #{value}
|
${key} = #{value}
|
||||||
</foreach>
|
</foreach>
|
||||||
</delete>
|
</delete>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.zyplayer.doc.db.service.database;
|
|||||||
|
|
||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
import cn.hutool.core.util.RandomUtil;
|
import cn.hutool.core.util.RandomUtil;
|
||||||
|
import com.zyplayer.doc.db.controller.param.DataViewParam;
|
||||||
import com.zyplayer.doc.db.controller.vo.TableDdlVo;
|
import com.zyplayer.doc.db.controller.vo.TableDdlVo;
|
||||||
import com.zyplayer.doc.db.framework.db.dto.ColumnInfoDto;
|
import com.zyplayer.doc.db.framework.db.dto.ColumnInfoDto;
|
||||||
import com.zyplayer.doc.db.framework.db.dto.ProcedureDto;
|
import com.zyplayer.doc.db.framework.db.dto.ProcedureDto;
|
||||||
@@ -29,126 +30,180 @@ import java.util.Optional;
|
|||||||
@Service
|
@Service
|
||||||
public class MysqlServiceImpl extends DbBaseService {
|
public class MysqlServiceImpl extends DbBaseService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DatabaseProductEnum getDatabaseProduct() {
|
public DatabaseProductEnum getDatabaseProduct() {
|
||||||
return DatabaseProductEnum.MYSQL;
|
return DatabaseProductEnum.MYSQL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mysql数据库名中含有 - 等特殊字符,需要用反引号包裹
|
* mysql数据库名中含有 - 等特殊字符,需要用反引号包裹
|
||||||
*
|
*
|
||||||
* @author diantu
|
* @author diantu
|
||||||
* @since 2023年1月16日
|
* @since 2023年1月16日
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String getUseDbSql(String dbName) {
|
public String getUseDbSql(String dbName) {
|
||||||
if (StringUtils.isNotBlank(dbName)) {
|
if (StringUtils.isNotBlank(dbName)) {
|
||||||
return "use " + "`" + dbName + "`";
|
return "use " + "`" + dbName + "`";
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
public TableDdlVo getTableDdl(Long sourceId, String dbName, String tableName) {
|
* 获取查询总条数的SQL(mysql数据库名中含有 - 等特殊字符,需要用反引号包裹)
|
||||||
BaseMapper baseMapper = this.getViewAuthBaseMapper(sourceId);
|
*
|
||||||
List<Map<String, String>> tableDdlList = baseMapper.getTableDdl(dbName, tableName);
|
* @author diantu
|
||||||
TableDdlVo tableDdlVo = new TableDdlVo();
|
* @since 2023年1月16日
|
||||||
tableDdlVo.setCurrent(DatabaseProductEnum.MYSQL.name().toLowerCase());
|
*/
|
||||||
tableDdlVo.setMysql("// 生成失败");
|
@Override
|
||||||
tableDdlVo.setOracle("// TODO 等待大佬来实现转换");
|
public String getQueryCountSql(DataViewParam dataViewParam) {
|
||||||
// TODO 将建表语句转换为其他数据库的,还不知道怎么做,先这样留着,看有没大佬来实现
|
StringBuilder sqlSb = new StringBuilder();
|
||||||
if (CollectionUtils.isNotEmpty(tableDdlList)) {
|
sqlSb.append(String.format("select count(1) as counts from %s.%s", "`"+dataViewParam.getDbName()+"`", dataViewParam.getTableName()));
|
||||||
tableDdlVo.setMysql(tableDdlList.get(0).get("Create Table") + ";");
|
if (StringUtils.isNotBlank(dataViewParam.getCondition())) {
|
||||||
}
|
sqlSb.append(String.format(" where %s", dataViewParam.getCondition()));
|
||||||
return tableDdlVo;
|
}
|
||||||
}
|
return sqlSb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
public void updateTableColumnDesc(Long sourceId, String dbName, String tableName, String columnName, String newDesc) {
|
* 获取全量数据查询的SQL(mysql数据库名中含有 - 等特殊字符,需要用反引号包裹)
|
||||||
BaseMapper baseMapper = this.getViewAuthBaseMapper(sourceId);
|
*
|
||||||
// mysql要同时修改类型默认值等,所以先查出来
|
* @author diantu
|
||||||
MysqlMapper mysqlMapper = databaseRegistrationBean.getBaseMapper(sourceId, MysqlMapper.class);
|
* @since 2023年1月17日
|
||||||
ColumnInfoDto columnInfo = mysqlMapper.getColumnInfo(dbName, tableName, columnName);
|
*/
|
||||||
String isNullable = Optional.ofNullable(columnInfo.getIsNullable()).orElse("");
|
@Override
|
||||||
columnInfo.setIsNullable("yes".equalsIgnoreCase(isNullable) ? "null" : "not null");
|
public String getQueryAllSql(DataViewParam dataViewParam) {
|
||||||
String columnDefault = columnInfo.getColumnDefault();
|
String queryColumns = StringUtils.defaultIfBlank(dataViewParam.getRetainColumn(), "*");
|
||||||
if (StringUtils.isNotBlank(columnDefault)) {
|
StringBuilder sqlSb = new StringBuilder();
|
||||||
columnInfo.setColumnDefault("DEFAULT " + columnDefault);
|
sqlSb.append(String.format("select %s from %s.%s", queryColumns, "`" + dataViewParam.getDbName() + "`", dataViewParam.getTableName()));
|
||||||
} else {
|
if (StringUtils.isNotBlank(dataViewParam.getCondition())) {
|
||||||
columnInfo.setColumnDefault("");
|
sqlSb.append(String.format(" where %s", dataViewParam.getCondition()));
|
||||||
}
|
}
|
||||||
String extra = columnInfo.getExtra();
|
return sqlSb.toString();
|
||||||
columnInfo.setExtra(StringUtils.isBlank(extra) ? "" : extra);
|
}
|
||||||
baseMapper.updateTableColumnDesc(dbName, tableName, columnName, newDesc, columnInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
public ProcedureDto getProcedureDetail(Long sourceId, String dbName, String typeName, String procName) {
|
* 获取分页查询的SQL(mysql数据库名中含有 - 等特殊字符,需要用反引号包裹)
|
||||||
BaseMapper baseMapper = this.getViewAuthBaseMapper(sourceId);
|
*
|
||||||
ProcedureDto procedureDetail = baseMapper.getProcedureDetail(dbName, typeName, procName);
|
* @author diantu
|
||||||
if (procedureDetail == null) {
|
* @since 2023年1月17日
|
||||||
// 新建的时候
|
*/
|
||||||
ProcedureDto procedureDetailNew = new ProcedureDto();
|
@Override
|
||||||
if (Objects.equals(typeName, "FUNCTION")) {
|
public String getQueryPageSql(DataViewParam dataViewParam) {
|
||||||
procedureDetailNew.setBody("CREATE DEFINER = CURRENT_USER " + typeName + " `" + dbName + "`.`" + procName + "`() RETURNS integer\n" +
|
String queryColumns = StringUtils.defaultIfBlank(dataViewParam.getRetainColumn(), "*");
|
||||||
"BEGIN\n" +
|
StringBuilder sqlSb = new StringBuilder();
|
||||||
"\t#Routine body goes here...\n" +
|
sqlSb.append(String.format("select %s from %s.%s", queryColumns, "`" + dataViewParam.getDbName() + "`", dataViewParam.getTableName()));
|
||||||
"\tRETURN 0;\n" +
|
if (StringUtils.isNotBlank(dataViewParam.getCondition())) {
|
||||||
"END;");
|
sqlSb.append(String.format(" where %s", dataViewParam.getCondition()));
|
||||||
} else {
|
}
|
||||||
procedureDetailNew.setBody("CREATE DEFINER = CURRENT_USER " + typeName + " `" + dbName + "`.`" + procName + "`()\n" +
|
if (StringUtils.isNotBlank(dataViewParam.getOrderColumn()) && StringUtils.isNotBlank(dataViewParam.getOrderType())) {
|
||||||
"BEGIN\n" +
|
sqlSb.append(String.format(" order by %s %s", dataViewParam.getOrderColumn(), dataViewParam.getOrderType()));
|
||||||
"\t#Routine body goes here...\n" +
|
}
|
||||||
"END;");
|
sqlSb.append(String.format(" limit %s offset %s", dataViewParam.getPageSize(), dataViewParam.getOffset()));
|
||||||
}
|
return sqlSb.toString();
|
||||||
procedureDetailNew.setDb(dbName);
|
}
|
||||||
procedureDetailNew.setDefiner("CURRENT_USER");
|
|
||||||
procedureDetailNew.setType(typeName);
|
|
||||||
return procedureDetailNew;
|
|
||||||
}
|
|
||||||
// 组装好SQL
|
|
||||||
String type = procedureDetail.getType();
|
|
||||||
String name = procedureDetail.getName();
|
|
||||||
String db = procedureDetail.getDb();
|
|
||||||
String paramList = StringUtils.defaultIfBlank(procedureDetail.getParamList(), "");
|
|
||||||
String[] definerArr = procedureDetail.getDefiner().split("@");
|
|
||||||
String createStr = String.format("CREATE DEFINER=`%s`@`%s` %s `%s`.`%s`(%s)", definerArr[0], definerArr[1], type, db, name, paramList);
|
|
||||||
if (Objects.equals(procedureDetail.getType(), "FUNCTION")) {
|
|
||||||
createStr += " RETURNS " + procedureDetail.getReturns();
|
|
||||||
}
|
|
||||||
procedureDetail.setBody(createStr + "\r\n" + procedureDetail.getBody());
|
|
||||||
return procedureDetail;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ExecuteResult saveProcedure(Long sourceId, String dbName, String typeName, String procName, String procSql) {
|
public TableDdlVo getTableDdl(Long sourceId, String dbName, String tableName) {
|
||||||
String firstLine = procSql.split("\n")[0];
|
BaseMapper baseMapper = this.getViewAuthBaseMapper(sourceId);
|
||||||
// 看函数名是否被修改了,修改会导致函数名的不确定,有认知上的成本,明确的先删再建吧
|
List<Map<String, String>> tableDdlList = baseMapper.getTableDdl(dbName, tableName);
|
||||||
if (!firstLine.contains("`" + procName + "`(") && !firstLine.contains(" " + procName + "(") && !firstLine.contains("." + procName + "(")) {
|
TableDdlVo tableDdlVo = new TableDdlVo();
|
||||||
return ExecuteResult.error("在编辑页面不允许修改函数名,如需新建或修改,请到列表页删除后再新建函数", procSql);
|
tableDdlVo.setCurrent(DatabaseProductEnum.MYSQL.name().toLowerCase());
|
||||||
}
|
tableDdlVo.setMysql("// 生成失败");
|
||||||
ProcedureDto procedureDetail = this.getProcedureDetail(sourceId, dbName, typeName, procName);
|
tableDdlVo.setOracle("// TODO 等待大佬来实现转换");
|
||||||
// 按MySQL的来是先删除再创建,如果其他数据库不是这个逻辑,需要重写本方法实现自己的逻辑
|
// TODO 将建表语句转换为其他数据库的,还不知道怎么做,先这样留着,看有没大佬来实现
|
||||||
BaseMapper baseMapper = this.getViewAuthBaseMapper(sourceId);
|
if (CollectionUtils.isNotEmpty(tableDdlList)) {
|
||||||
baseMapper.deleteProcedure(dbName, typeName, procName);
|
tableDdlVo.setMysql(tableDdlList.get(0).get("Create Table") + ";");
|
||||||
// 执行创建SQL
|
}
|
||||||
ExecuteParam executeParam = new ExecuteParam();
|
return tableDdlVo;
|
||||||
executeParam.setDatasourceId(sourceId);
|
}
|
||||||
executeParam.setExecuteId(IdUtil.randomUUID());
|
|
||||||
executeParam.setExecuteType(ExecuteType.ALL);
|
@Override
|
||||||
executeParam.setSql(procSql);
|
public void updateTableColumnDesc(Long sourceId, String dbName, String tableName, String columnName, String newDesc) {
|
||||||
executeParam.setMaxRows(1000);
|
BaseMapper baseMapper = this.getViewAuthBaseMapper(sourceId);
|
||||||
try {
|
// mysql要同时修改类型默认值等,所以先查出来
|
||||||
return sqlExecutor.execute(executeParam);
|
MysqlMapper mysqlMapper = databaseRegistrationBean.getBaseMapper(sourceId, MysqlMapper.class);
|
||||||
} catch (Exception e) {
|
ColumnInfoDto columnInfo = mysqlMapper.getColumnInfo(dbName, tableName, columnName);
|
||||||
try {
|
String isNullable = Optional.ofNullable(columnInfo.getIsNullable()).orElse("");
|
||||||
// 尝试恢复函数
|
columnInfo.setIsNullable("yes".equalsIgnoreCase(isNullable) ? "null" : "not null");
|
||||||
executeParam.setSql(procedureDetail.getBody());
|
String columnDefault = columnInfo.getColumnDefault();
|
||||||
sqlExecutor.execute(executeParam);
|
if (StringUtils.isNotBlank(columnDefault)) {
|
||||||
} catch (Exception e1) {
|
columnInfo.setColumnDefault("DEFAULT " + columnDefault);
|
||||||
return ExecuteResult.error("执行和恢复函数均失败,请先备份您的SQL,以防丢失\n" + e.getMessage(), procSql);
|
} else {
|
||||||
}
|
columnInfo.setColumnDefault("");
|
||||||
return ExecuteResult.error(e.getMessage(), procSql);
|
}
|
||||||
}
|
String extra = columnInfo.getExtra();
|
||||||
}
|
columnInfo.setExtra(StringUtils.isBlank(extra) ? "" : extra);
|
||||||
|
baseMapper.updateTableColumnDesc(dbName, tableName, columnName, newDesc, columnInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ProcedureDto getProcedureDetail(Long sourceId, String dbName, String typeName, String procName) {
|
||||||
|
BaseMapper baseMapper = this.getViewAuthBaseMapper(sourceId);
|
||||||
|
ProcedureDto procedureDetail = baseMapper.getProcedureDetail(dbName, typeName, procName);
|
||||||
|
if (procedureDetail == null) {
|
||||||
|
// 新建的时候
|
||||||
|
ProcedureDto procedureDetailNew = new ProcedureDto();
|
||||||
|
if (Objects.equals(typeName, "FUNCTION")) {
|
||||||
|
procedureDetailNew.setBody("CREATE DEFINER = CURRENT_USER " + typeName + " `" + dbName + "`.`" + procName + "`() RETURNS integer\n" +
|
||||||
|
"BEGIN\n" +
|
||||||
|
"\t#Routine body goes here...\n" +
|
||||||
|
"\tRETURN 0;\n" +
|
||||||
|
"END;");
|
||||||
|
} else {
|
||||||
|
procedureDetailNew.setBody("CREATE DEFINER = CURRENT_USER " + typeName + " `" + dbName + "`.`" + procName + "`()\n" +
|
||||||
|
"BEGIN\n" +
|
||||||
|
"\t#Routine body goes here...\n" +
|
||||||
|
"END;");
|
||||||
|
}
|
||||||
|
procedureDetailNew.setDb(dbName);
|
||||||
|
procedureDetailNew.setDefiner("CURRENT_USER");
|
||||||
|
procedureDetailNew.setType(typeName);
|
||||||
|
return procedureDetailNew;
|
||||||
|
}
|
||||||
|
// 组装好SQL
|
||||||
|
String type = procedureDetail.getType();
|
||||||
|
String name = procedureDetail.getName();
|
||||||
|
String db = procedureDetail.getDb();
|
||||||
|
String paramList = StringUtils.defaultIfBlank(procedureDetail.getParamList(), "");
|
||||||
|
String[] definerArr = procedureDetail.getDefiner().split("@");
|
||||||
|
String createStr = String.format("CREATE DEFINER=`%s`@`%s` %s `%s`.`%s`(%s)", definerArr[0], definerArr[1], type, db, name, paramList);
|
||||||
|
if (Objects.equals(procedureDetail.getType(), "FUNCTION")) {
|
||||||
|
createStr += " RETURNS " + procedureDetail.getReturns();
|
||||||
|
}
|
||||||
|
procedureDetail.setBody(createStr + "\r\n" + procedureDetail.getBody());
|
||||||
|
return procedureDetail;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ExecuteResult saveProcedure(Long sourceId, String dbName, String typeName, String procName, String procSql) {
|
||||||
|
String firstLine = procSql.split("\n")[0];
|
||||||
|
// 看函数名是否被修改了,修改会导致函数名的不确定,有认知上的成本,明确的先删再建吧
|
||||||
|
if (!firstLine.contains("`" + procName + "`(") && !firstLine.contains(" " + procName + "(") && !firstLine.contains("." + procName + "(")) {
|
||||||
|
return ExecuteResult.error("在编辑页面不允许修改函数名,如需新建或修改,请到列表页删除后再新建函数", procSql);
|
||||||
|
}
|
||||||
|
ProcedureDto procedureDetail = this.getProcedureDetail(sourceId, dbName, typeName, procName);
|
||||||
|
// 按MySQL的来是先删除再创建,如果其他数据库不是这个逻辑,需要重写本方法实现自己的逻辑
|
||||||
|
BaseMapper baseMapper = this.getViewAuthBaseMapper(sourceId);
|
||||||
|
baseMapper.deleteProcedure(dbName, typeName, procName);
|
||||||
|
// 执行创建SQL
|
||||||
|
ExecuteParam executeParam = new ExecuteParam();
|
||||||
|
executeParam.setDatasourceId(sourceId);
|
||||||
|
executeParam.setExecuteId(IdUtil.randomUUID());
|
||||||
|
executeParam.setExecuteType(ExecuteType.ALL);
|
||||||
|
executeParam.setSql(procSql);
|
||||||
|
executeParam.setMaxRows(1000);
|
||||||
|
try {
|
||||||
|
return sqlExecutor.execute(executeParam);
|
||||||
|
} catch (Exception e) {
|
||||||
|
try {
|
||||||
|
// 尝试恢复函数
|
||||||
|
executeParam.setSql(procedureDetail.getBody());
|
||||||
|
sqlExecutor.execute(executeParam);
|
||||||
|
} catch (Exception e1) {
|
||||||
|
return ExecuteResult.error("执行和恢复函数均失败,请先备份您的SQL,以防丢失\n" + e.getMessage(), procSql);
|
||||||
|
}
|
||||||
|
return ExecuteResult.error(e.getMessage(), procSql);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package com.zyplayer.doc.db.service.database;
|
package com.zyplayer.doc.db.service.database;
|
||||||
|
|
||||||
|
import com.zyplayer.doc.db.controller.param.DataViewParam;
|
||||||
import com.zyplayer.doc.db.framework.db.enums.DatabaseProductEnum;
|
import com.zyplayer.doc.db.framework.db.enums.DatabaseProductEnum;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -12,18 +14,42 @@ import org.springframework.stereotype.Service;
|
|||||||
@Service
|
@Service
|
||||||
public class OracleServiceImpl extends DbBaseService {
|
public class OracleServiceImpl extends DbBaseService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DatabaseProductEnum getDatabaseProduct() {
|
public DatabaseProductEnum getDatabaseProduct() {
|
||||||
return DatabaseProductEnum.ORACLE;
|
return DatabaseProductEnum.ORACLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* oracle数据库中没有也不需要use语句,指定数据库名的情况下直接返回空即可
|
* oracle数据库中没有也不需要use语句,指定数据库名的情况下直接返回空即可
|
||||||
* @author diantu
|
* @author diantu
|
||||||
* @since 2023年1月16日
|
* @since 2023年1月16日
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String getUseDbSql(String dbName) {
|
public String getUseDbSql(String dbName) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取分页查询的SQL(oracle分页)
|
||||||
|
*
|
||||||
|
* @author diantu
|
||||||
|
* @since 2023年1月17日
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getQueryPageSql(DataViewParam dataViewParam) {
|
||||||
|
String queryColumns = StringUtils.defaultIfBlank(dataViewParam.getRetainColumn(), "*");
|
||||||
|
StringBuilder sqlSb = new StringBuilder();
|
||||||
|
sqlSb.append(String.format("select %s from %s.%s", queryColumns, dataViewParam.getDbName(), dataViewParam.getTableName()));
|
||||||
|
if (StringUtils.isNotBlank(dataViewParam.getCondition())) {
|
||||||
|
sqlSb.append(String.format(" where %s", dataViewParam.getCondition()));
|
||||||
|
}
|
||||||
|
if (StringUtils.isNotBlank(dataViewParam.getOrderColumn()) && StringUtils.isNotBlank(dataViewParam.getOrderType())) {
|
||||||
|
sqlSb.append(String.format(" order by %s %s", dataViewParam.getOrderColumn(), dataViewParam.getOrderType()));
|
||||||
|
}
|
||||||
|
StringBuilder sqlSbFinal = new StringBuilder();
|
||||||
|
Integer pageSize = dataViewParam.getPageSize() * dataViewParam.getPageNum();
|
||||||
|
Integer offsetSize = dataViewParam.getPageSize() * (dataViewParam.getPageNum() - 1) + 1;
|
||||||
|
sqlSbFinal.append(String.format("select * from ( select %s from %s", queryColumns + ",rownum rn", "(" + sqlSb + ") where rownum<=" + pageSize + " ) t2 where t2.rn >=" + offsetSize));
|
||||||
|
return sqlSbFinal.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user