从SQL过程调用qusrjobi
API时,返回数据和返回错误输出参数均以空格形式返回。
declare vData char(2000) default ' ' ;
declare vDataLx int default 0 ;
declare vFmtName char(8) default ' ' ;
declare vJob char(26) default ' ' ;
declare vJobId char(16) default ' ' ;
declare VRESETFLAG char(1) default ' ' ;
declare vErr char(2000) default ' ' ;
declare VJOBNAME char(10) default ' ' ;
set vDataLx = 2000 ;
set vFmtName = 'JOBI0100' ;
set vJob = '*' ;
set vJobId = ' ' ;
set vErr = x'000007D0' ;
SET VRESETFLAG = '0' ;
call qusrjobi( vData, vDataLx, vFmtName, vJob, vJobId,
vErr, VRESETFLAG ) ;
SET VJOBNAME = SUBSTR(VDATA,9,10) ;
SET VERRMSG = SUBSTR(VERR,9,80) ;
CALL SYSTOOLS.LPRINTF( 'QUSRJOBI. JOBNAME:' || VJOBNAME
|| ' ERRMSG:' || RTRIM(VERRMSG)) ;
相同的SQL过程代码可以成功地调用具有相同参数的RPG程序,其中RPG依次调用qusrjobi
并返回结果。
set vDataLx = 2000 ;
set vFmtName = 'JOBI0100' ;
set vJob = '*' ;
set vJobId = ' ' ;
set vErr = x'000007D0' ;
SET VRESETFLAG = '0' ;
call TESTRPG( vData, vDataLx, vFmtName, vJob, vJobId,
vErr, VRESETFLAG ) ;
SET VJOBNAME = SUBSTR(VDATA,9,10) ;
CALL SYSTOOLS.LPRINTF( 'TESTRPG. JOBNAME:' || VJOBNAME ) ;
以下是从qcmd
:调用的SQL过程
> call testsql
TESTRPG. JOBNAME:STEVE28 ERRMSG:
QUSRJOBI. JOBNAME: ERRMSG:
RPG程序具有与API相同的参数集:
h option(*SrcStmt)
** ------------------------ testrpg -----------------------------
d testrpg pr extpgm('TESTRPG')
d outData 2000a
d inDataLx 10i 0 const
d inFmtName 8a const
d inJOb 26a const
d inJobId 16a const
d inErr 2000a
d inResetFlag 1a
** ---------------------- pr_qusrJobi -------------------------------
** QusrJobi - retrieve job information
dpr_qusrjobi pr extpgm('QUSRJOBI')
d OutRcv 2000a
d InRcvLx 10i 0 const
d InFmtName 8a const
d InJob 26a const
d InJobId 16a const
d OutError 2000a
d InReset 1a const
** ------------------------ testrpg ------------------------
d testrpg pi
d outData 2000a
d inDataLx 10i 0 const
d inFmtName 8a const
d inJOb 26a const
d inJobId 16a const
d inErr 2000a
d inResetFlag 1a
/free
pr_qusrjobi( outData: inDataLx: inFmtName:
inJob: inJobId: inErr: inResetFlag ) ;
*inlr = '1' ;
return ;
/end-free
当这个SQL过程可以用相同的参数集调用RPG程序时,为什么它不能成功地调用qusrjobi
api?
以下是SQL过程的完整代码:
CREATE or replace PROCEDURE testsql(
)
LANGUAGE SQL
SPECIFIC testsql
SET OPTION DATFMT = *ISO, DLYPRP = *YES, DBGVIEW = *SOURCE,
USRPRF = *OWNER, DYNUSRPRF = *OWNER, COMMIT = *CHG
BEGIN
declare sqlCode int DEFAULT 0 ;
declare vSqlCode decimal(5,0) ;
declare vSqlState char(5) ;
declare vErrText varchar(2000) ;
declare sqlState char(5) ;
declare vData char(2000) default ' ' ;
declare vDataLx int default 0 ;
declare vFmtName char(8) default ' ' ;
declare vJob char(26) default ' ' ;
declare vJobId char(16) default ' ' ;
declare VRESETFLAG char(1) default ' ' ;
declare vErr char(2000) default ' ' ;
declare VJOBNAME char(10) default ' ' ;
declare VERRMSG char(80) default ' ' ;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
begin
SET vSqlCode = SQLCODE ;
SET vSqlState = SQLstate ;
get diagnostics exception 1 vErrText = message_text ;
CALL SYSTOOLS.LPRINTF( 'ERROR:' || VERRTEXT ) ;
end ;
set vDataLx = 2000 ;
set vFmtName = 'JOBI0100' ;
set vJob = '*' ;
set vJobId = ' ' ;
set vErr = x'000007D0' ;
SET VRESETFLAG = '0' ;
call TESTRPG( vData, vDataLx, vFmtName, vJob, vJobId,
vErr, VRESETFLAG ) ;
SET VJOBNAME = SUBSTR(VDATA,9,10) ;
SET VERRMSG = SUBSTR(VERR,9,80) ;
CALL SYSTOOLS.LPRINTF( 'TESTRPG. JOBNAME:' || VJOBNAME
|| ' ERRMSG:' || RTRIM(VERRMSG)) ;
set vDataLx = 2000 ;
set vFmtName = 'JOBI0100' ;
set vJob = '*' ;
set vJobId = ' ' ;
set vErr = x'000007D0' ;
SET VRESETFLAG = '0' ;
call qusrjobi( vData, vDataLx, vFmtName, vJob, vJobId,
vErr, VRESETFLAG ) ;
SET VJOBNAME = SUBSTR(VDATA,9,10) ;
SET VERRMSG = SUBSTR(VERR,9,80) ;
CALL SYSTOOLS.LPRINTF( 'QUSRJOBI. JOBNAME:' || VJOBNAME
|| ' ERRMSG:' || RTRIM(VERRMSG)) ;
END
我没有你的问题的答案,但是,我认为,你可以用这个来代替。对我来说效果很好!
exec sql declare jobs_cursor cursor for
select x.job_name_short, x.job_user, x.job_number,
case
when x.job_type in('BCH', 'BCI', 'EVK')
then 'B' else 'I'
end,
y.job_status
from table(qsys2.job_info(job_status_filter => trim(:job_type),
job_user_filter => trim(:user_name))) x
join table(qsys2.active_job_info()) y
on x.job_name=y.job_name
for read only ;
不再需要使用api了。
活动作业信息
作业信息
我的第一个想法。。。我绝不会尝试直接从SQL调用系统API,因为用RPG这样的语言处理所需的数据结构要容易得多。
我的第二个想法是,您需要将QUSRJOBI定义为一个外部存储过程。
虽然IBMi上的每个*PGM都可以作为存储过程调用,但当像您所做的那样隐式调用时,DB会做出某些假设。包括我相信所有的parm都是输入parm。
然而,即使在定义之后
create or replace procedure GetJobInfo (
out buffer char(100)
, in bufLen int
, in formatName char(8)
, in qualJobName char(26)
, in internalJobId char(16)
-- , inout errCode char(20)
-- , in reset char(1)
)
parameter style general
program type main
external name QUSRJOBI
;
我无法让它发挥作用call GetJobInfo(?,100,'JOBI0100','*', ' ');
仍然只是把空位放回缓冲区。
最后,处理系统API的困难正是IBM开始提供封装它们的SQL服务的原因。正如另一个答案所提到的,JOB_INFO((和ACTIVE_JOB_INFO((可能是更好的选择。正如我的评论所提到的,使用性能良好的过滤器的关键是包含适当的过滤器。
如果您要查找的只是当前作业的job_type,则
SELECT job_type
FROM TABLE (QSYS2.ACTIVE_JOB_INFO(JOB_NAME_FILTER=>'*'
, DETAILED_INFO => 'NONE') ) X;
就是你所需要的。