IBM i中GENERATE_SPREADSHEET函数处理含$限定名异常求助
解决IBM i V7R4中SYSTOOLS.GENERATE_SPREADSHEET识别带$前缀库名的问题
问题原因
SYSTOOLS.GENERATE_SPREADSHEET的SPREADSHEET_QUERY参数会以动态SQL方式执行传入的语句,带$的库名属于特殊标识符,动态SQL解析时无法直接识别,必须用**分隔标识符(双引号)**包裹才能正确解析。
可行解决方法
方法1:在查询语句中用双引号包裹带$的库名和表名
修改嵌入式SQL中的SPREADSHEET_QUERY参数,将带特殊字符的限定名用双引号括起来。注意在RPGLE中双引号需要转义(用两个双引号表示一个):
ctl-opt DFTACTGRP(*NO); dcl-s returncode zoned(5); exec sql set :returncode = SYSTOOLS.GENERATE_SPREADSHEET( PATH_NAME => '/home/tmcneil/mysheet', SPREADSHEET_QUERY => 'select * from "$MYLIB"."MYFILE"', SPREADSHEET_TYPE => 'xlsx' , COLUMN_HEADINGS => 'COLUMN') ; return;
方法2:切换当前模式到目标库,使用非限定表名
通过SET CURRENT SCHEMA先切换到带$前缀的库,查询语句中不再指定库名,规避特殊字符解析问题:
ctl-opt DFTACTGRP(*NO); dcl-s returncode zoned(5); exec sql set current schema = "$MYLIB"; exec sql set :returncode = SYSTOOLS.GENERATE_SPREADSHEET( PATH_NAME => '/home/tmcneil/mysheet', SPREADSHEET_QUERY => 'select * from MYFILE', SPREADSHEET_TYPE => 'xlsx' , COLUMN_HEADINGS => 'COLUMN') ; return;
方法3:用变量传递格式化后的查询语句
如果需要更灵活的表名传递逻辑,可以先将格式化好的查询语句存入变量,再传入函数:
ctl-opt DFTACTGRP(*NO); dcl-s returncode zoned(5); dcl-s queryStmt varchar(100); queryStmt = 'select * from "$MYLIB"."MYFILE"'; exec sql set :returncode = SYSTOOLS.GENERATE_SPREADSHEET( PATH_NAME => '/home/tmcneil/mysheet', SPREADSHEET_QUERY => :queryStmt, SPREADSHEET_TYPE => 'xlsx' , COLUMN_HEADINGS => 'COLUMN') ; return;
验证说明
以上方法均适配V7R4环境,兼容作业/源文件CCSID 37、系统CCSID 65535的配置,执行后可正常生成Spreadsheet文件。
内容的提问来源于stack exchange,提问作者Tony MST
相关产品推荐
相关产品推荐

