从SQL过程调用QUSRJOBI将返回空白



从SQL过程调用qusrjobiAPI时,返回数据和返回错误输出参数均以空格形式返回。

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程序时,为什么它不能成功地调用qusrjobiapi?

以下是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;

就是你所需要的。

相关内容

  • 没有找到相关文章

最新更新