External stored procedure that reads from a data queue

External stored procedure that reads from a data queue
External stored procedure that reads from a data queue, read data from data queue using sql, qrcvdtaq api, bmi, as400, sql, db2fori,rpgle, as400andsqltricks
External stored procedure that reads from a data queue

In my previous article we created a stored procedure for writing data to the data queue using the external stored procedure. Now, in this article I'm going to read data from the data queue.

RPGLE program to read data from Data queue

RPG Code in Fixed format for reading data from data queue.
     D QRCVDTAQ        PR                  extpgm('QRCVDTAQ')      
     D dtquenam                      10A   const                   
     D dtquelib                      10A   const                   
     D datalen                        5P 0 const                   
     D databuf                    32767A   const options(*varsize) 
     D waittime                       5P 0 const                   
                                                                   
     D main            pr                  extpgm('EXTPGM6')       
     D                               10a                           
     D                               10a                           
     D                               20a                           
     D main            pi                                          
     D dtquenam                      10a                           
     D dtquelib                      10a                           
     D receive                       20a                           
     D len             s              5P 0 inz                     
     D waittime        s              5p 0 inz(10)                 
     C                   EVAL      RECEIVE = ' '                   
     C                   CALL      'QRCVDTAQ'                  
     C                   PARM                    dtquenam                 
     C                   PARM                    dtquelib                 
     C                   PARM                    len                      
     C                   PARM                    receive                  
     C                   PARM                    waittime                 
     C     receive       DSPLY                                            
     C     len           DSPLY                                            
     C                   SETON                                        LR  
     C                   RETURN                      return                                                                     
RPG Code in /Free format for reading data from data queue.
     D QRCVDTAQ        PR                  extpgm('QRCVDTAQ')           
     D dtquenam                      10A   const                        
     D dtquelib                      10A   const                        
     D datalen                        5P 0 const                        
     D databuf                    32767A   const options(*varsize)      
     D waittime                       5P 0 const                        
                                                                        
     D main            pr                  extpgm('EXTPGM6')            
     D                               10a                                
     D                               10a                                
     D                               20a                                
     D main            pi                                               
     D dtquenam                      10a                                
     D dtquelib                      10a                                
     D receive                       20a                                
     D len             s              5P 0 inz                          
     D waittime        s              5P 0 inz(10)                      
      /Free                                                             
        receive = ' ';                                                 
        QRCVDTAQ(dtquenam:dtquelib:len:receive:waittime);   
        dsply receive;                                      
        dsply len;                                          
        *INLR = *ON;                                        
        return;                                             
      /End-Free
RPG Code in fully Free format for reading data from data queue.
**FREE                                                  
     dcl-pr QRCVDTAQ extpgm ;                           
       *n char(10) const;                               
       *n char(10) const;                               
       *n packed(5:0) const;                            
       *n char(32767) const options(*varsize);          
       *n packed(5:0) const;                            
     end-pr;                                            
                                                        
     dcl-pi *N;                                         
       dtquenam char(10);                               
       dtquelib char(10);                               
       receive char(20);                                
     end-pi;                                            
                                                        
     dcl-s len packed(5:0) inz;                         
     dcl-c waittime const(10);                          
                                                        
     QRCVDTAQ(dtquenam:dtquelib:len:receive:waittime);  
     DSPLY receive; 
     DSPLY len;     
     *INLR = *ON;

Compile RPGLE program to read data from data queue

CRTSQLRPGI OBJ(EASYCLASS1/EXTPGM6)          
           SRCFILE(EASYCLASS1/EXTPROC)      
           SRCMBR(EXTPGM6)                  
           COMMIT(*NONE)                    
           OBJTYPE(*PGM)                    
           REPLACE(*NO)                     
           DBGVIEW(*SOURCE)                 

Explanation of the above code

      D QRCVDTAQ        PR                  extpgm('QRCVDTAQ')                       
      D dtquenam                      10A   const                                    
      D dtquelib                      10A   const                                    
      D datalen                        5P 0 const                                    
      D databuf                    32767A   const options(*varsize)                  
      D waittime                       5P 0 const                                    

Here, we defined the procedure prototype for the The Receive Data Queue (QRCVDTAQ) API that call external program QRCVDTAQ and is used to read the data from the data queue and this API has several parameters such as name of the data queue dtquenam, then we need to provide the library dtquelib, length of the data queue datalen as output parm and data buffer databuf as output parm and then waittime mentioned the wait time which is in seconds as Input parm and If the wait time value is greater than 0 then the maximum range is 99999 which is approx 28 hours and If the wait time value is less than 0 then it waits forever and continue processing immediately. If no entry exists, the call completes immediately with the length of data parameter set to zero.

      D main            pr                  extpgm('EXTPGM6')                        
      D                               10a                                            
      D                               10a                                            
      D                               20a                                            
      D main            pi                                                           
      D dtquenam                      10a                                            
      D dtquelib                      10a                                            
      D receive                       20a                                            
      D len             s              5P 0 inz                                      
      D waittime        s              5p 0 inz(10)                                                     

