* Standard COBOL (file "MPB005.SCO") calling SQL * procedures in file "MPB005.MCO". * STANDARD COBOL (file "MPB005.SCO")
**************************************************************** * * COMMENT SECTION * * DATE Halloween 1991 STANDARD COBOL LANGUAGE * NIST SQL VALIDATION TEST SUITE V6.0 * DISCLAIMER: * This program was written by employees of NIST to test SQL * implementations for conformance to the SQL standards. * NIST assumes no responsibility for any party's use of * this program. * * MPB005.SCO * WRITTEN BY: J Sullivan * * THIS PROGRAM IS PART A OF A TWO-PART PROGRAM(A & B) THAT * TESTS THE CONCURRENCY OF SQL - Phantom Read * * REFERENCES * AMERICAN NATIONAL STANDARD database language - SQL * X3.135-1989 * * SECTION 4.16 Transactions * Paragraph Two ****************************************************************
MOVE"SULLIVAN1"TO uid CALL"AUTHID"USING uid MOVE"not logged in, not"TO uidx * EXEC SQL SELECT USER INTO :uidx FROM HU.ECCO; CALL"SUB1"USINGSQLCODE uidx MOVESQLCODETO SQL-COD if (uid NOT = uidx) then DISPLAY"ERROR: User ", uid " expected. User ", uidx "
- " connected" END-IF MOVE 0 TO errcnt DISPLAY"SQL Test Suite, V6.0, Standard COBOL, mpb005.
- "sco" DISPLAY "59-byte ID" DISPLAY"TEd Version #" *date_time print ACCEPT TO-DAY FROMDATE ACCEPT THE-TIME FROMTIME DISPLAY"Date run YYMMDD: " TO-DAY " at hhmmssff: " THE-TIME
*transactions are inserted in multiples of the value of tranct MOVE 5 TO tranct *MPB005 will insert 12 rows into MP5_TT for this test suite type MOVE 24 TO mpbins
*concurrency tuning variables follow: *wait pauze units between transactions in a set *wait pauze2 units between sets of transations MOVE 1 TO pauze MOVE 20 TO pauze2
DISPLAY" *** This program is part B of a two-part
- " " DISPLAY" *** program (A & B) that tests for the
- " concurrency " DISPLAY" *** of SQL. Program A inserts and deletes
- " multiples " DISPLAY" *** of 5 rows between COMMITs while Program B
- " reads" DISPLAY" *** and counts, ensuring that only multiples of 5
- " " DISPLAY" *** are found." DISPLAY" "
MOVE 0 TO seqno MOVE 0 TO errflg
* -----Concurrent Transaction Loop-----
*Count MP5_AA for phantom (uncommitted) rows
.
P110. MOVE 0 TO code1 * EXEC SQL SELECT COUNT(*) INTO :getct FROM MP5_AA; CALL"SUB3"USINGSQLCODE getct MOVESQLCODETO SQL-COD if (SQLCODENOT = 0) then DISPLAY"MPB005: Negative SQLCODE counting MP5_AA
- " (Deadlock?)" * EXEC SQL ROLLBACK WORK; CALL"SUB4"USINGSQLCODE MOVESQLCODETO SQL-COD GOTO P110 END-IF
*Has MPA005 started yet? if (getct = 0) then DISPLAY"Please start MPA005" * EXEC SQL COMMIT WORK; CALL"SUB2"USINGSQLCODE GOTO P110 END-IF
* EXEC SQL INSERT INTO MP5_TT VALUES ('PC',:getct); CALL"SUB5"USINGSQLCODE getct MOVESQLCODETO SQL-COD if (SQLCODENOT = 0) then MOVE 1 TO code1 END-IF * EXEC SQL COMMIT WORK; CALL"SUB6"USINGSQLCODE MOVESQLCODETO SQL-COD if (SQLCODENOT = 0 OR code1 NOT = 0) then DISPLAY"MPB005:1: Negative SQLCODE inserting into
- " MP5_AA" * EXEC SQL ROLLBACK WORK; CALL"SUB7"USINGSQLCODE MOVESQLCODETO SQL-COD GOTO P110 END-IF DISPLAY getct " rows counted in table MP5_AA" COMPUTE seqno = seqno + 1 *Is getct a multiple of tranct? COMPUTE chekct = getct / tranct COMPUTE chekct = chekct * tranct if (chekct NOT = getct) then MOVE 1 TO errflg END-IF
*pause a little MOVE 0 TO iii
.
P118. * EXEC SQL SELECT C1 INTO :CC FROM HU.ECCO; CALL"SUB8"USINGSQLCODE CC MOVESQLCODETO SQL-COD * EXEC SQL COMMIT WORK; CALL"SUB9"USINGSQLCODE MOVESQLCODETO SQL-COD COMPUTE iii = iii + 1 if (iii < pauze) then GOTO P118 END-IF *end of pause
*Read MP5_AA for phantom (uncommitted) rows
.
P120. MOVE 0 TO code1 * EXEC SQL DECLARE MP5_CURSOR1 CURSOR FOR * SELECT ANUM FROM MP5_AA END-EXEC * EXEC SQL OPEN MP5_CURSOR1; CALL"SUB10"USINGSQLCODE MOVESQLCODETO SQL-COD if (SQLCODENOT = 0) then MOVE 1 TO code1 END-IF MOVE 0 TO ii
.
P122. *count rows in table MP5_AA * EXEC SQL FETCH MP5_CURSOR1 INTO :getct; CALL"SUB11"USINGSQLCODE getct MOVESQLCODETO SQL-COD if (SQLCODE = 0) then COMPUTE ii = ii + 1 GOTO P122 END-IF if (SQLCODE < 0) then MOVE 1 TO code1 END-IF
if (code1 NOT = 0) then DISPLAY"MPB005: Negative SQLCODE reading MP5_AA
- " (Deadlock?)" * EXEC SQL ROLLBACK WORK; CALL"SUB12"USINGSQLCODE MOVESQLCODETO SQL-COD GOTO P120 END-IF MOVE ii TO getct * EXEC SQL INSERT INTO MP5_TT VALUES ('PC',:getct); CALL"SUB13"USINGSQLCODE getct MOVESQLCODETO SQL-COD if (SQLCODENOT = 0) then MOVE 1 TO code1 END-IF * EXEC SQL COMMIT WORK; CALL"SUB14"USINGSQLCODE MOVESQLCODETO SQL-COD if (SQLCODENOT = 0 OR code1 NOT = 0) then DISPLAY"MPB005:2: Negative SQLCODE inserting into
- " MP5_TT" * EXEC SQL ROLLBACK WORK; CALL"SUB15"USINGSQLCODE MOVESQLCODETO SQL-COD GOTO P120 END-IF DISPLAY getct " rows fetched from table MP5_AA" COMPUTE seqno = seqno + 1 *Is getct a multiple of tranct? COMPUTE chekct = getct / tranct COMPUTE chekct = chekct * tranct if (chekct NOT = getct) then MOVE 1 TO errflg END-IF
*pause a little MOVE 0 TO iii
.
P128. * EXEC SQL SELECT C1 INTO :CC FROM HU.ECCO; CALL"SUB16"USINGSQLCODE CC MOVESQLCODETO SQL-COD * EXEC SQL COMMIT WORK; CALL"SUB17"USINGSQLCODE MOVESQLCODETO SQL-COD COMPUTE iii = iii + 1 if (iii < pauze) then GOTO P128 END-IF *end of pause
*Count MP5_AA_INDEX for phantom (uncommitted) rows
.
P130. MOVE 0 TO code1 * EXEC SQL SELECT COUNT(*) INTO :getct FROM MP5_AA_INDEX * ; CALL"SUB18"USINGSQLCODE getct MOVESQLCODETO SQL-COD if (SQLCODENOT = 0) then DISPLAY"MPB005: Negative SQLCODE counting MP5_AA_INDEX
- " (Deadlock?)" * EXEC SQL ROLLBACK WORK; CALL"SUB19"USINGSQLCODE MOVESQLCODETO SQL-COD GOTO P130 END-IF * EXEC SQL INSERT INTO MP5_TT VALUES ('PC',:getct); CALL"SUB20"USINGSQLCODE getct MOVESQLCODETO SQL-COD if (SQLCODENOT = 0) then MOVE 1 TO code1 END-IF * EXEC SQL COMMIT WORK; CALL"SUB21"USINGSQLCODE MOVESQLCODETO SQL-COD if (SQLCODENOT = 0 OR code1 NOT = 0) then DISPLAY"MPB005:3: Negative SQLCODE inserting into
- " MP5_TT" * EXEC SQL ROLLBACK WORK; CALL"SUB22"USINGSQLCODE MOVESQLCODETO SQL-COD GOTO P130 END-IF DISPLAY getct " rows counted in table MP5_AA_INDEX" COMPUTE seqno = seqno + 1 *Is getct a multiple of tranct? COMPUTE chekct = getct / tranct COMPUTE chekct = chekct * tranct if (chekct NOT = getct) then MOVE 1 TO errflg END-IF
*pause a little MOVE 0 TO iii
.
P138. * EXEC SQL SELECT C1 INTO :CC FROM HU.ECCO; CALL"SUB23"USINGSQLCODE CC MOVESQLCODETO SQL-COD * EXEC SQL COMMIT WORK; CALL"SUB24"USINGSQLCODE MOVESQLCODETO SQL-COD COMPUTE iii = iii + 1 if (iii < pauze) then GOTO P138 END-IF *end of pause
*Read MP5_AA_INDEX for phantom (uncommitted) rows
.
P140. MOVE 0 TO code1 * EXEC SQL DECLARE MP5_CURSOR2 CURSOR FOR * SELECT ANUM FROM MP5_AA_INDEX END-EXEC * EXEC SQL OPEN MP5_CURSOR2; CALL"SUB25"USINGSQLCODE MOVESQLCODETO SQL-COD if (SQLCODENOT = 0) then MOVE 1 TO code1 END-IF MOVE 0 TO ii
.
P142. *count rows in table MP5_AA_INDEX * EXEC SQL FETCH MP5_CURSOR2 INTO :getct; CALL"SUB26"USINGSQLCODE getct MOVESQLCODETO SQL-COD if (SQLCODE = 0) then COMPUTE ii = ii + 1 GOTO P142 END-IF if (SQLCODE < 0) then MOVE 1 TO code1 END-IF
if (code1 NOT = 0) then DISPLAY"MPB005: Negative SQLCODE reading MP5_AA_INDEX
- " (Deadlock?)" * EXEC SQL ROLLBACK WORK; CALL"SUB27"USINGSQLCODE MOVESQLCODETO SQL-COD GOTO P140 END-IF MOVE ii TO getct * EXEC SQL INSERT INTO MP5_TT VALUES ('PC',:getct); CALL"SUB28"USINGSQLCODE getct MOVESQLCODETO SQL-COD if (SQLCODENOT = 0) then MOVE 1 TO code1 END-IF * EXEC SQL COMMIT WORK; CALL"SUB29"USINGSQLCODE MOVESQLCODETO SQL-COD if (SQLCODENOT = 0 OR code1 NOT = 0) then DISPLAY"MPB005:4: Negative SQLCODE inserting into
- " MP5_TT" * EXEC SQL ROLLBACK WORK; CALL"SUB30"USINGSQLCODE MOVESQLCODETO SQL-COD GOTO P140 END-IF DISPLAY getct " rows fetched from table MP5_AA_INDEX" COMPUTE seqno = seqno + 1 *Is getct a multiple of tranct? COMPUTE chekct = getct / tranct COMPUTE chekct = chekct * tranct if (chekct NOT = getct) then MOVE 1 TO errflg END-IF
*pause a little extra MOVE 0 TO iii
.
P148. * EXEC SQL SELECT C1 INTO :CC FROM HU.ECCO; CALL"SUB31"USINGSQLCODE CC MOVESQLCODETO SQL-COD * EXEC SQL COMMIT WORK; CALL"SUB32"USINGSQLCODE MOVESQLCODETO SQL-COD COMPUTE iii = iii + 1 if (iii < pauze2) then GOTO P148 END-IF *end of pause
if (seqno < mpbins) then GOTO P110 END-IF
* -----Evaluation-----
DISPLAY" " DISPLAY"The number of rows in MP5_AA or MP5_AA_INDEX" DISPLAY" must always be a multiple of ", tranct "."
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.