Вы находитесь на странице: 1из 17

Examining Abends and SQL Statements

Pam Odden

Staff Development Session 2003.06

1 05/14/2003

Objectives Look at a recent abend  Programming standards at CCSD to help in abend resolution  Look at some of the SQL running at CCSD


Staff Development Session 2003.06

2 05/14/2003

Abend in H8010P37
Near top 13.53.03 13.53.03 13.53.04 13.53.04 13.53.04 13.53.04 13.53.04 13.53.04 13.53.04 14.11.31 14.11.35 14.11.35 14.11.38 14.11.39 14.11.39 14.11.39 14.11.40 14.11.40 14.11.40 of job output: JOB02294 ---- TUESDAY, 22 APR 2003 ---JOB02294 IRR010I USERID JOBTRAC IS ASSIGNED TO THIS JOB. JOB02294 TRAC020I - H8010J30(J02294) DSN-TRIG PROD JCL SUBMITTED FROM JOB02294 ICH70001I JOBTRAC LAST ACCESS AT 13:48:13 ON TUESDAY, APRIL JOB02294 $HASP373 H8010J30 STARTED - INIT 2 - CLASS I - SYS CCSD JOB02294 IEF403I H8010J30 - STARTED JOB02294 U11-001 CA-11 - PARM RECEIVED FOR JOB H8010J30 - PARM=P JOB02294 *U11-055 RESTART REQUESTED - START PROC/STEP= /STEP030 JOB02294 *21 U11-007 CA-11 - ENTER REASON FOR RERUN FOR JOB H8010J30 JOB02294 R 21,Y JOB02294 U11-026 CA-11 - REASON FOR RERUN FOR JOB H8010J30 IS - Y JOB02294 *23 U11-004 CA-11 - ENTER Y TO ALLOW RESTART OF JOB H8010J30 JOB02294 R 23,Y JOB02294 U11-109 * PROC-STEP= STEP=STEP010 POSTED WITH CC=000 JOB02294 U11-109 * PROC-STEP= STEP=STEP020 POSTED WITH CC=000 JOB02294 U11-010 CA-11 - 'R' PROCESSING COMPLETE FOR JOB H8010J30 JOB02294 CSV003I REQUESTED MODULE ABEND NOT FOUND JOB02294 CSV028I ABEND806-04 JOBNAME=H8010J30 STEPNAME=STEP030 JOB02294 IEA995I SYMPTOM DUMP OUTPUT SYSTEM COMPLETION CODE=806 REASON CODE=00000004

In middle of job output: RUN PROG (H8010P37) PLAN (MHRMSBAT) IKJ56641I DSN ENDED DUE TO ERROR+ IKJ56641I SYSTEM ABEND CODE 806 REASON CODE 00000004 INSERT ERROR: MHRMSDB1.SUB_APPLICANTS DB2 ERROR: -181 DB2 SQLERRMC: --- VS COBOL II Formatted Dump at ABEND --Program = 'H8010P37'

Staff Development Session 2003.06

3 05/14/2003

Abend in H8010P37
In Program: INSERT.. IF SQLCODE = -803 GO TO 6000-EXIT. * UNAVAILABLE RESOURCE TRY ONCE MORE IF SQLCODE = -904 OR -911 IF RESP9-CTR < 2 ADD 1 TO RESP9-CTR GO TO 6000-INSERT-SUB-DATA. MOVE 0 TO RESP9-CTR. IF (SQLCODE NOT = 0) MOVE SQLCODE TO WS-SQL-EDIT DISPLAY 'INSERT ERROR: MHRMSDB1.SUB_APPLICANTS' DISPLAY 'DB2 ERROR: ' WS-SQL-EDIT DISPLAY 'DB2 SQLERRMC:' SQLERRMC CALL 'ABEND'. 6000-EXIT. EXIT.

Staff Development Session 2003.06

4 05/14/2003

Tool Available for Program Abend


