* Standard COBOL (file "MPA004.SCO") calling SQL * procedures in file "MPA004.MCO". * STANDARD COBOL (file "MPA004.SCO")
**************************************************************** * * COMMENT SECTION * * DATE 1989/10/07 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. * * MPA004.SCO * WRITTEN BY: SUN DAJUN * * THIS PROGRAM IS PART A OF A TWO-PART PROGRAM(A & B) THAT * TESTS THE CONCURRENCY OF SQL * * 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"USING SQLCODE uidx MOVE SQLCODE TO 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, Module COBOL, mpa004.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
*concurrency tuning variables follow: MOVE 1 TO pauze MOVE 300 TO pauze2 MOVE 300 TO pauze3 MOVE 13 TO retrys MOVE 50 TO tranct
DISPLAY"*** This program is part A of a two-part
- " " DISPLAY"*** program (A & B) that tests deadlock management
- " " DISPLAY"*** in SQL. An implementation which rolls back " DISPLAY"*** without a negative SQLCODE will fail"
DISPLAY" This is Program A which starts first and
- " waits.... "
.
P100. * -----Initialization----- MOVE 0 TO code1 * EXEC SQL DELETE FROM MP4_NEXTKEY; CALL"SUB3"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE < 0) then MOVE 1 TO code1 END-IF * EXEC SQL DELETE FROM MP4_NN; CALL"SUB4"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE < 0) then MOVE 1 TO code1 END-IF * EXEC SQL DELETE FROM MP4_MM2; CALL"SUB5"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE < 0) then MOVE 1 TO code1 END-IF * EXEC SQL INSERT * INTO MP4_NEXTKEY (KEYNUM,AUTHOR) * VALUES (1,'A'); CALL"SUB6"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF * EXEC SQL INSERT INTO MP4_NN * VALUES ( 1); CALL"SUB7"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF * EXEC SQL INSERT INTO MP4_MM2 * VALUES ( 100); CALL"SUB8"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF
if (code1 = 1) then DISPLAY"*****Error initializing tables ****" * EXEC SQL ROLLBACK WORK; CALL"SUB9"USING SQLCODE MOVE SQLCODE TO SQL-COD GOTO P100 END-IF
* EXEC SQL COMMIT WORK; CALL"SUB10"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then DISPLAY"*********Setup will not commit ********" * EXEC SQL ROLLBACK WORK; CALL"SUB11"USING SQLCODE MOVE SQLCODE TO SQL-COD GOTO P100 END-IF
* -----Synchronization-----
DISPLAY" PLEASE start program MPB004!!! "
.
P105. *pause a little *increase value of variable pauze if MPB004 has trouble * getting table MP4_NEXTKEY. MOVE 0 TO i
.
P106. * EXEC SQL UPDATE MP4_NN * SET NUMTEST = 1; CALL"SUB12"USING SQLCODE MOVE SQLCODE TO SQL-COD COMPUTE i = i + 1 if (i < pauze) then GOTO P106 END-IF *end of pause
MOVE 0 TO knum * EXEC SQL SELECT COUNT(*) * INTO :knum * FROM MP4_NEXTKEY WHERE AUTHOR = 'B'; CALL"SUB13"USING SQLCODE knum MOVE SQLCODE TO SQL-COD
if (knum = 0) then DISPLAY" PLEASE start program MPB004!!! " GOTO P105 END-IF
*YES, we are in sync!
DISPLAY"Transaction A Starts!! " DISPLAY" " DISPLAY"IF this test lasts too long, DEADLOCK" DISPLAY"has taken place, STOP this test!"
MOVE 0 TO times1
* -----Concurrent Transactions Loop-----
.
P110. MOVE 0 TO code1 if (times1 > retrys) then DISPLAY"TEST 0268 Aborted" GOTO P193 END-IF * EXEC SQL SELECT NUMTEST * INTO :who1 * FROM MP4_NN; CALL"SUB15"USING SQLCODE who1 MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF
*MP4_NN UPDATE loop MOVE 0 TO i
.
P111. * EXEC SQL UPDATE MP4_NN * SET NUMTEST = NUMTEST + 3; CALL"SUB16"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF COMPUTE i = i + 1 if (i < tranct AND code1 = 0) then GOTO P111 END-IF
* EXEC SQL SELECT NUMTEST INTO :who2 FROM MP4_MM2; CALL"SUB17"USING SQLCODE who2 MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF
*MP4_MM2 UPDATE loop MOVE 0 TO i
.
P112. * EXEC SQL UPDATE MP4_MM2 * SET NUMTEST = NUMTEST + 5; CALL"SUB18"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF COMPUTE i = i + 1 if (i < 4 AND code1 = 0) then GOTO P112 END-IF
* EXEC SQL SELECT NUMTEST INTO :rslt1 FROM MP4_NN; CALL"SUB19"USING SQLCODE rslt1 MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF * EXEC SQL SELECT NUMTEST INTO :rslt2 FROM MP4_MM2; CALL"SUB20"USING SQLCODE rslt2 MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF
if (code1 = 0) then * EXEC SQL COMMIT WORK; CALL"SUB21"USING SQLCODE MOVE SQLCODE TO SQL-COD END-IF if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF
if (code1 = 0 OR times1 NOT = 2) then GOTO P114 END-IF DISPLAY"After 3 attempts, let Program B go first." * EXEC SQL ROLLBACK WORK; CALL"SUB22"USING SQLCODE MOVE SQLCODE TO SQL-COD MOVE 0 TO cnt
.
P113. * EXEC SQL UPDATE MP4_NEXTKEY * SET KEYNUM = KEYNUM +1; CALL"SUB23"USING SQLCODE MOVE SQLCODE TO SQL-COD COMPUTE cnt = cnt + 1 if (cnt < pauze2) then GOTO P113 END-IF * EXEC SQL COMMIT WORK; CALL"SUB24"USING SQLCODE MOVE SQLCODE TO SQL-COD
.
P114. if (code1 NOT = 0) then DISPLAY" " DISPLAY"!+!+!+!+!+!+!+!+ DEADLOCK?
- " !+!+!+!+!+!+!+!+!+!+!" DISPLAY"Negative SQLCODE (Deadlock?) was returned
- " earlier" DISPLAY"!+!+!+!+!+!+!+!+ DEADLOCK?
- " !+!+!+!+!+!+!+!+!+!+!" COMPUTE times1 = times1 + 1 * EXEC SQL ROLLBACK WORK; CALL"SUB25"USING SQLCODE MOVE SQLCODE TO SQL-COD GOTO P110 END-IF
* -----Evaluation----- *---- compute difference from original value ---- COMPUTE rslt1 = rslt1 - who1 COMPUTE rslt2 = rslt2 - who2
*---- Give Program B time to finish ----- DISPLAY"MPA004 transaction completed." MOVE 0 TO cnt
.
P115. * EXEC SQL UPDATE MP4_NEXTKEY * SET KEYNUM = KEYNUM +1; CALL"SUB26"USING SQLCODE MOVE SQLCODE TO SQL-COD COMPUTE cnt = cnt + 1 if (cnt < pauze3) then GOTO P115 END-IF * EXEC SQL COMMIT WORK; CALL"SUB27"USING SQLCODE MOVE SQLCODE TO SQL-COD
.
P116. MOVE 0 TO code1 DISPLAY"MPB004 should be finished by now:" *date_time print ACCEPT TO-DAY FROMDATE ACCEPT THE-TIME FROMTIME DISPLAY"Date run YYMMDD: " TO-DAY " at hhmmssff: " THE-TIME * EXEC SQL SELECT NUMTEST INTO :test2 FROM MP4_MM2; CALL"SUB28"USING SQLCODE test2 MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF * EXEC SQL SELECT NUMTEST INTO :test1 FROM MP4_NN; CALL"SUB29"USING SQLCODE test1 MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF if (code1 = 1) then DISPLAY"Cannot select from MP4_MM2 or MP4_NN" * EXEC SQL COMMIT WORK; CALL"SUB30"USING SQLCODE MOVE SQLCODE TO SQL-COD GOTO P116 END-IF
DISPLAY" The correct answer is :" DISPLAY" rslt1 is ", tx DISPLAY" rslt2 is 20" DISPLAY" test1 is ", txls19 DISPLAY" test2 is ", CXXL3T DISPLAY" Your answer is :" DISPLAY" rslt1 is ", rslt1 DISPLAY" rslt2 is ", rslt2 DISPLAY" test1 is ", test1 DISPLAY" test2 is ", test2
if ( rslt1 = tx AND rslt2 = 20 AND test1 = txls19 AND test2 = CXXL3T) then DISPLAY"mpa004.sco: *** pass *** " * EXEC SQL INSERT INTO HU.TESTREPORT * VALUES('0268','pass','MCO'); CALL"SUB31"USING SQLCODE MOVE SQLCODE TO SQL-COD else DISPLAY"mpa004.sco: *** fail *** " * EXEC SQL INSERT INTO HU.TESTREPORT * VALUES('0268','fail','MCO'); CALL"SUB32"USING SQLCODE MOVE SQLCODE TO SQL-COD COMPUTE errcnt = errcnt + 1 DISPLAY"MPA004 must check the total workload" DISPLAY" after MPB004 commits its results," DISPLAY" otherwise, MPA004 will issues a false *** fail
- " ***" DISPLAY"If MPA004 fails and MPA004 finished first," DISPLAY" then delete the results from TESTREPORT and
- " RERUN" DISPLAY" after (using TEd) to increase the value of
- " pauze3." END-IF
if (times1 = 0) then DISPLAY"Look for DEADLOCK message from MPB004." DISPLAY"If MPB004 does not issues a DEADLOCK message," DISPLAY" you will need to RERUN this test, after" DISPLAY" (using TEd) increasing value of variable
- " tranct." END-IF
******************** END TEST0268 *******************
**** TESTER MAY CHOOSE TO INSERT CODE FOR errcnt > 0
STOPRUN.
* **** Procedures for PERFORM statements
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet)
¤
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 ist noch experimentell.