AS400 CLLE开发:统计活动子系统并邮件文本输出及命令输出获取
AS400 CLLE 实现活动子系统统计邮件发送与命令输出捕获
一、统计活动子系统数量并发送邮件
实现思路
利用IBM官方系统视图QSYS2.SUBSYSTEM_INFO直接查询活动状态的子系统,统计数量后通过SNDDST命令发送纯文本邮件。
示例CLLE代码
PGM /* 定义变量:活动子系统计数、邮件文本 */ DCL VAR(&ACTCOUNT) TYPE(*INT) LEN(5) VALUE(0) DCL VAR(&MSGTEXT) TYPE(*CHAR) LEN(100) /* SQL统计活动子系统数量,结果存入变量 */ RUNSQL SQL('SELECT COUNT(*) INTO :&ACTCOUNT FROM QSYS2.SUBSYSTEM_INFO WHERE SUBSYSTEM_STATUS = ''ACTIVE''') COMMIT(*NONE) /* 构造邮件内容 */ CHGVAR VAR(&MSGTEXT) VALUE('当前系统活动子系统数量:' || %CHAR(&ACTCOUNT)) /* 发送邮件:内部用户用TOUSR,外部邮件用TOINTNET */ SNDDST TYPE(*LMSG) TOINTNET(('admin@example.com')) DSTD('活动子系统统计') MSG(&MSGTEXT) ENDPGM
关键说明
QSYS2.SUBSYSTEM_INFO是官方维护的系统视图,包含子系统状态、名称、所属库等完整信息,比直接读取底层文件更稳定可靠。- 发送外部邮件需提前配置系统SMTP:用
CHGSMTPA命令设置SMTP服务器地址,同时确保执行用户的配置文件中已指定邮件地址(CHGUSRPRF MAILD(xxx@xxx.com))。 - 若发送给内部系统用户,将
TOINTNET参数替换为TOUSR(('USERID'))即可。
二、CLLE中捕获系统命令输出(替代*PRINT)
针对不同系统命令,可选择以下几种实用方案:
1. 利用命令自带OUTPUT(*OUTFILE)参数(推荐)
大部分IBM系统命令支持直接输出到物理文件,以WRKSBS为例:
PGM /* 定义输出文件路径 */ DCL VAR(&OUTFILE) TYPE(*CHAR) LEN(20) VALUE('MYLIB/SBS_OUTPUT') /* 复制WRKSBS的系统输出模板文件 */ CRTDUPOBJ OBJ(QADSSBS) FROMLIB(QSYS) OBJTYPE(*FILE) TOLIB(MYLIB) NEWOBJ(SBS_OUTPUT) /* 执行WRKSBS并输出到指定文件 */ WRKSBS OUTPUT(*OUTFILE) OUTFILE(&OUTFILE) /* 后续处理:用SQL查询文件内容,或用CL/RPG读取记录 */ RUNSQL SQL('SELECT SUBSYSTEM_NAME, SUBSYSTEM_STATUS FROM MYLIB/SBS_OUTPUT') COMMIT(*NONE) /* 可选:清理临时输出文件 */ DLTF FILE(MYLIB/SBS_OUTPUT) ENDPGM
说明:QADSSBS是WRKSBS命令的系统默认输出模板,复制后可直接作为命令输出目标文件,其结构与WRKSBS界面展示的内容完全一致。
2. 用QSH捕获无*OUTFILE参数的命令输出
对于不支持文件输出的命令,可借助QSH将命令输出写入IFS临时文件,再读取处理:
PGM DCL VAR(&CMD) TYPE(*CHAR) LEN(200) /* 执行WRKSBS并过滤活动子系统,输出到IFS临时文件 */ CHGVAR VAR(&CMD) VALUE('WRKSBS | grep ''ACTIVE'' > /tmp/active_sbs.txt') QSH CMD(&CMD) /* 用SQL读取IFS文件内容到物理表 */ RUNSQL SQL('CREATE TABLE MYLIB/ACTIVE_SBS AS (SELECT * FROM TABLE(QSYS2.IFS_READ_FILE(''/tmp/active_sbs.txt''))) WITH DATA') COMMIT(*NONE) /* 清理IFS临时文件 */ QSH CMD('rm /tmp/active_sbs.txt') ENDPGM
说明:需确保执行用户拥有IFS读写权限,QSYS2.IFS_READ_FILE函数用于读取IFS文本文件的内容并转化为SQL可处理的格式。
3. 用SQL替代系统命令(高效方案)
若命令对应的信息可通过系统视图查询,直接用SQL获取数据比捕获命令输出更高效。比如WRKSBS展示的所有信息,都可以通过QSYS2.SUBSYSTEM_INFO视图查询,无需执行WRKSBS命令。
内容的提问来源于stack exchange,提问作者Tejal Porwal
相关产品推荐
相关产品推荐