In working storage in program:
****************************************************************** * SOURCE IN 'PDFLIB.###.COBOL(SQLERRW)'. USED IN CONJUNCTION * * WITH PROCEDURAL CODE IN 'PDFLIB.###.COBOL(SQLERRP)'. * ****************************************************************** 01 ERROR-MESSAGE. 05 ERROR-MESSAGE-LENGTH PIC S9(04) COMP VALUE +800. 05 ERROR-MESSAGE-LINE PIC X(80) OCCURS 10 TIMES INDEXED BY EML-INDEX. 01 ERROR-LINE-LENGTH PIC S9(09) COMP VALUE +80. ******************************************************************

Paragraph in program that executes SQL:


EXEC SQL INSERT.. END-EXEC. EVALUATE SQLCODE WHEN +0 ADD +1 TO WS-COUNT WHEN +100 SET ROWS-DONE TO TRUE WHEN OTHER DISPLAY '*4000(1) INSERT ERROR PERFORM 9999-SQL-ERROR END-EVALUATE.

'

Staff Development Session 2003.06

5 05/14/2003

Standard DB2 Error Paragraph


Abend paragraph in program:
***************************************************************** * ********************** FOR BATCH USE ONLY ********************** * ********************** FOR BATCH USE ONLY ********************** * SOURCE IN 'PDFLIB.###.COBOL(SQLERRP)'. USED IN CONJUNCTION * * WITH WORKING STORAGE CODE IN 'PDFLIB.###.COBOL(SQLERRW)'. * ****************************************************************** 9999-SQL-ERROR. ****************************************************************** * DISPLAY FORMATTED SQL ERROR INFORMATION USING ERROR-REPORTING * * SUBROUTINE. IF ERROR IS A WARNING (SQLCODE > 0), PROCESSING * * CONTINUES, OTHERWISE A 'S806-04' IS INVOKED BY CALLING 'ABEND'* ******************************************************************

CALL 'DSNTIAR' USING SQLCA, ERROR-MESSAGE, ERROR-LINE-LENGTH. IF RETURN-CODE = 0 PERFORM VARYING EML-INDEX FROM 1 BY 1 UNTIL EML-INDEX > 10 DISPLAY ERROR-MESSAGE-LINE(EML-INDEX) END-PERFORM ELSE DISPLAY 'DSNTIAR ERROR - RETURN-CODE = ' RETURN-CODE. DISPLAY 'SQLERRD3: DISPLAY 'SQLERRD5: DISPLAY 'SQLWARN0: DISPLAY 'SQLWARN1: DISPLAY 'SQLWARN2: DISPLAY 'SQLWARN3: DISPLAY 'SQLWARN4: DISPLAY 'SQLWARN5: DISPLAY 'SQLWARN6: DISPLAY 'SQLWARN7: DISPLAY 'SQLWARN8: DISPLAY 'SQLWARN9: DISPLAY 'SQLWARNA: DISPLAY 'SQLSTATE: IF SQLCODE < +0 CALL 'ABEND'. ' ' ' ' ' ' ' ' ' ' ' ' ' ' SQLERRD(3). SQLERRD(5). SQLWARN0. SQLWARN1. SQLWARN2. SQLWARN3. SQLWARN4. SQLWARN5. SQLWARN6. SQLWARN7. SQLWARN8. SQLWARN9. SQLWARNA. SQLSTATE.

Staff Development Session 2003.06

6 05/14/2003

Output from Standard DB2 Error Paragraph


*4000(1) INSERT ERROR DSNT408I SQLCODE = -181, ERROR: THE STRING REPRESENTATION OF A DATETIME VALUE IS NOT A VALID DATETIME VALUE DSNT418I SQLSTATE = 22007 SQLSTATE RETURN CODE DSNT415I SQLERRP = DSNXRIVB SQL PROCEDURE DETECTING ERROR DSNT416I SQLERRD = -140 0 0 -1 0 0 SQL DIAGNOSTIC INFORMATION DSNT416I SQLERRD = X'FFFFFF74' X'00000000' X'00000000' X'FFFFFFFF' X'00000000' X'00000000' SQL DIAGNOSTIC INFORMATION

SQLERRD3: 000000000 SQLERRD5: 000000000 SQLWARN0: SQLWARN1: SQLWARN2: SQLWARN3: SQLWARN4: SQLWARN5: SQLWARN6: SQLWARN7: SQLWARN8: SQLWARN9: SQLWARNA: SQLSTATE: 22007

Staff Development Session 2003.06

7 05/14/2003

