AS400中SQL查询结果为空时输出‘NO RECORDS FOUND’的实现方案
高效实现AS400上创建表后空表提示的方案
针对你的需求,最高效的实现方式是在创建表后用EXISTS快速检查表是否为空,再通过DB2 for i的系统存储过程调用CL命令输出提示,避免重复扫描表带来的性能损耗。
实现代码(纯SQL脚本)
-- 创建或替换INTABLE表(若表已存在则替换,可选) CREATE OR REPLACE TABLE INTABLE AS( SELECT SSDSC1 AS DESCRIPTION, STRXCH AS EXCH, SSYMBL AS SYMBOL, SLUSER AS USER_ID, CAST(SEXPDT AS NUMERIC(9,0)) AS EXP_DATE, CAST(DMKTDT AS NUMERIC(9,0)) AS MRK_DATE FROM FILELIB/OUTTABLE WHERE SSUBTY <> ' ' AND SPTYPE = 'Q' AND CAST(SEXPDT AS NUMERIC(9,0)) >= CAST(DMKTDT AS NUMERIC(9,0))) WITH DATA; -- 检查INTABLE是否为空,为空则发送提示消息 IF NOT EXISTS(SELECT 1 FROM INTABLE) THEN CALL QSYS2.QCMDEXC('SNDMSG MSG(''NO RECORDS FOUND'') TOUSR(*CURRENT)'); END IF;
方案优势
- 性能最优:使用
EXISTS(SELECT 1 FROM INTABLE)替代COUNT(*),因为EXISTS只要检测到第一条记录就立即返回结果,无需扫描全表统计行数,在表有数据时性能提升明显。 - 纯SQL实现:无需额外编写CL程序或处理临时文件,直接在SQL脚本内完成所有逻辑,适配AS400的DB2 for i环境。
- 灵活提示:通过
QCMDEXC调用SNDMSG命令,将提示消息发送到当前用户的消息队列,确保你能及时看到反馈。
补充说明
- 如果不需要替换已存在的
INTABLE,可以去掉OR REPLACE关键字,保持原有的CREATE TABLE语法。 - 若需要将提示输出到作业日志而非消息队列,可将
SNDMSG替换为SNDPGMMSG MSG('NO RECORDS FOUND') TOPGMQ(*EXT) MSGTYPE(*INFO),消息会直接写入作业日志。
内容的提问来源于stack exchange,提问作者TommyV
相关产品推荐
相关产品推荐

