* Standard COBOL (file "MPB001.SCO") calling SQL * procedures in file "MPB001.MCO". * STANDARD COBOL (file "MPB001.SCO")
**************************************************************** * * COMMENT SECTION * * DATE 1988/12/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. * * MPB001.SCO * WRITTEN BY: S HURWITZ * * THIS PROGRAM IS PART B 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, mpb001.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 10 TO pauze MOVE 50 TO keymax
* EXEC SQL COMMIT WORK; CALL"SUB2"USING SQLCODE MOVE SQLCODE TO SQL-COD ******************** BEGIN TEST0230 *******************
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 the first value
- " into " DISPLAY" *** a table and waits for Program B.
- " "
* -----Synchronization-----
.
P100. *pause a little * EXEC SQL DELETE FROM MP1_MM2; CALL"SUB3"USING SQLCODE MOVE SQLCODE TO SQL-COD MOVE 0 TO i
.
P101. * EXEC SQL INSERT INTO MP1_MM2 VALUES (:i); CALL"SUB4"USING SQLCODE i MOVE SQLCODE TO SQL-COD COMPUTE i = i + 1 if (i < pauze) then GOTO P101 END-IF
* EXEC SQL COMMIT WORK; CALL"SUB5"USING SQLCODE MOVE SQLCODE TO SQL-COD *end of pause
MOVE 0 TO i * EXEC SQL SELECT COUNT(*) * INTO :i * FROM MP1_NEXTKEY; CALL"SUB6"USING SQLCODE i MOVE SQLCODE TO SQL-COD MOVE 0 TO knum * EXEC SQL SELECT KEYNUM, AUTHOR * INTO :knum, :auth * FROM MP1_NEXTKEY; CALL"SUB7"USING SQLCODE knum auth MOVE SQLCODE TO SQL-COD
*are we in sync?
if (auth NOT = "A"OR knum NOT = 1 OR i NOT =
1) then DISPLAY" Waiting for program MPA001 to start... " * EXEC SQL COMMIT WORK; CALL"SUB8"USING SQLCODE MOVE SQLCODE TO SQL-COD GOTO P100 END-IF
DISPLAY" This is Program B; Program A has inserted the " DISPLAY" first value into a table. " *YES, we are in sync!
* -----Initialization-----
.
P102. MOVE 0 TO code1 MOVE 2 TO knum DISPLAY" MPB001: keynum = 2 " * EXEC SQL INSERT * INTO MP1_NEXTKEY (KEYNUM,AUTHOR) * VALUES(2,'B'); CALL"SUB9"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF * EXEC SQL COMMIT WORK; CALL"SUB10"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF if (code1 = 1) then GOTO P102 END-IF
MOVE 2 TO oldkey MOVE 0 TO concur MOVE 0 TO keydif
* -----Concurrent Transaction Loop-----
.
P110.
*start table lock
* EXEC SQL SELECT MAX(KEYNUM) * INTO :newmax * FROM MP1_NEXTKEY; CALL"SUB11"USING SQLCODE newmax MOVE SQLCODE TO SQL-COD
if (SQLCODE NOT = 0) then DISPLAY" SQLCODE not zero after SELECT MAX(KEYNUM)
- " statement " DISPLAY" SQLCODE = ", SQL-COD " " * EXEC SQL COMMIT WORK; CALL"SUB12"USING SQLCODE MOVE SQLCODE TO SQL-COD GOTO P110 END-IF
if (newmax NOT < keymax) then GOTO P120 END-IF
COMPUTE newmax = newmax + 1
MOVE 0 TO code1 * EXEC SQL INSERT * INTO MP1_NEXTKEY (KEYNUM,AUTHOR) * VALUES (:newmax,'B'); CALL"SUB13"USING SQLCODE newmax MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF * EXEC SQL COMMIT WORK; CALL"SUB14"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF *end table lock
if (code1 = 0) then COMPUTE keydif = newmax - oldkey MOVE newmax TO oldkey DISPLAY" MPB001: keynum = ", newmax " " END-IF if (code1 = 0 AND keydif > 1) then COMPUTE concur = concur + 1 DISPLAY" *** B interleaved #", concur " ***" END-IF
GOTO P110
* -----Evaluation-----
.
P120. CALL"SUB2"USING SQLCODE * EXEC SQL SELECT COUNT(*) * INTO :i * FROM MP1_NEXTKEY; CALL"SUB15"USING SQLCODE i MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then DISPLAY" Cannot select for MP1_NEXTKEY" GOTO P120 END-IF
* EXEC SQL SELECT COUNT(DISTINCT KEYNUM) * INTO :ii * FROM MP1_NEXTKEY; CALL"SUB16"USING SQLCODE ii MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then DISPLAY" Cannot select for MP1_NEXTKEY!" GOTO P120 END-IF
DISPLAY" The number of rows should be ", keymax " " DISPLAY" The number of distinct keynum values should be ",
keymax " " DISPLAY" The number of rows = ", i " " DISPLAY" The number of distinct keynum values = ", ii "
- " "
if (concur < 4 AND i = ii AND ii = keymax) then DISPLAY" Insufficient interleaving to demonstrate
- " concurrency!" DISPLAY" Using TEd, decrease variable pauze to start" DISPLAY" MPB001 sooner or increase value of variable
- " keymax" DISPLAY" in both MPA001 and MPB001 to lengthen test." DISPLAY" Then RERUN!" GOTO P130 END-IF
if ( i = ii AND ii = keymax) then DISPLAY"mpb001.sco: *** pass *** " * EXEC SQL INSERT INTO HU.TESTREPORT * VALUES('0230','pass','MCO'); CALL"SUB17"USING SQLCODE MOVE SQLCODE TO SQL-COD else DISPLAY"mpb001.sco: *** fail *** " * EXEC SQL INSERT INTO HU.TESTREPORT * VALUES('0230','fail','MCO'); CALL"SUB18"USING SQLCODE MOVE SQLCODE TO SQL-COD COMPUTE errcnt = errcnt + 1 END-IF
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.