* Standard COBOL (file "MPA002.SCO") calling SQL * procedures in file "MPA002.MCO". * STANDARD COBOL (file "MPA002.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. * * MPA002.SCO * WRITTEN BY: J Sullivan * * 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, mpa002.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 11 TO pauze MOVE 15 TO tranct
DISPLAY" *** This program is part A of a two-part
- " " DISPLAY" *** program (A & B) that tests for the
- " concurrency " DISPLAY" *** of SQL. Program A inserts 1000 rows into " DISPLAY" *** a table and waits for Program B.
- " "
DISPLAY" This is Program A which starts first and
- " waits.... "
* -----Initialization-----
.
P100. MOVE 0 TO code1 * EXEC SQL DELETE FROM MP2_NEXTKEY; CALL"SUB3"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE < 0) then MOVE 1 TO code1 END-IF MOVE 1 TO keyval
.
P101. * EXEC SQL INSERT * INTO MP2_NEXTKEY (KEYNUM,AUTHOR,DOLLARS) * VALUES (:keyval,'A',500); CALL"SUB4"USING SQLCODE keyval MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF COMPUTE keyval = keyval + 1 if (keyval < 1001) then GOTO P101 END-IF
DISPLAY"1000 rows inserted into MP2_NEXTKEY "
MOVE 0 TO dollar * EXEC SQL SELECT SUM(DOLLARS) INTO :dollar * FROM MP2_NEXTKEY * WHERE KEYNUM = 1 OR KEYNUM = 500 OR KEYNUM = 999 * ; CALL"SUB5"USING SQLCODE dollar MOVE SQLCODE TO SQL-COD DISPLAY"MPA002: sum of accounts 1, 500, and 999 starts at
- " $", dollar DISPLAY"sum should be $1500 initially "
* EXEC SQL COMMIT WORK; CALL"SUB6"USING SQLCODE MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO code1 END-IF if (code1 = 1) then DISPLAY" Cannot initialize MP2_NEXTKEY" GOTO P100 END-IF DISPLAY"MPA002: account 1 has $500 and account 500 has
- " $500"
* -----Synchronization-----
.
P102.
*pause a little * EXEC SQL DELETE FROM MP2_NN; CALL"SUB7"USING SQLCODE MOVE SQLCODE TO SQL-COD MOVE 1 TO i
.
P103. * EXEC SQL INSERT INTO MP2_NN VALUES (:i); CALL"SUB8"USING SQLCODE i MOVE SQLCODE TO SQL-COD COMPUTE i = i + 1 if (i < pauze) then GOTO P103 END-IF *end of pause
*are we in sync? MOVE 0 TO dollar * EXEC SQL SELECT DOLLARS * INTO :dollar * FROM MP2_NEXTKEY WHERE KEYNUM = 999; CALL"SUB9"USING SQLCODE dollar MOVE SQLCODE TO SQL-COD
if (dollar = 500) then DISPLAY" PLEASE start program MPB002!!! " GOTO P102 END-IF
*YES, we are in sync! MOVE 0 TO doldif MOVE 0 TO concur MOVE 500 TO olddol MOVE 0 TO i
* -----Concurrent Transaction Loop-----
.
P120. MOVE 0 TO iserr MOVE 0 TO dol1 MOVE 0 TO dol500 *start record lock * EXEC SQL SELECT DOLLARS INTO :dol500 * FROM MP2_NEXTKEY WHERE KEYNUM = 500; CALL"SUB11"USING SQLCODE dol500 MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO iserr GOTO P901 END-IF * EXEC SQL SELECT DOLLARS INTO :dol1 * FROM MP2_NEXTKEY WHERE KEYNUM = 1; CALL"SUB12"USING SQLCODE dol1 MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO iserr GOTO P901 END-IF
* EXEC SQL UPDATE MP2_NEXTKEY * SET DOLLARS = :dol1 WHERE KEYNUM = 1; CALL"SUB13"USING SQLCODE dol1 MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO iserr GOTO P901 END-IF * EXEC SQL UPDATE MP2_NEXTKEY * SET DOLLARS = :dol500 WHERE KEYNUM = 500; CALL"SUB14"USING SQLCODE dol500 MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then MOVE 1 TO iserr GOTO P901 END-IF
.
P901. if (iserr = 0) then * EXEC SQL COMMIT WORK; CALL"SUB15"USING SQLCODE MOVE SQLCODE TO SQL-COD DISPLAY"MPA002: account 1 has $", dol1 " and account
- " 500 has $", dol500 COMPUTE doldif = olddol - dol500 MOVE dol500 TO olddol END-IF if (iserr = 1 OR SQLCODE NOT = 0) then MOVE 1 TO iserr * EXEC SQL ROLLBACK WORK; CALL"SUB16"USING SQLCODE MOVE SQLCODE TO SQL-COD COMPUTE tranct = tranct + 1 DISPLAY"ROLLBACK due to nonzero SQLCODE (Deadlock?)" END-IF if (iserr = 0 AND doldif > 5) then COMPUTE concur = concur + 1 DISPLAY" *** A interleaved #", concur " ***" END-IF *end record lock COMPUTE i = i + 1 if (i < tranct) then GOTO P120 END-IF
* -----Evaluation-----
.
P130. MOVE 0 TO dollar * EXEC SQL SELECT SUM(DOLLARS) INTO :dollar * FROM MP2_NEXTKEY * WHERE KEYNUM = 1 OR KEYNUM = 500 OR KEYNUM = 999 * ; CALL"SUB17"USING SQLCODE dollar MOVE SQLCODE TO SQL-COD if (SQLCODE NOT = 0) then DISPLAY" Cannot select for MP2_NEXTKEY" GOTO P130 END-IF DISPLAY" MPA002: sum of accounts 1, 500, and 999 = $",
dollar DISPLAY" sum should be $1500 after transferring
- " money" * EXEC SQL COMMIT WORK; CALL"SUB18"USING SQLCODE MOVE SQLCODE TO SQL-COD
if (concur < 3 AND dollar = 1500) then DISPLAY" Insufficient interleaving to demonstrate
- " concurrency!" DISPLAY" Using TEd, decrease variable pauze to start" DISPLAY" MPA002 sooner or increase value of variable
- " tranct" DISPLAY" in both MPA002 and MPB002 to lengthen test." DISPLAY" Then RERUN!" GOTO P140 END-IF
if ( dollar = 1500) then DISPLAY"mpa002.sco: *** pass *** " * EXEC SQL INSERT INTO HU.TESTREPORT * VALUES('0231','pass','MCO'); CALL"SUB19"USING SQLCODE MOVE SQLCODE TO SQL-COD else DISPLAY"mpa002.sco: *** fail *** " * EXEC SQL INSERT INTO HU.TESTREPORT * VALUES('0231','fail','MCO'); CALL"SUB20"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.