* Standard COBOL (file "MPB007.SCO") calling SQL * procedures in file "MPB007.MCO". * STANDARD COBOL (file "MPB007.SCO")
**************************************************************** * * COMMENT SECTION * * DATE 1992/07/17 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. * * MPB007.SCO * WRITTEN BY: David W. Flater * * THIS PROGRAM IS PART B OF A TWO-PART PROGRAM(A & B) THAT * TESTS THE CONCURRENCY OF SQL * * REFERENCES * ANSI SQL-1992 * 4.28 SQL-transactions * ****************************************************************
if (knum = 0) then DISPLAY" PLEASE start program MPA007!!! " GOTO P105 END-IF
.
P106. MOVE 0 TO code1 * EXEC SQL INSERT INTO MP7_NEXTKEY (KEYNUM,AUTHOR) * VALUES(2, 'B'); CALL"SUB4"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF * EXEC SQL COMMIT WORK; CALL"SUB5"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF if (code1 NOT = 0) then * EXEC SQL ROLLBACK WORK; CALL"SUB6"USING SQLCODE MOVE SQLCODE TO SQL-COD DISPLAY"Retrying synchronization logic." GOTO P106 END-IF
*YES, we are in sync!
DISPLAY"Transaction B Starts!! " *date_time print ACCEPT TO-DAY FROMDATE ACCEPT THE-TIME FROMTIME DISPLAY"Date run YYMMDD: " TO-DAY " at hhmmssff: " THE-TIME DISPLAY" " DISPLAY"IF this test lasts too long, DEADLOCK" DISPLAY"has taken place, STOP this test!"
MOVE 1 TO i
*We hired a couple of summer students to write application *programs. The first one wrote application Yook, which *only works if all the data are in table BB, and table AA *is empty. The second one wrote application Zook, which *only works if all the data are in table AA, and table BB *is empty. The table names were hard-coded everywhere, so *rather than rewrite everything we just had another summer *student add code to move the data into the right table *before each application starts up. This more or less *solved the problem, but we have to be careful not to have *two people trying to run the applications simultaneously.
.
P101. *Move all data into table AA for application Zook. * EXEC SQL DECLARE ZOOK CURSOR FOR * SELECT BNUM FROM MP7_BB END-EXEC if (SQLCODE < 0) then GOTO P120 END-IF * EXEC SQL OPEN ZOOK; CALL"SUB7"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE < 0) then GOTO P120 END-IF MOVE 0 TO count1
.
P104. * EXEC SQL FETCH ZOOK INTO :tmpint; CALL"SUB8"USING SQLCODE tmpint MOVE SQLCODE TO SQL-COD if (SQLCODE < 0) then GOTO P120 END-IF if (SQLCODE > 0) then * EXEC SQL COMMIT WORK; CALL"SUB9"USING SQLCODE MOVE SQLCODE TO SQL-COD DISPLAY count1 " rows moved from MP7_BB to MP7_AA." *date_time print ACCEPT TO-DAY FROMDATE ACCEPT THE-TIME FROMTIME DISPLAY"Date run YYMMDD: " TO-DAY " at hhmmssff: " THE-TIME if (SQLCODE < 0) then GOTO P120 END-IF GOTO P103 END-IF * EXEC SQL INSERT INTO MP7_AA VALUES (:tmpint); CALL"SUB10"USING SQLCODE tmpint MOVE SQLCODE TO SQL-COD if (SQLCODE < 0) then GOTO P120 END-IF * EXEC SQL DELETE FROM MP7_BB WHERE CURRENT OF ZOOK; CALL"SUB11"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE < 0) then GOTO P120 END-IF COMPUTE count1 = count1 + 1 GOTO P104
.
P120. COMPUTE flcnt = flcnt + 1 if (flcnt > mxfail) then GOTO P180 END-IF DISPLAY"!+!+!+!+!+!+!+!+ DEADLOCK? !+!+!+!+!+!+!+!+!+!+!" DISPLAY"Negative SQLCODE (Deadlock?) was returned earlier" DISPLAY"!+!+!+!+!+!+!+!+ DEADLOCK? !+!+!+!+!+!+!+!+!+!+!" *date_time print ACCEPT TO-DAY FROMDATE ACCEPT THE-TIME FROMTIME DISPLAY"Date run YYMMDD: " TO-DAY " at hhmmssff: " THE-TIME DISPLAY"Restarting transaction ", i "A." * EXEC SQL ROLLBACK WORK; CALL"SUB12"USING SQLCODE MOVE SQLCODE TO SQL-COD GOTO P101
.
P103. *Move all data into table BB for application Yook. * EXEC SQL DECLARE YOOK CURSOR FOR * SELECT ANUM FROM MP7_AA END-EXEC if (SQLCODE < 0) then GOTO P110 END-IF * EXEC SQL OPEN YOOK; CALL"SUB13"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE < 0) then GOTO P110 END-IF MOVE 0 TO count1
.
P102. * EXEC SQL FETCH YOOK INTO :tmpint; CALL"SUB14"USING SQLCODE tmpint MOVE SQLCODE TO SQL-COD if (SQLCODE < 0) then GOTO P110 END-IF if (SQLCODE > 0) then * EXEC SQL COMMIT WORK; CALL"SUB15"USING SQLCODE MOVE SQLCODE TO SQL-COD DISPLAY count1 " rows moved from MP7_AA to MP7_BB." *date_time print ACCEPT TO-DAY FROMDATE ACCEPT THE-TIME FROMTIME DISPLAY"Date run YYMMDD: " TO-DAY " at hhmmssff: " THE-TIME if (SQLCODE < 0) then GOTO P110 END-IF GOTO P166 END-IF * EXEC SQL INSERT INTO MP7_BB VALUES (:tmpint); CALL"SUB16"USING SQLCODE tmpint MOVE SQLCODE TO SQL-COD if (SQLCODE < 0) then GOTO P110 END-IF * EXEC SQL DELETE FROM MP7_AA WHERE CURRENT OF YOOK; CALL"SUB17"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE < 0) then GOTO P110 END-IF COMPUTE count1 = count1 + 1 GOTO P102
.
P166. *date_time print ACCEPT TO-DAY FROMDATE ACCEPT THE-TIME FROMTIME DISPLAY"Date run YYMMDD: " TO-DAY " at hhmmssff: " THE-TIME DISPLAY"Survived transaction ", i "." if (i NOT < loops) then GOTO P199 END-IF COMPUTE i = i + 1 GOTO P101
.
P110. COMPUTE flcnt = flcnt + 1 if (flcnt > mxfail) then GOTO P180 END-IF DISPLAY"!+!+!+!+!+!+!+!+ DEADLOCK? !+!+!+!+!+!+!+!+!+!+!" DISPLAY"Negative SQLCODE (Deadlock?) was returned earlier" DISPLAY"!+!+!+!+!+!+!+!+ DEADLOCK? !+!+!+!+!+!+!+!+!+!+!" *date_time print ACCEPT TO-DAY FROMDATE ACCEPT THE-TIME FROMTIME DISPLAY"Date run YYMMDD: " TO-DAY " at hhmmssff: " THE-TIME DISPLAY"Restarting transaction ", i "B." * EXEC SQL ROLLBACK WORK; CALL"SUB18"USING SQLCODE MOVE SQLCODE TO SQL-COD GOTO P103
.
P180. DISPLAY" " DISPLAY"Maximum number of negative SQLCODEs exceeded" DISPLAY"Assuming no progress" DISPLAY"Program B giving up..." * EXEC SQL ROLLBACK WORK; CALL"SUB19"USING SQLCODE MOVE SQLCODE TO SQL-COD
.
P199. *Finish up
DISPLAY" " DISPLAY"Program A decides whether this was a pass or not." DISPLAY"Program B is now exiting." *date_time print ACCEPT TO-DAY FROMDATE ACCEPT THE-TIME FROMTIME DISPLAY"Date run YYMMDD: " TO-DAY " at hhmmssff: " THE-TIME DISPLAY" " DISPLAY "===================================================="
******************** END TEST0507 *******************
**** TESTER MAY CHOOSE TO INSERT CODE FOR errcnt > 0 STOPRUN.
* **** Procedures for PERFORM statements
[ Verzeichnis aufwärts0.26unsichere Verbindung
Übersetzung europäischer Sprachen durch Browser
]