ジョブの最終実行 SQL ステートメントの取得

iSeries ナビゲーターの「実行管理機能」に「最後の SQL ステートメント」というメニューがあります。

メニューを選択すると、以下のように最後に実行された SQL 文と、その他保持している SQL カーソルの情報が表示されるようになっています。

これと同じ情報をコマンドで取れないのかな、と思って、ちょっと API を使ったプログラムを作ってみました。
内容が取ってこれることを確認したかっただけなので、エラーの処理などは空欄のままですし、全然完成品ではありませんが ......

API はこちらで使用したものと同じものです。

     H DFTACTGRP(*no)                                                                               
      *                                                                                             
     D RtvSQLInf       PR                                                                           
     D  JobName                      10a   CONST                                                     
     D  UserName                     10a   CONST                                                     
     D  JobNumber                     6a   CONST                                                     
      *                                                                                             
     D RtvSQLInf       PI                                                                           
     D  ParmJobName                  10a   CONST                                                     
     D  ParmUserName                 10a   CONST                                                     
     D  ParmJobNumber                 6a   CONST                                                     
      *                                                                                             
     D RtvJobSQL       PR                  EXTPGM('QUSRJOBI')                                       
     D  RcvVar                    65535a   Options( *VarSize)                                       
     D  RcvVarLen                    10i 0 Const                                                     
     D  FmtName                       8a   Const                                                     
     D  QualJobName                  26a   Const                                                     
     D  InternalJobID                16a   Const                                                     
     D  ErrorCode                          like(APIErr)                                             
     D  ResetPfrStat                  1a   Const                                                     
      *                                                                                             
     D JOBI0900        DS         65535    Qualified                                                 
     D  NbrBytesRtn                  10i 0                                                           
     D  NbrBytesAvl                  10i 0                                                           
     D  JobName                      10a                                                             
     D  UsrName                      10a                                                             
     D  JobNbr                        6a                                                             
     D  InternalJobID                16a                                                             
     D  JobSts                       10a                                                             
     D  JobType                       1a                                                             
     D  JobSubType                    1a                                                             
     D  SvrMode                       1a                                                             
     D  rsvd                          1a                                                             
     D  OfsOpnCrs                    10i 0                                                           
     D  SizOpnCrs                    10i 0                                                           
     D  NbrOpnCrs                    10i 0                                                           
     D  OfsCurCrs                    10i 0                                                           
     D  LenCurCrs                    10i 0                                                           
     D  StsCurCrs                    10i 0                                                           
     D  CCSIDCurCrs                  10i 0                                                           
     D  RDBname                      18a                                                             
     D  SQLObj                       10a                                                             
     D  SQLLib                       10a                                                             
     D  SQLObjType                   10a                                                             
     D  rsvd2                         4a                                                             
     D  CumNbrFullOpn                20i 0                                                           
     D  CumNbrPsedOpn                20i 0                                                           
     D  OfsCurSQL                    10i 0                                                           
     D  LenCurSQL                    10i 0                                                           
      *                                                                                             
     D CursorInfo      DS                  Qualified                                                 
     D   ObjName                     10a                                                             
     D   ObjLib                      10a                                                             
     D   ObjType                     10a                                                             
     D   SQLCurName                  18a                                                             
     D   SQLStmtname                 18a                                                             
      *                                                                                             
     D APIErr          DS                  Qualified                                                 
     D  ErrSize                      10i 0 inz(%size(APIErr))                                       
     D  ErrLen                       10i 0 inz(0)                                                   
     D  ErrID                         7a                                                             
     D  rsvd                          1a                                                             
     D  ErrData                   32767a                                                             
      *                                                                                             
     D QualJobName     DS            26    Qualified                                                 
     D  JobName                      10a                                                             
     D  UserName                     10a                                                             
     D  JobNumber                     6a                                                             
      *                                                                                             
     D RcvSize         S             10  0 INZ(262140)                                               
      *                                                                                             
     D i               S              5  0                                                           
     D StartPos        S              5  0                                                           
      *                                                                                             
     D SQLStmt         S          65535a   Varying                                                   
      *                                                                                             
     D HandleErr       PR                                                                           
      *                                                                                             
      /Free                                                                                         
              QualJobName.JobName = ParmJobName ;                                                   
              QualJobName.UserName = ParmUserName ;                                                 
              QualJobName.JobNumber = ParmJobNumber ;                                               
                                                                                                    
         RtvJobSQL( JOBI0900 :                                                                 
               //         %Size(JOBI0900) :                                                               
                           RcvSize :                                                                       
                            'JOBI0900' :                                                                     
                           QualJobName :                                                                   
                           *blanks :                                                                       
                           APIErr :                                                                         
                           '0' ) ;                                                                         
                                                                                                    
          If APIErr.ErrLEN <> 0 ;                                                                   
                                                                                                    
           HandleErr() ;                                                                             
                                                                                                    
          else ;                                                                                     
                                                                                                    
           If JOBI0900.NBROPNCRS <> 0 ;                                                               
                                                                                                    
            StartPos = %dec(JOBI0900.OFSOPNCRS) ;                                                     
                                                                                                    
             for i = 1 to %dec(JOBI0900.NBROPNCRS) ;                                                   
                CursorInfo = %subst(JOBI0900 : StartPos) ;                                             
                StartPos = StartPos + %size(CursorInfo) ;                                             
             endfor ;                                                                                 
                                                                                                    
           else ;                                                                                     
                                                                                                    
             SQLCurName = '*NONE' ;                                                         
                                                                                                    
           endIf ;                                                                                   
                                                                                                    
          SQLStmt = %subst(JOBI0900:%dec(JOBI0900.OFSCURCRS)+1:                                     
                                    %dec(JOBI0900.LENCURCRS)) ;                                     
                                                                                                    
          endIf ;                                                                                   
                                                                                                    
          *inLR = *on ;                                                                         
           return ;                                                                               
                                                                                                    
      /End-Free                                                                                     
      *                                                                                             
      *                                                                                             
     P HandleErr       B                                                                             
     D HandleErr       PI                                                                           
      *                                                                                             
      /Free                                                                                         
                                                                                                    
      /End-Free                                                                                     
      *                                                                                             
     P HandleErr       E