Here, we have defined PR and PI for main procedure/program which is alternative for the entry parameter list where we take input as data queue name, data queue library and last output parameter where we receive the data that reads from the data queue. we defined two variables as len and waittime to be used by the QRCVDTAQ api. waittime is initialized with 10 seconds to wait.

      C                   EVAL      RECEIVE = ' '                                    
      C                   CALL      'QRCVDTAQ'                                       
      C                   PARM                    dtquenam                           
      C                   PARM                    dtquelib                           
      C                   PARM                    len                                
      C                   PARM                    receive                            
      C                   PARM                    waittime                           
      C     receive       DSPLY                                                      
      C     len           DSPLY                                                      
      C                   SETON                                        LR            
      C                   RETURN                                                          

First we initialized receive variable with blank. Then we call QRCVDTAQ api by passing data queue name, data queue library, len and receive and waittime. After the call is complete we dsply the receive and len variable where we received data after reading the data queue. Finally set last record indicator to setOn and return from the program.

Create Stored procedure program for reading data from data queue

     D sqlproc         S            500a   inz(*blanks)                    
      /Free                                                                
       sqlproc = 'CREATE PROCEDURE EASYCLASS1.READFROMDATAQUEUE( ' +       
                 'IN DQNAM CHAR(10), IN DQLIB CHAR(10), ' +                
                 'OUT RECEIVED CHAR(20)) ' +                               
                 'LANGUAGE RPGLE ' +                                       
                 'SPECIFIC EASYCLASS1.EXTPROCED6 ' +                       
                 'EXTERNAL NAME EASYCLASS1.EXTPGM6 ' +                     
                 'NOT DETERMINISTIC ' +                                    
                 'NO SQL ' +                                               
                 'CALLED ON NULL INPUT ' +                                 
                 'PARAMETER STYLE GENERAL';                                
                                                                           
       EXEC SQL                                                            
       EXECUTE IMMEDIATE :sqlproc;                                         
                                                                           
        *INLR = *ON;                                                       
      /End-Free                                                            
  • First declare variable sqlproc of length 500 and of character type and initialized with blanks.
  • Write the SQL script for creating stored procedure inside sqlproc variable.
  • SQL Script for create stored procedure to read from data queue is as follows:

  • Create procedure named READFROMDATAQUEUE in library EASYCLASS1.
  • Accept data queue name of 10 chars as input parm
  • Accept data queue library name of 10 chars as input parm
  • Last RECEIVED parm of 20 chars is passed as output parm where we retrieve data after reading from the data queue.
  • Stored procedure language is RPGLE as we are going to call external RPGLE program we created above.
  • SPECIFIC clause will define unique name for the procedure as EXTPROCED6 in library EASYCLASS1.
  • EXTERNAL NAME clause will define the name of the external rpgle program being called i.e. EXTPGM6 from library EASYCLASS1.
  • Procedure is NOT DETERMINISTIC and may not return cached results on passing same input.
  • NO SQL clause means SQL is not used in this program.
  • CALLED ON NULL INPUT clause means that procedure can be calle on NULL value input on any paramaters of the procedure.
  • PARAMETER STYLE GENERAL means parameters are passed to RPGLE program as it is defined in this stored procedure.
  • Compile RPGLE program to create stored procedure that read data from data queue

    CRTSQLRPGI OBJ(EASYCLASS1/EXTPROC6)          
               SRCFILE(EASYCLASS1/EXTPROC)      
               SRCMBR(EXTPROC6)                  
               COMMIT(*NONE)                    
               OBJTYPE(*PGM)                    
               REPLACE(*NO)                     
               DBGVIEW(*SOURCE)                 

    Call EXTPROC6 to create stored procedure

    Once compilation is successfull, the call the program EXTPROC6 from the command line and that will create the externa stored procedure named READFROMDATAQUEUE in library EASYCLASS1 for you.

    Write Program that calls external stored procedure that reads data from data queue

    Declared 3 variables parm1, parm2 and parm3 as required in stored procedure call and then call the stored procedure using SQL CALL as below and displayed the parm3 that receives data read from data queue.

         D parm1           s             10a   inz('DATAQUEUE1')         
         D parm2           s             10a   inz('EASYCLASS1')         
         D parm3           s             20a   inz                       
          /Free                                                          
           EXEC SQL                                                      
           CALL EASYCLASS1.READFROMDATAQUEUE(:parm1,:parm2,:parm3);      
           dsply parm3;                                                  
            *INLR = *ON;                                                 
          /End-Free                                                      

    Compile RPGLE program to Call stored procedure that read data from data queue

    CRTSQLRPGI OBJ(EASYCLASS1/CALLPROC6)          
               SRCFILE(EASYCLASS1/CALLPROC6)      
               SRCMBR(EXTPROC6)                  
               COMMIT(*NONE)                    
               OBJTYPE(*PGM)                    
               REPLACE(*NO)                     
               DBGVIEW(*SOURCE)                 

    Note: the data queue named DATAQUEUE1 in library EASYCLASS1 were already created and created using CRTDTAQ command. and data can be send to data queue by calling sotred procedure that writes data to data queue.

    Post a Comment

    © AS400 and SQL Tricks. All rights reserved. Developed by Jago Desain