PL/SQL下Oracle、MariaDB多表批量查询最新记录的实现问题
多数据库批量获取表最新记录解决方案(适配Oracle/MariaDB+DBeaver)
原代码报错根因
- 语法不兼容:PL/SQL是Oracle专属语法,MariaDB完全不支持;同时Oracle原生不支持
LIMIT关键字,动态表名也不能直接写FROM TBLS(i),必须使用动态SQL语法 - 逻辑缺陷:
SELECT *返回多字段结果,不能直接赋值给单个VARCHAR2类型变量,也无法自动输出表字段名
适配双库的DBeaver落地实现
该方案基于DBeaver客户端原生的脚本功能实现,不需要在数据库端创建任何存储过程/函数,权限要求低,切换Oracle/MariaDB数据源仅需微调单表查询语法即可,完全满足自动化测试校验的需求。
1. 统一双库兼容的单表查询语法
优先使用SQL2008标准语法,Oracle 12c+、MariaDB 10.0.5+均原生支持,无需修改直接切换数据源即可运行:
-- 双库通用:获取指定表按message_dt降序的最新1条记录 SELECT * FROM ${table_name} ORDER BY message_dt DESC FETCH FIRST 1 ROW ONLY;
低版本数据库兼容写法见文末备选方案
2. DBeaver批量执行脚本
新建SQL脚本,直接在脚本中配置要查询的表名列表即可自动循环执行:
-- 在此处配置需要查询的表名,用英文逗号分隔即可 @set tables = TABLENAME_1,TABLENAME_2,TABLENAME_3,TABLENAME_N -- 循环遍历所有表执行查询 @foreach table in ${tables} -- 输出当前表标识 SELECT '===== 表名:${table} 字段名列表 =====' AS 结果分类 FROM dual; -- 双库兼容查询表字段名 SELECT column_name AS 字段名 FROM information_schema.columns WHERE table_name = '${table}' ORDER BY ordinal_position; -- 输出最新记录标识 SELECT '===== 表名:${table} 最新记录 =====' AS 结果分类 FROM dual; -- 查询最新1条记录 SELECT * FROM ${table} ORDER BY message_dt DESC FETCH FIRST 1 ROW ONLY; @end
3. 结果导出为Excel
脚本执行完成后,DBeaver结果面板会按顺序输出每个表的字段名、最新记录:
- 选中所有结果集,右键选择「导出」→ 选择「Excel」格式
- 导出时勾选「包含结果集名称」,导出后的Excel会自动按需求格式排列内容,也可直接在控制台查看结构化结果
低版本数据库备选语法
如果使用的Oracle版本低于12c、或MariaDB版本低于10.0.5,替换单表查询部分的语法即可:
- Oracle 11g及更早版本:
SELECT * FROM ( SELECT * FROM ${table_name} ORDER BY message_dt DESC ) WHERE ROWNUM = 1;
- MariaDB 10.0之前版本:
SELECT * FROM ${table_name} ORDER BY message_dt DESC LIMIT 1;
内容的提问来源于stack exchange,提问作者Stragbou
相关产品推荐
相关产品推荐