SQLCA
***** INCLUDE SQLCA *****END-EXEC. 01 SQLCA. 05 SQLCAID PIC X(8). 05 SQLCABC PIC S9(9) COMP-4. 05 SQLCODE PIC S9(9) COMP-4. 05 SQLERRM. 49 SQLERRML PIC S9(4) COMP-4. 49 SQLERRMC PIC X(70). 05 SQLERRP PIC X(8). 05 SQLERRD OCCURS 6 TIMES PIC S9(9) COMP-4. 05 SQLWARN. 10 SQLWARN0 PIC X. 10 SQLWARN1 PIC X. 10 SQLWARN2 PIC X. 10 SQLWARN3 PIC X. 10 SQLWARN4 PIC X. 10 SQLWARN5 PIC X. 10 SQLWARN6 PIC X. 10 SQLWARN7 PIC X. 05 SQLEXT. 10 SQLWARN8 PIC X. 10 SQLWARN9 PIC X. 10 SQLWARNA PIC X. 10 SQLSTATE PIC X(5).

Description of fields on next slide


8 05/14/2003

Staff Development Session 2003.06

SQLCA


SQLCA is the SQL Communication Area. When DB2 processes an SQL statement in a program, it places return codes and other information in the communication area.
SQLCAID contains the text SQLCA to search for in dumps SQLCABC length of the SQLCA, 136 bytes. SQLCODE SQL return code. 0 = successful execution, positive = successful with an exception, negative = error condition SQLERRML length of SQLERRMC, 0 70. Length of 0 means SQLERRMC is not pertinent. SQLERRMC contains one or more tokens, separated by XFF, that are substituted for variables in the descriptions of error conditions. SQLERRP product signature and name of module that detected an error

Staff Development Session 2003.06

9 05/14/2003

SQLCA, cont.
SQLERRD(1), (2) contain internal error codes SQLERRD(3) number of rows affected by an Insert, Update or Delete (but not rows deleted as a result of CASCADE DELETE). Can also contain the reason code of a timeout or deadlock for SQLCODES 911 and 913. SQLERRD(4) Can contain timerons, helpful for estimating the relative cost of dynamically prepared SQL statements. SQLERRD(5) Contains the position or column of a syntax error for a PREPARE or EXECUTE IMMEDIATE statement. SQLERRD(6) Internal error code. SQLWARN0 Contains a W if at least one other indicator also contains a W, otherwise blank. SQLWARN1 W if the value of a string column was truncated when assigned to a host variable.
Staff Development Session 2003.06 10 05/14/2003

SQLCA, cont.
SQLWARN2 W if null values were eliminated from the argument of a column function. SQLWARN3 W if the number of result columns is larger than the number of host variables. SQLWARN4 W if a PREPARED update or delete statement does not contain a WHERE clause. SQLWARN5 W if an SQL statement was not executed because it is not a valid SQL statement in DB2 for OS/390. SQLWARN6 W if the addition of a month or year duration to a DATE or TIMESTAMP results in an invalid day (ie. June 31) and was changed to the last day of the month to make it valid.

Staff Development Session 2003.06

11 05/14/2003

SQLCA, cont.
SQLWARN7 W if one or more non-zero digits were eliminated from the fractional part of a number used as the operand of a decimal multiply or divide operation. SQLWARN8 W if a character that could not be converted was replaced with a substitute character. SQLWARN9 W if arithmetic exceptions were ignored during COUNT DISTINCT processing. SQLWARNA W if at least one character field of the SQLCA is invalid due to a character conversion error. SQLSTATE Contains a return code for the outcome of the most recent execution of a SQL statement.
Staff Development Session 2003.06 12 05/14/2003

