Récu­pé­ra­tion de l’i…
 
Notifications 
Reti­rer tout

Récu­pé­ra­tion de l’ins­truc­tion SQL en erreur

Posts
Uti­li­sa­teurs
Reac­tions
117  Vu
0
Début du sujet

Bon­jour,

Après l’exé­cu­tion d’une ins­truc­tion SQL pré­pa­rée en dyna­mique il est facile de récu­pé­rer celle-ci si son exé­cu­tion a échoué car l’ins­truc­tion se trouve dans une variable du programme.

Par contre, lorsque cette ins­truc­tion est sta­tique et que sql­code < 0 est-il pos­sible de récu­pé­rer cette ins­truc­tion ? Via GET DIAGNOSTICS ?

Éti­quettes du sujet
4 Réponses 
0

Bon­jour Denis, 

Après étude de la page  https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_72/db2/rbafzgetdiag.htm , Je dirai que non.

A plus, 

Ibmiiste.

0

Après une petite recherche Inter­net, il y a ceci :

DSPJOBLOG OUTPUT(*OUTFILE) OUTFILE(QTEMP/ERR_LOG)
Select Qmhmf, 
       Qmhmid, 
       Qmhmdt                                  
  From Qtemp.Err_Log                                         
 Where Qmhsev >= 20                                           
   And Substr(Qmhmid, 1, 3) In ('CPA' , 'CPD' , 'CPF' , 'SQL')
Order By Rrn(Err_log) Desc                                   
Fetch First 1 Rows Only 

https://stackoverflow.com/questions/56889866/db2-sql-how-to-get-the-last-executed-sql-statement-with-get-diagnostics

0
Début du sujet

Il vaut donc mieux pas­ser par l’A­PI qui per­met de récu­pé­rer l’in­for­ma­tion sans l’é­cra­ser (QUSRJOBI) :

  rtvJobSQL(JOBI0900:
       rcvSize :
       'JOBI0900' :
       qualfiedJobName :
       *blanks :
       errAPI :
       '0' ) ;
  if JOBI0900.lenCurCrs > 0 and JOBI0900.lenCurCrs <= %size(instruction);
    instruction = %subst(JOBI0900:JOBI0900.ofsCurCrs + 1:JOBI0900.lenCurCrs);
  elseif JOBI0900.lenCurCrs > 0;
    instruction = %subst(JOBI0900:JOBI0900.ofsCurCrs + 1);
  else;
    instruction = 'Dernière instruction SQL indisponible';
  endif;


avec :
       dcl-ds JOBI0900 likeds(JOBI0900_t);
       dcl-ds errAPI likeds(errAPI_t);
       dcl-ds qualfiedJobName likeds(qualfiedJobName_t);

       dcl-pr rtvJobSQL EXTPGM('QUSRJOBI');
         receiver      char(65535) options(*varsize);   // Receiver variable
         rcvLen        int(10:0) const;  // Length of receiver
         fmtName       char(8)   const;  // Format name
         qualJobName   char(26)  const;  // qualified job name
         internalJobID char(16)  const;  // Internal Job Id
         errAPI        likeds(errAPI_t); // Error Code
         ResetPfrStat  char(1) const;    // reset performance statistics
       end-pr;

       // JOBI0900 Format pour API QUSRJOBI
       dcl-ds JOBI0900_t len(65535) qualified template;
         nbrBytesRtn   int(10:0);
         nbrBytesAvl   int(10:0);
         jobName       char(10);
         usrName       char(10);
         jobNbr        char(6);
         internalJobID char(16);
         jobSts        char(10);
         jobType       char(1);
         jobSubType    char(1);
         svrMode       char(1);
         rsvd          char(1);
         ofsOpnCrs     int(10:0);
         sizOpnCrs     int(10:0);
         nbrOpnCrs     int(10:0);
         ofsCurCrs     int(10:0);
         lenCurCrs     int(10:0);
         stsCurCrs     int(10:0);
         cCSIDCurCrs   int(10:0);
         rDBname       char(18);
         sQLObj        char(10);
         sQLLib        char(10);
         sQLObjType    char(10);
         rsvd2         char(4);
         cumNbrFullOpn int(20:0);
         cumNbrPsedOpn int(20:0);
         ofsCurSQL     int(10:0);
         lenCurSQL     int(10:0);
       end-ds;

       // Nom qualifié de travail / qualified job name pour utilisation dans les API
       dcl-ds qualfiedJobName_t len(26) qualified template;
         jobName   char(10);
         userName  char(10);
         jobNumber char(6);
       end-ds;                       

                                                                                                                        

La variable « ins­truc­tion » contient bien l’ins­truc­tion sou­hai­tée car l’ap­pel à l’A­PI ne conte­nant pas de SQL ne l’a pas écrasée.

A noter que l’ont peut récu­pé­rer plein d’autres infor­ma­tions sur le tra­vail deman­dé par les 2 méthodes.

