如何捕获IBM i指定库的替代文件名(SQL表名)?
嗨,这个问题我太熟悉了!要抓取IBM i指定库中文件的SQL表名(也就是你说的“替代文件名”),确实DSPFD TYPE(*BASATR)搞不定——因为这个命令的基础属性输出里根本不包含SQL名称字段。给你三个实用的解决方案,从简单到灵活都有:
方法1:用SQL查询系统视图(最省心)
IBM i的QSYS2库内置了专门的系统视图,直接写SQL就能一次性拿到所有你要的信息,完全不用折腾临时文件。比如用SYSTABLES视图,它的TABLE_NAME就是SQL表名,SYSTEM_TABLE_NAME是IBM i的10字符系统短名:
SELECT SYSTEM_TABLE_NAME AS 系统短名, TABLE_NAME AS SQL表名, TABLE_SCHEMA AS 库名 FROM QSYS2.SYSTABLES WHERE TABLE_SCHEMA = 'MYSQL_LIB' -- 替换成你的目标库名 AND TABLE_TYPE = 'TABLE'; -- 如果需要包含视图,直接删掉这行就行
你可以用SQL客户端连接执行,或者在IBM i上用RUNSQLSTM命令跑这段SQL。
方法2:用DSPOBJD命令生成结果文件
DSPOBJD命令的对象列表输出里包含了长名称(也就是替代文件名)字段。执行以下命令:
DSPOBJD OBJ(MYSQL_LIB/*ALL) TYPE(*FILE) OUTPUT(*OUTFILE) OUTFILE(QTEMP/TEMP_OBJD)
生成的临时文件QTEMP/TEMP_OBJD里,OBJLONGSNM字段就是你要的SQL表名,OBJNAME对应系统短名,OBJLIB是库名。之后你可以用SQL查询这个文件,或者用程序处理。
方法3:使用QUSLTOB API(定制化场景)
如果需要更灵活的编程处理,可以调用QUSLTOB(List Objects API),它能列出指定库的所有文件对象,并且返回长名称信息。这里给你一个简单的CL程序片段参考:
PGM DCL VAR(&LIST) TYPE(*CHAR) LEN(1000) DCL VAR(&LIST_LEN) TYPE(*DEC) LEN(5 0) VALUE(1000) DCL VAR(&ERR_CODE) TYPE(*CHAR) LEN(12) VALUE(X'000000000000') CALL PGM(QUSLTOB) PARM( &LIST &LIST_LEN 'OBJL0100' -- 格式名,固定用这个获取长名称 'MYSQL_LIB' -- 目标库 '*FILE' -- 对象类型 '*ALL' -- 对象名 '*ALL' -- 对象属性 &ERR_CODE ) /* 接下来需要解析&LIST变量中的数据:长名称从偏移量106开始,长度128字节 */ ENDPGM
这个方法需要你自己解析API返回的结构化数据,适合需要集成到自定义程序里的场景。
内容的提问来源于stack exchange,提问作者Mustapha George
相关产品推荐
相关产品推荐

