SQL/MX Programming Manual for C and COBOL (G06.24+, H06.03+)
Exception Handling and Error Conditions
HP NonStop SQL/MX Programming Manual for C and COBOL—523627-004
13-11
Saving and Restoring SQLSTATE or SQLCODE
EXEC SQL OPEN get_by_partnum;
...
EXEC SQL FETCH get_by_partnum
INTO :hv_partnum,:hv_partdesc,:hv_price,:hv_qty_available;
...
while (SQLCODE == 0) {
if ( hv_qty_available < 1000 )
EXEC SQL UPDATE parts
SET qty_available = qty_available + 100
WHERE CURRENT OF get_by_partnum;
...
EXEC SQL FETCH get_by_partnum
INTO :hv_partnum,:hv_partdesc,:hv_price,:hv_qty_available;
}
...
void sql_error() {
long saved_sqlcode = SQLCODE;
EXEC SQL GET DIAGNOSTICS
:hv_num = NUMBER;
for (i = 1; i <= hv_num; i++) {
EXEC SQL GET DIAGNOSTICS EXCEPTION :i
:hv_sqlstate = RETURNED_SQLSTATE,
:hv_msgtxt = MESSAGE_TEXT;
...
}
SQLCODE = saved_sqlcode;
} /* end sql_error */
After the first FETCH statement returns an error, control moves to sql_error.
Because the function sql_error contains SQL statements, the SQLCODE value in
the function overwrites the global SQLCODE value. Before returning from the function,
the global value is restored so that, when control is returned to the statement following
FETCH and SQLCODE is checked, the value is equal to the original value returned
from FETCH.
Example
This example uses WHENEVER SQLERROR PERFORM to save and restore
SQLSTATE:
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 sqlstate pic x(5).
01 saved-sqlstate pic x(5).
01 hv-num pic s9(9) comp.
...
EXEC SQL END DECLARE SECTION END-EXEC.
...
EXEC SQL WHENEVER SQLERROR PERFORM sqlerrors END-EXEC.
...
sqlerrors.
MOVE sqlstate TO saved-sqlstate.
EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.
EXEC SQL GET DIAGNOSTICS
:hv-num = NUMBER
END-EXEC.
COBOL