Cursor in M7020148
EXEC SQL DECLARE RCVCSR CURSOR FOR SELECT RC1.RECEIVING_ID , RC1.CREATE_DATE , ACTUAL DAYS UNTIL DELIVERY DAYS(DATE(SUBSTR(RC1.CREATE_DATE,5,2)||'/'|| SUBSTR(RC1.CREATE_DATE,7,2)||'/'|| SUBSTR(RC1.CREATE_DATE,1,4) ) ) - DAYS(DATE(SUBSTR(:HOST-PO1-POST-DATE,5,2)||'/'|| SUBSTR(:HOST-PO1-POST-DATE,7,2)||'/'|| SUBSTR(:HOST-PO1-POST-DATE,1,4) ) ) , RC3.REQUISITION_ID , RC3.LINE_NO , RC3.QTY_ORDER , RC3.QTY_RECEIVED FROM RSTR.AD45_RC1 RC1 , RSTR.AD45_RC3 RC3 TREAT UNPOSTED RECEIVERS AS RECEIVED WHERE RC1.DOC_STATUS = 'CNCL' AND RC1.RECEIVING_ID = RC3.RECEIVING_ID AND RC1.PURCHASE_ORDER_ID = :HOST-PO1-PO-ID AND RC3.REQUISITION_ID = :HOST-RQ3-REQUISITION-ID AND RC3.LINE_NO = :HOST-RQ3-LINE-NO AND RC3.QTY_RECEIVED > 0 FOR FETCH ONLY END-EXEC.

Staff Development Session 2003.06

13 05/14/2003

Cursor in M6015435
EXEC SQL DECLARE OBJ_CUR CURSOR FOR SELECT BUD_AY ,BUD_FUND ,BUD_UNIT ,BUD_GRANT ,BUD_PROJ ,BUD_SUBOBJECT ,BUD_INDEX ,BUD_PROG ,BUD_FUNC ,BUD_FTE ,BUD_APPROP ,COALESCE(BR_INDEX,'NNNNN') ,COALESCE(BR_ADD_TRANSFER,' ') ,COALESCE(BR_FTE,0) ,COALESCE(BR_APPROP,0) ,COALESCE(BR_BATCH_FTE,0) ,COALESCE(BR_BATCH_APPROP,0) FROM M6040DB1.BUD_RQST_WRKSHT LEFT OUTER JOIN M6040DB1.BUDGET_REQUEST ON BUD_AY = BR_AY AND BUD_INDEX = BR_INDEX WHERE BUD_FUND = :BR01-FUND-I AND BUD_UNIT = :BR01-UNIT-I AND BUD_PROJ = :BR01-PROJ-I AND BUD_SUBOBJECT = :WS-OBJ-1 AND BUD_GRANT BETWEEN :WS-GRNT-1 AND :WS-GRNT-2 AND BUD_PROG BETWEEN :WS-PROG-1 AND :WS-PROG-2 AND BUD_FUNC BETWEEN :WS-FUNC-1 AND :WS-FUNC-2 ORDER BY 1, 2, 3, 4, 5, 6, 7, 8 FOR READ ONLY END-EXEC.

Staff Development Session 2003.06

14 05/14/2003

Summary Use the CCSD standard error-handling procedure 9999-SQL-ERROR.  Code is found in PDFLIB.INTERIM.COBOL (SQLERRW) and (SQLERRP). Both should be included in your program.


Staff Development Session 2003.06

15 05/14/2003

Comments on M7020148
 

Nice comments! Dates are 8 bytes with no /. Coder could have put the / into the host variable, but the way it is, it is easy to see the two dates are structured the same way.
Create a date in DB2 format cast it to a DB2 date using the DATE() function use DAYS() function to give an integer representation of a date. (Days from Jan. 1,0001 + 1). Subtract same functions used on another date to give days between the two dates.
SELECT DAYS(DATE('04/30/2003')) FROM SYSIBM.SYSDUMMY1; -------+---------+---------+---731335 SELECT DAYS(DATE('05/10/2003')) FROM SYSIBM.SYSDUMMY1; ------+---------+---------+---731345

 

Order of predicates doesnt change DB2 cost FOR FETCH ONLY


16 05/14/2003

Staff Development Session 2003.06

Comments on M7020148


LEFT OUTER JOIN means rows from table BUD_RQST_WRKSHT matching the predicates will be selected even if they have no matching row in BUDGET_REQUEST. Columns from the table having no match will be null. COALESCE protects against selecting null values so a null indicator is not required. Using a null indicator would be fine, too. ORDER BY can use the position of a column or expression in the SELECT clause instead of naming the column or expression. Between is slightly more efficient than >= and <=.
17 05/14/2003

Staff Development Session 2003.06

Вам также может понравиться