1.修复mysql数据库因数据库名包含特殊字符导致的报错问题

2.修复oracle分页语句错误
3.oracle表信息sql补全
This commit is contained in:
diantu
2023-01-17 13:57:12 +08:00
parent 8689918837
commit 5b39cfe2f1
3 changed files with 280 additions and 190 deletions

View File

@@ -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>

View File

@@ -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);
}
}
} }

View File

@@ -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();
}
} }