I have previously mentioned using Qp0zLprintf (Print Formatted Job Log Data) to write messages to the joblog. Here’s an alternative approach using QMHSNDPM (Send Program Message). In this case, I am executing an SQL statement and checking the SQL state afterwards. If the state is not 00000 (completed normally), I use the LogError procedure to write the SQL code to the job log.
Obviously, it would be better to put the LogError procedure into a service program both for reusability and so that the QMHSNDPM prototype definition can be tucked out of the way.
This is the program:
// Simple program to demonstrate sending SQL error states to the joblog
// Written by Paul Pritchard
ctl-opt main(Main) dftactgrp(*no) actgrp(*new);
// --------------------------------------------------------------------
// External Procedures
// --------------------------------------------------------------------
dcl-pr WriteJoblog extpgm('QMHSNDPM');
MessageID char(7) const;
MessageFile char(20) const;
Message char(32767) const options(*varsize);
MessageLength int(10) const;
MessageType char(10) const;
MessageStack char(10) const;
MessageStackC int(10) const;
MessageKey char(4);
MessageError char(32767) options(*varsize);
end-pr;
// --------------------------------------------------------------------
// Program main procedure
// --------------------------------------------------------------------
dcl-proc Main;
dcl-pi *n end-pi;
exec sql
update employees
set empvalid = 0
where int(empnumber) < 0;
if SQLSTATE <> '00000';
LogError(SQLSTATE);
endif;
return;
end-proc;
// --------------------------------------------------------------------
// Simple SQL Error Logging
// --------------------------------------------------------------------
dcl-proc LogError;
dcl-pi LogError;
ErrorCode char(5) const;
end-pi;
// The API message fields
dcl-s MessageID char(7) inz('CPF9897');
dcl-s MessageFile char(20) inz('QCPFMSG *LIBL');
dcl-s Message varchar(32767) inz;
dcl-s MessageLength int(10) inz;
dcl-s MessageType char(10) inz('*DIAG');
dcl-s MessageStack varchar(32767) inz('*');
dcl-s MessageStackC int(10) inz;
dcl-s MessageKey char(4) inz;
dcl-ds MessageError qualified;
Input int(10) inz;
Output int(10) inz;
end-ds;
Message = 'SQL Error encountered: ' + ErrorCode;
MessageLength = %len(%trim(Message));
WriteJoblog(MessageID: MessageFile: Message:
MessageLength: MessageType:
MessageStack: MessageStackC: MessageKey: MessageError);
return;
end-proc;
// --------------------------------------------------------------------
And this is what it looks like in the joblog:
CPF9897 Diagnostic 40 17-11-12 18:31:37.319725 LSE001R
From module . . . . . . . . : SQLJOBLOG
From procedure . . . . . . : LOGERROR
Statement . . . . . . . . . : 137
To module . . . . . . . . . : SQLJOBLOG
To procedure . . . . . . . : LOGERROR
Statement . . . . . . . . . : 137
Message . . . . : SQL Error encountered: 22023
Cause . . . . . : No additional online help information is available.
