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.001E1 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
¤ Dauer der Verarbeitung: 0.0 Sekunden
(vorverarbeitet)
¤
|
Haftungshinweis
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.
|