oracle存储过程+mybatis实现动态表名取数

笔记仅记录最简单的实现,个性化需求可自行改造:

 

1. 存储过程:

复制代码
create or replace PROCEDURE GET_DATA_BY_TABLENM(tableName VARCHAR2,resultSet out SYS_REFCURSOR)
is
sqlStr clob;
fieldSqlStr clob;
fieldStr clob;
BEGIN
fieldSqlStr:='select LISTAGG(decode(data_type,''DATE'',''to_char(''||COLUMN_NAME||'',''''yyyyMMdd'''')'',''TIMESTAMP(6)'',''to_char(''||COLUMN_NAME||'',''''YYYY-MM-DD hh24:mi:ss.ff6'''')'',COLUMN_NAME),''||''''#@#''''||'') within group(order BY column_id) from user_tab_columns where table_name='''||tableName||'''';
dbms_output.put_line(fieldSqlStr);
EXECUTE IMMEDIATE fieldSqlStr into fieldstr;
dbms_output.put_line(fieldstr);
sqlStr:='select '||fieldstr||' as data from '||tableName;
dbms_output.put_line(sqlstr);
open resultSet for sqlstr;
end;
复制代码

 

2. mybatis mapper.xml代码:

复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="**.Mapper">
    <!--namespace根据自己需要创建的的mapper的路径和名称填写-->

    <resultMap id="dataMap" type="**.Dto">
        <result property="data" column="data"></result>
    </resultMap>

    <select id="getDataByTableNm" resultType="java.util.List" statementType="CALLABLE">
        {call GET_DATA_BY_TABLENM(#{tableNm},#{resultSet,mode=OUT,jdbcType=CURSOR,javaType=ResultSet,resultMap=dataMap})}
    </select>

</mapper>
复制代码

 

3. java代码调用

  1)返回结果集实体类

复制代码
public class Dto {

    private String data;

    public Dto(){
    }
    public Dto(String data){
        this.data=data;
    }
    public String getData() {
        return data;
    }
    public void setData(String data) {
        this.data = data;
    }
}
复制代码

  2)mapper接口

public interface Mapper {
    Map<String,Object> getDataByTableNm(Map<String, Object> paraMap);
}

  3)调用

复制代码
//查询参数
Map<String,Object> paraMap=new HashMap<>();
//用于接收存储过程返回结果集
paraMap.put("resultSet","");
//表名
paraMap.put("tableNm",tableNm);
mapper.getDataByTableNm(paraMap);
//输出结果
for(Dto dto:(List<Dto>)paraMap.get("resultSet")){
    System.out.println(dto);
}
复制代码

 

posted @   远山飘来清风  阅读(156)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示