JOBI0900 Format

The JOBI0900 format is only valid for active jobs. If the job status has changed to *OUTQ or *JOBQ, the status field is set appropriately, and no information other than the number of bytes returned, the number of bytes available, the qualified job name, and the internal job identifier is returned. If the number of SQL open cursors is 0 and no SQL statements have ever been issued in the job, this format returns zeros or blanks for the attributes.
Note: Synchronization is not performed when you change or retrieve SQL data. If you try to retrieve SQL data for your own job and your job is not running multithreaded, then the retrieved data should be correct. If, however, you are retrieving SQL data for your own job and your job is running multithreaded or if you are retrieving data for a different job, the SQL data may not be correct because the SQL data is being changed at the same time that you are retrieving it.
The JOBI0900 format returns the following job information. For details about the fields listed, see Field Descriptions.
Offset Type Field
Dec Hex
0 0 BINARY(4) Number of bytes returned
4 4 BINARY(4) Number of bytes available
8 8 CHAR(10) Job name
18 12 CHAR(10) User name
28 1C CHAR(6) Job number
34 22 CHAR(16) Internal job identifier
50 32 CHAR(10) Job status
60 3C CHAR(1) Job type
61 3D CHAR(1) Job subtype
62 3E CHAR(1) Server mode for Structured Query Language
63 3F CHAR(1) Reserved
64 40 BINARY(4) Offset to SQL open cursor data
68 44 BINARY(4) Size of SQL open cursor data
72 48 BINARY(4) Number of SQL open cursors
76 4C BINARY(4) Offset to current SQL statement
80 50 BINARY(4) Length of current SQL statement
84 54 BINARY(4) Status of current SQL statement
88 58 BINARY(4) CCSID of current SQL statement
92 5C CHAR(18) Relational Database name
110 6E CHAR(10) SQL statement object name
120 78 CHAR(10) SQL statement library name
130 82 CHAR(10) SQL statement object type
Start of change140 8C CHAR(4) Reserved
144 90 BINARY(8) Cumulative Number of SQL cursors - Full Opens
152 98 BINARY(8) Cumulative Number of SQL cursors - Pseudo Opens
160 A0 BINARY(4) Offset to current SQL statement name
164 A4 BINARY(4) Length of current SQL statement nameEnd of change
* * Array(*) of CHAR(80) SQL open cursor data
These fields repeat for each SQL open cursor CHAR(10) Object name for SQL cursor
CHAR(10) Object library for SQL cursor
CHAR(10) Object type for SQL cursor
CHAR(18) SQL cursor name
CHAR(18) SQL statement name
See note CHAR(*) Current SQL statement
Note: The decimal and hexadecimal offsets depend on the number of SQL open cursors returned in the array. The maximum length of an SQL statement is Start of change 2097152 End of change bytes.

完成品ではないので、確認はデバッガで行っています。

大きく二つの情報を取るようにしています。
まず、CursorInfo というフィールド(データ・ストラクチャー)に、当該ジョブが所持しているカーソル情報が入ってくるようになっています。

カーソル名と SQL ステートメント名を確認してみました。

SQLStmt というフィールドで「最後の SQL ステートメント」を取得しています。

System API プログラミングの基礎 (2) - 戻り値をユーザースペースに置き換える -」と「System API プログラミングの基礎 (4) - 戻り値をユーザースペースに置き換える [異版] -」に、System API のより効率的な書き方に沿ってこれを書き直した例がありますので、そちらもよければご参照ください。

また、実際に部品として使ってみたところ、いくつか修正した方がいいところが見つかったので「ソケットごとの実行 SQL の収集 (V5R4)」で直しています。そちらもご参照ください。

[Top Pageに戻る]

Ads by TOK2