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.