Sources :  https://blog.xuite.net/vengoal/as400?p=6

https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/apis/qusrjobi.htm

0
Début du sujet

Bon­soir,

après recherche, il y a 2 solu­tions mais pas avec GET DIAGNOSTICS.

La pre­mière consiste à uti­li­ser la fonc­tion table QSYS2.GET_JOB_INFO :

SELECT V_SQL_STATEMENT_TEXT
    FROM TABLE (
            QSYS2.GET_JOB_INFO('338961/QUSER/QZDASOINIT')
       );

Le pro­blème c’est que si l’on exé­cute cette requête pour un autre tra­vail que le tra­vail en cours, on risque fort que d’autres ins­truc­tions SQL aient été exé­cu­tées entre temps, or on veut obte­nir l’ins­truc­tion qui était en erreur alors que seule la der­nière est conservée. 

Si on l’exé­cute pour son propre tra­vail (par un appel à une pro­cé­dure juste après l’er­reur), on obtient cette ins­truc­tion qui est en fait la der­nière car elle a écra­sé la pré­cé­dente, dans la colonne V_SQL_STATEMENT_TEXT :

SELECT V_SQL_STATEMENT_TEXT
    FROM TABLE (
            QSYS2.GET_JOB_INFO('*')
       );

donne no :

"SELECT V_SQL_STATEMENT_TEXT
    FROM TABLE (
            QSYS2.GET_JOB_INFO(?)
       )"

Il vaut donc mieux pas­ser par l’A­PI qui per­met de récu­pé­rer l’in­for­ma­tion sans l’é­cra­ser (QUSRJOBI) :

  rtvJobSQL(JOBI0900:
       rcvSize :
       'JOBI0900' :
       qualfiedJobName :
       *blanks :
       errAPI :
       '0' ) ;
  if JOBI0900.lenCurCrs > 0 and JOBI0900.lenCurCrs <= %size(instruction);
    instruction = %subst(JOBI0900:JOBI0900.ofsCurCrs + 1:JOBI0900.lenCurCrs);
  elseif JOBI0900.lenCurCrs > 0;
    instruction = %subst(JOBI0900:JOBI0900.ofsCurCrs + 1);
  else;
    instruction = 'Dernière instruction SQL indisponible';
  endif;


avec :
       dcl-ds JOBI0900 likeds(JOBI0900_t);
       dcl-ds errAPI likeds(errAPI_t);
       dcl-ds qualfiedJobName likeds(qualfiedJobName_t);

       dcl-pr rtvJobSQL EXTPGM('QUSRJOBI');
         receiver      char(65535) options(*varsize);   // Receiver variable
         rcvLen        int(10:0) const;  // Length of receiver
         fmtName       char(8)   const;  // Format name
         qualJobName   char(26)  const;  // qualified job name
         internalJobID char(16)  const;  // Internal Job Id
         errAPI        likeds(errAPI_t); // Error Code
         ResetPfrStat  char(1) const;    // reset performance statistics
       end-pr;

       // JOBI0900 Format pour API QUSRJOBI
       dcl-ds JOBI0900_t len(65535) qualified template;
         nbrBytesRtn   int(10:0);
         nbrBytesAvl   int(10:0);
         jobName       char(10);
         usrName       char(10);
         jobNbr        char(6);
         internalJobID char(16);
         jobSts        char(10);
         jobType       char(1);
         jobSubType    char(1);
         svrMode       char(1);
         rsvd          char(1);
         ofsOpnCrs     int(10:0);
         sizOpnCrs     int(10:0);
         nbrOpnCrs     int(10:0);
         ofsCurCrs     int(10:0);
         lenCurCrs     int(10:0);
         stsCurCrs     int(10:0);
         cCSIDCurCrs   int(10:0);
         rDBname       char(18);
         sQLObj        char(10);
         sQLLib        char(10);
         sQLObjType    char(10);
         rsvd2         char(4);
         cumNbrFullOpn int(20:0);
         cumNbrPsedOpn int(20:0);
         ofsCurSQL     int(10:0);
         lenCurSQL     int(10:0);
       end-ds;

       // Nom qualifié de travail / qualified job name pour utilisation dans les API
       dcl-ds qualfiedJobName_t len(26) qualified template;
         jobName   char(10);
         userName  char(10);
         jobNumber char(6);
       end-ds;                       

                                                                                                                        

La variable « ins­truc­tion » contient bien l’ins­truc­tion sou­hai­tée car l’ap­pel à l’A­PI ne conte­nant pas de SQL ne l’a pas écrasée.

A noter que l’ont peut récu­pé­rer plein d’autres infor­ma­tions sur le tra­vail deman­dé par les 2 méthodes.

Sources :  https://blog.xuite.net/vengoal/as400?p=6

https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/apis/qusrjobi.htm

Share :