IDENTIFICATION DIVISION .
PROGRAM-ID . DML061.
ENVIRONMENT DIVISION .
CONFIGURATION SECTION .
SOURCE-COMPUTER . xyz.
OBJECT-COMPUTER . xyz.
DATA DIVISION .
WORKING-STORAGE SECTION .
* EMBEDDED COBOL (file "DML061.PCO")
****************************************************************
*
* COMMENT SECTION
*
* DATE 1989/07/21 EMBEDDED 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.
*
* DML061.PCO
* WRITTEN BY: SUN DAJUN
* TRANSLATED AUTOMATICALLY FROM EMBEDDED C BY CHRIS SCHANZLE
*
* THIS ROUTINE TESTS BETWEEN, SET FUNCTIONS, AND INTEGRITY.
*
* REFERENCES
* AMERICAN NATIONAL STANDARD database language - SQL
* X3.135-1989
*
* SECTION 5.12 <between predicate>
* SECTION 5.8 <set specification>
* SECTION 7.3 <procedure> GR 3b
*
****************************************************************
EXEC SQL BEGIN DECLARE SECTION END-EXEC
01 EMPNO1 PIC X(3 ).
01 HOURS1 PIC S9(9 ) DISPLAY SIGN LEADING SEPARATE .
01 count1 PIC S9(9 ) DISPLAY SIGN LEADING SEPARATE .
01 count2 PIC S9(9 ) DISPLAY SIGN LEADING SEPARATE .
01 count3 PIC S9(9 ) DISPLAY SIGN LEADING SEPARATE .
01 count4 PIC S9(9 ) DISPLAY SIGN LEADING SEPARATE .
01 max1 PIC S9(9 ) DISPLAY SIGN LEADING SEPARATE .
01 min1 PIC S9(9 ) DISPLAY SIGN LEADING SEPARATE .
01 sum1 PIC S9(9 ) DISPLAY SIGN LEADING SEPARATE .
01 ff1 PIC S9(9 ) DISPLAY SIGN LEADING SEPARATE .
01 indic1 PIC S9(4 ) DISPLAY SIGN LEADING SEPARATE .
01 indic2 PIC S9(4 ) DISPLAY SIGN LEADING SEPARATE .
01 indic3 PIC S9(4 ) DISPLAY SIGN LEADING SEPARATE .
01 EMPNA1 PIC X(20 ).
01 EMPNA2 PIC X(20 ).
01 EMPNA3 PIC X(20 ).
01 uid PIC X(18 ).
01 uidx PIC X(18 ).
EXEC SQL END DECLARE SECTION END-EXEC
01 SQLCODE PIC S9(9 ) COMP .
01 errcnt PIC S9(4 ) DISPLAY SIGN LEADING SEPARATE .
01 i PIC S9(9 ) DISPLAY SIGN LEADING SEPARATE .
01 flag PIC S9(9 ) DISPLAY SIGN LEADING SEPARATE .
01 cnt PIC S9(9 ) DISPLAY SIGN LEADING SEPARATE .
01 SQL-COD PIC S9(9 ) DISPLAY SIGN LEADING SEPARATE .
01 DISP1 PIC S9(4 ) DISPLAY SIGN LEADING SEPARATE .
01 DISP2 PIC S9(4 ) DISPLAY SIGN LEADING SEPARATE .
01 DISP3 PIC S9(4 ) DISPLAY SIGN LEADING SEPARATE .
* date_time declaration *
01 TO-DAY PIC 9 (6 ).
01 THE-TIME PIC 9 (8 ).
PROCEDURE DIVISION .
P0.
MOVE "HU" TO uid
CALL "AUTHID" USING uid
MOVE "not logged in, not" TO uidx
EXEC SQL SELECT
USER INTO :uidx FROM HU.ECCO END-EXEC
if (uid NOT = uidx) then
DISPLAY "ERROR: User " uid " expected."
DISPLAY "User " uidx " connected."
DISPLAY " "
STOP RUN
END-IF
MOVE 0 TO errcnt
DISPLAY
"SQL Test Suite, V6.0, Embedded COBOL, dml061.pco"
DISPLAY " "
DISPLAY
"59-byte ID"
DISPLAY "TEd Version #"
DISPLAY " "
* date_time print *
ACCEPT TO-DAY FROM DATE
ACCEPT THE-TIME FROM TIME
DISPLAY "Date run YYMMDD: " TO-DAY " at hhmmssff: " THE-TIME
******************** BEGIN TEST0269 *******************
*BETWEEN value expressions in wrong order
DISPLAY "BETWEEN value expressions in wrong order "
DISPLAY "Reference X3.135-1989 section 5.12 GR 2 "
DISPLAY " ------------------------------------------ "
DISPLAY " TEST0269 "
DISPLAY " Reference 5.12 General Rules )"
DISPLAY " - - - - - - - - - - - - - - - - - - - - - "
DISPLAY " "
DISPLAY " SELECT COUNT(*) INTO :count1"
DISPLAY " FROM WORKS"
DISPLAY " WHERE HOURS BETWEEN 80 AND 40;"
DISPLAY " INSERT INTO WORKS"
DISPLAY " VALUES('E6','P6',-60);"
DISPLAY " "
DISPLAY " SELECT COUNT(*) INTO :count2"
DISPLAY " FROM WORKS"
DISPLAY " WHERE HOURS BETWEEN :max1 AND :min1;"
DISPLAY " "
DISPLAY " SELECT COUNT(*) INTO :count3"
DISPLAY " FROM WORKS"
DISPLAY " WHERE HOURS BETWEEN :min1 AND :max1;"
DISPLAY " "
MOVE -1 TO count1
MOVE -1 TO count2
MOVE -1 TO count3
EXEC SQL SELECT COUNT (*) INTO :count1
FROM WORKS
WHERE HOURS BETWEEN 80 AND 40 END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL INSERT INTO WORKS
VALUES('E6' ,'P6' ,-60 ) END-EXEC
MOVE SQLCODE TO SQL-COD
MOVE -40 TO max1
MOVE -80 TO min1
EXEC SQL SELECT COUNT (*) INTO :count2
FROM WORKS
WHERE HOURS BETWEEN :max1 AND :min1 END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL SELECT COUNT (*) INTO :count3
FROM WORKS
WHERE HOURS BETWEEN :min1 AND :max1 END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL ROLLBACK WORK END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " The correct answer is :"
DISPLAY " count1 = 0"
DISPLAY " count2 = 0"
DISPLAY " count3 = 1"
DISPLAY " Your answer is :"
DISPLAY " count1 = " , count1
DISPLAY " count2 = " , count2
DISPLAY " count3 = " , count3
if (count1 = 0 AND count2 = 0 AND count3 = 1 ) then
DISPLAY " *** pass *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0269' ,'pass' ,'PCO' ) END-EXEC
MOVE SQLCODE TO SQL-COD
else
DISPLAY " dml061.pco *** fail *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0269' ,'fail' ,'PCO' ) END-EXEC
ADD 1 TO errcnt
MOVE SQLCODE TO SQL-COD
END-IF
DISPLAY "==============================================="
EXEC SQL COMMIT WORK END-EXEC
MOVE SQLCODE TO SQL-COD
******************** END TEST0269 *******************
******************** BEGIN TEST0270 *******************
*BETWEEN approximate and exact numeric values
DISPLAY "BETWEEN value with comparable data types "
DISPLAY "Reference X3.135-1989 section 5.12 SR 1 "
DISPLAY " ------------------------------------------ "
DISPLAY " TEST0270 "
DISPLAY " Reference 5.12 Syntax Rules "
DISPLAY " - - - - - - - - - - - - - - - - - - - - - "
DISPLAY " "
DISPLAY " SELECT COUNT(*) INTO :count1"
DISPLAY " FROM WORKS"
DISPLAY " WHERE HOURS BETWEEN :ff1 AND :HOURS1 OR
- " "
DISPLAY " HOURS BETWEEN 19.999 AND 2.001E1;"
DISPLAY " "
MOVE -1 TO count1
MOVE 11 TO ff1
MOVE 12 TO HOURS1
EXEC SQL SELECT COUNT (*) INTO :count1
FROM WORKS
WHERE HOURS BETWEEN :ff1 AND :HOURS1 OR
HOURS BETWEEN 19 .999 AND 2 .001 E1 END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " The correct answer is :"
DISPLAY " count1 = 6"
DISPLAY " Your answer is :"
DISPLAY " count1 = " , count1
if (count1 = 6 ) then
DISPLAY " *** pass *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0270' ,'pass' ,'PCO' ) END-EXEC
MOVE SQLCODE TO SQL-COD
else
DISPLAY " dml061.pco *** fail *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0270' ,'fail' ,'PCO' ) END-EXEC
ADD 1 TO errcnt
MOVE SQLCODE TO SQL-COD
END-IF
DISPLAY "==============================================="
EXEC SQL COMMIT WORK END-EXEC
MOVE SQLCODE TO SQL-COD
******************** END TEST0270 *******************
******************** BEGIN TEST0271 *******************
*COUNT(*) with Cartesian product subset
DISPLAY "COUNT (*) with Cartesian product subset"
DISPLAY "Reference X3.135-1989 section:"
DISPLAY " section 5.8 GR 4b"
DISPLAY " section 5.20 GR 2b"
DISPLAY " section 5.21 1,2"
DISPLAY " ------------------------------------------ "
DISPLAY " TEST0271 "
DISPLAY " Reference 5.8 General Rules )"
DISPLAY " - - - - - - - - - - - - - - - - - - - - - "
DISPLAY " "
DISPLAY " SELECT COUNT(*) INTO :count1"
DISPLAY " FROM WORKS,STAFF"
DISPLAY " WHERE WORKS.EMPNUM = 'E1';"
DISPLAY " "
MOVE 0 TO count1
EXEC SQL SELECT COUNT (*) INTO :count1
FROM WORKS,STAFF
WHERE WORKS.EMPNUM = 'E1' END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " The correct answer is :"
DISPLAY " count1 = 30"
DISPLAY " Your answer is :"
DISPLAY " count1 = " , count1
if (count1 = 30 ) then
DISPLAY " *** pass *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0271' ,'pass' ,'PCO' ) END-EXEC
MOVE SQLCODE TO SQL-COD
else
DISPLAY " dml061.pco *** fail *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0271' ,'fail' ,'PCO' ) END-EXEC
ADD 1 TO errcnt
MOVE SQLCODE TO SQL-COD
END-IF
DISPLAY "==============================================="
EXEC SQL COMMIT WORK END-EXEC
MOVE SQLCODE TO SQL-COD
******************** END TEST0271 *******************
******************** BEGIN TEST0272 *******************
*Statement rollback for integrity violation.
DISPLAY " Statement rollback for integrity violation "
DISPLAY "Reference X3.135-1989 section 7.3 General Rules 3b"
DISPLAY " ------------------------------------------ "
DISPLAY " TEST0272 "
DISPLAY " Reference 7.3 General Rules )"
DISPLAY " - - - - - - - - - - - - - - - - - - - - - "
DISPLAY " "
DISPLAY " UPDATE WORKS"
DISPLAY " SET EMPNUM = 'E7'"
DISPLAY " WHERE EMPNUM = 'E1' OR EMPNUM = 'E4';"
DISPLAY " "
DISPLAY " INSERT INTO WORKS "
DISPLAY " SELECT 'E3',PNUM,17 FROM PROJ;"
DISPLAY " "
DISPLAY " UPDATE V_WORKS1"
DISPLAY " SET HOURS = HOURS - 9;"
DISPLAY " "
DISPLAY " SELECT COUNT(*) INTO :count4 FROM WORKS"
DISPLAY " WHERE EMPNUM = 'E7' OR HOURS = 31 OR HOURS =
- " 17;"
DISPLAY " "
MOVE 0 TO count1
MOVE 0 TO count2
MOVE 0 TO count3
MOVE -1 TO count4
EXEC SQL UPDATE WORKS
SET EMPNUM = 'E7'
WHERE EMPNUM = 'E1' OR EMPNUM = 'E4' END-EXEC
MOVE SQLCODE TO SQL-COD
MOVE SQLCODE TO count1
EXEC SQL INSERT INTO WORKS
SELECT 'E3' ,PNUM,17 FROM PROJ END-EXEC
MOVE SQLCODE TO SQL-COD
MOVE SQLCODE TO count2
EXEC SQL UPDATE V_WORKS1
SET HOURS = HOURS - 9 END-EXEC
MOVE SQLCODE TO SQL-COD
MOVE SQLCODE TO count3
EXEC SQL SELECT COUNT (*) INTO :count4 FROM WORKS
WHERE EMPNUM = 'E7' OR HOURS = 31 OR HOURS = 17 END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL ROLLBACK WORK END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " The correct answer is :"
DISPLAY " count1 < 0"
DISPLAY " count2 < 0"
DISPLAY " count3 < 0"
DISPLAY " count4 = 0"
DISPLAY " Your answer is :"
DISPLAY " count1 = " , count1
DISPLAY " count2 = " , count2
DISPLAY " count3 = " , count3
DISPLAY " count4 = " , count4
if (count1 < 0 AND count2 < 0 AND count3 < 0 AND
count4 = 0 ) then
DISPLAY " *** pass *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0272' ,'pass' ,'PCO' ) END-EXEC
MOVE SQLCODE TO SQL-COD
else
DISPLAY " dml061.pco *** fail *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0272' ,'fail' ,'PCO' ) END-EXEC
ADD 1 TO errcnt
MOVE SQLCODE TO SQL-COD
END-IF
DISPLAY "==============================================="
EXEC SQL COMMIT WORK END-EXEC
MOVE SQLCODE TO SQL-COD
******************** END TEST0272 *******************
******************** BEGIN TEST0273 *******************
*SUM, MAX, MIN = NULL for empty arguments
DISPLAY " SUM, MAX, MIN = NULL "
DISPLAY "Reference X3.135-1989 section 5.8 GR 4c "
DISPLAY " ------------------------------------------ "
DISPLAY " TEST0273 "
DISPLAY " Reference 5.8 General Rules )"
DISPLAY " - - - - - - - - - - - - - - - - - - - - - "
DISPLAY " "
DISPLAY " UPDATE WORKS"
DISPLAY " SET HOURS = NULL;"
DISPLAY " "
DISPLAY " SELECT SUM(HOURS),MAX(HOURS),MIN(HOURS)"
DISPLAY " INTO
- " :sum1:indic1,:max1:indic2,:min1:indic3"
DISPLAY " FROM WORKS;"
DISPLAY " "
MOVE 0 TO indic1
MOVE 0 TO indic2
MOVE 0 TO indic3
EXEC SQL UPDATE WORKS
SET HOURS = NULL END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL SELECT SUM (HOURS),MAX(HOURS),MIN(HOURS)
INTO :sum1:indic1,:max1:indic2,:min1:indic3
FROM WORKS END-EXEC
MOVE SQLCODE TO SQL-COD
MOVE indic1 TO DISP1
MOVE indic2 TO DISP2
MOVE indic3 TO DISP3
EXEC SQL ROLLBACK WORK END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " The correct answer is :"
DISPLAY " indic1 < 0"
DISPLAY " indic2 < 0"
DISPLAY " indic3 < 0"
DISPLAY " Your answer is :"
DISPLAY " indic1 = " , DISP1
DISPLAY " indic2 = " , DISP2
DISPLAY " indic3 = " , DISP3
if (indic1 < 0 AND indic2 < 0 AND indic3 < 0 ) then
DISPLAY " *** pass *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0273' ,'pass' ,'PCO' ) END-EXEC
MOVE SQLCODE TO SQL-COD
else
DISPLAY " dml061.pco *** fail *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0273' ,'fail' ,'PCO' ) END-EXEC
ADD 1 TO errcnt
MOVE SQLCODE TO SQL-COD
END-IF
DISPLAY "==============================================="
EXEC SQL COMMIT WORK END-EXEC
MOVE SQLCODE TO SQL-COD
******************** END TEST0273 *******************
******************** BEGIN TEST0277 *******************
*Computation with NULL value specification
DISPLAY " Computation with NULL value spec. "
DISPLAY "Reference X3.135-1989 section 5.6 GR "
DISPLAY " ------------------------------------------ "
DISPLAY " TEST0277 "
DISPLAY " Reference 5.6 General Rules )"
DISPLAY " - - - - - - - - - - - - - - - - - - - - - "
DISPLAY " "
DISPLAY " UPDATE WORKS"
DISPLAY " SET HOURS = NULL WHERE EMPNUM = 'E1';"
DISPLAY " "
DISPLAY " UPDATE WORKS"
DISPLAY " SET HOURS = :count1:indic1 - "
DISPLAY " (:count2:indic2 + :count3:indic3)"
DISPLAY " WHERE EMPNUM = 'E2';"
DISPLAY " "
DISPLAY " UPDATE WORKS"
DISPLAY " SET HOURS = :count2:indic2 / :count3:indic3 * "
DISPLAY " :count1:indic1"
DISPLAY " WHERE EMPNUM = 'E3';"
DISPLAY " "
DISPLAY " UPDATE WORKS"
DISPLAY " SET HOURS = HOURS + 5;"
DISPLAY " "
DISPLAY " SELECT COUNT(*) INTO :count4"
DISPLAY " FROM WORKS"
DISPLAY " WHERE HOURS IS NULL; "
DISPLAY " "
MOVE -1 TO indic1
MOVE 0 TO indic2
MOVE 0 TO indic3
MOVE 11 TO count1
MOVE 3 TO count2
MOVE -17 TO count3
MOVE -1 TO count4
EXEC SQL UPDATE WORKS
SET HOURS = NULL WHERE EMPNUM = 'E1' END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL UPDATE WORKS
SET HOURS = :count1:indic1 - (:count2:indic2 +
:count3:indic3)
WHERE EMPNUM = 'E2' END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL UPDATE WORKS
SET HOURS = :count2:indic2 / :count3:indic3 *
:count1:indic1
WHERE EMPNUM = 'E3' END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL UPDATE WORKS
SET HOURS = HOURS + 5 END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL SELECT COUNT (*) INTO :count4
FROM WORKS
WHERE HOURS IS NULL END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL ROLLBACK WORK END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " The correct answer is :"
DISPLAY " count4 = 9"
DISPLAY " Your answer is :"
DISPLAY " count4 = " , count4
if (count4 = 9 ) then
DISPLAY " *** pass *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0277' ,'pass' ,'PCO' ) END-EXEC
MOVE SQLCODE TO SQL-COD
else
DISPLAY " dml061.pco *** fail *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0277' ,'fail' ,'PCO' ) END-EXEC
ADD 1 TO errcnt
MOVE SQLCODE TO SQL-COD
END-IF
DISPLAY "==============================================="
EXEC SQL COMMIT WORK END-EXEC
MOVE SQLCODE TO SQL-COD
******************** END TEST0277 *******************
******************** BEGIN TEST0278 *******************
*IN value list with USER, literal, variable spec.
DISPLAY "IN value list with USER, literal, variable"
DISPLAY "Reference X3.135-1989 section 5.6 GR "
DISPLAY " ------------------------------------------ "
DISPLAY " TEST0278 "
DISPLAY " Reference 5.6 General Rules )"
DISPLAY " - - - - - - - - - - - - - - - - - - - - - "
DISPLAY " "
DISPLAY " "
DISPLAY " UPDATE STAFF"
DISPLAY " SET EMPNAME = 'HU'"
DISPLAY " WHERE EMPNAME = 'Ed';"
DISPLAY " "
DISPLAY " SELECT COUNT(*) INTO :count1"
DISPLAY " FROM STAFF"
DISPLAY " WHERE EMPNAME IN "
DISPLAY "
- " (USER,:EMPNA1:indic1,:EMPNA2:indic2,:EMPNA3); "
DISPLAY " "
MOVE -1 TO indic1
MOVE 0 TO indic2
MOVE -1 TO count1
MOVE "Alice" TO EMPNA1
MOVE "Betty" TO EMPNA2
MOVE "Carmen" TO EMPNA3
EXEC SQL UPDATE STAFF
SET EMPNAME = 'HU'
WHERE EMPNAME = 'Ed' END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL SELECT COUNT (*) INTO :count1
FROM STAFF
WHERE EMPNAME IN
(USER,:EMPNA1:indic1,:EMPNA2:indic2,:EMPNA3) END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY "SQLCODE = " , SQL-COD
EXEC SQL ROLLBACK WORK END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " The correct answer is :"
DISPLAY " count1 = 3"
DISPLAY " Your answer is :"
DISPLAY " count1 = " , count1
if (count1 = 3 ) then
DISPLAY " *** pass *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0278' ,'pass' ,'PCO' ) END-EXEC
MOVE SQLCODE TO SQL-COD
else
DISPLAY " dml061.pco *** fail *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0278' ,'fail' ,'PCO' ) END-EXEC
ADD 1 TO errcnt
MOVE SQLCODE TO SQL-COD
END-IF
DISPLAY "==============================================="
EXEC SQL COMMIT WORK END-EXEC
MOVE SQLCODE TO SQL-COD
******************** END TEST0278 *******************
**** TESTER MAY CHOOSE TO INSERT CODE FOR errcnt > 0
STOP RUN .
* **** Procedures for PERFORM statements
Messung V0.5 in Prozent C=92 H=100 G=95
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-08)
¤
*© Formatika GbR, Deutschland