IDENTIFICATION DIVISION.
PROGRAM-ID. DML060.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. xyz.
OBJECT-COMPUTER. xyz.
DATA DIVISION.
WORKING-STORAGE SECTION.
* EMBEDDED COBOL (file "DML060.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.
*
* DML060.PCO
* WRITTEN BY: SUN DAJUN
* TRANSLATED AUTOMATICALLY FROM EMBEDDED C BY CHRIS SCHANZLE
*
* THIS ROUTINE TESTS THE SET FUNCTION SPECIFICATION IN
* COMMON ELEMENTS OF THE SQL LANGUAGE.
*
* REFERENCES
* AMERICAN NATIONAL STANDARD database language - SQL
* X3.135-1989
*
* SECTION 5.21 <where clause>
* SECTION 5.9 <value expression>
*
****************************************************************
EXEC SQL BEGIN DECLARE SECTION END-EXEC
01 int1 PIC S9(9) DISPLAY SIGN LEADING SEPARATE.
01 int2 PIC S9(9) DISPLAY SIGN LEADING SEPARATE.
01 int3 PIC S9(9) DISPLAY SIGN LEADING SEPARATE.
01 EMPNO1 PIC X(3).
01 PNO1 PIC X(3).
01 PNO2 PIC X(3).
01 HOURS1 PIC S9(9) DISPLAY SIGN LEADING SEPARATE.
01 ii PIC S9(9) DISPLAY SIGN LEADING SEPARATE.
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 SQL-COD PIC S9(9) 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, dml060.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 TEST0261 *******************
DISPLAY " Computation in Where Clause "
DISPLAY "Reference X3.135-1989 section 5.9 General Rules "
DISPLAY " ------------------------------------------ "
DISPLAY " TEST0261 "
DISPLAY " Reference 5.9 General Rules )"
DISPLAY " - - - - - - - - - - - - - - - - - - - - - "
DISPLAY " "
DISPLAY " DECLARE SUN CURSOR "
DISPLAY " FOR SELECT COL1, COL2"
DISPLAY " FROM VTABLE"
DISPLAY " WHERE (:int3 * (COL3 - COL2)) BETWEEN 5
- " AND 200"
DISPLAY " ORDER BY COL1;"
DISPLAY " "
MOVE 2 TO int3
EXEC SQL DECLARE SUN CURSOR
FOR SELECT COL1, COL2
FROM VTABLE
WHERE (:int3 * (COL3 - COL2)) BETWEEN 5 AND 200
ORDER BY COL1 END-EXEC
EXEC SQL OPEN SUN END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " The correct answer is :"
DISPLAY " 10, 20"
DISPLAY " 100, 200"
DISPLAY " Your answer is :"
MOVE 0 TO flag
EXEC SQL FETCH SUN INTO :int1,:int2 END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " ", int1 ", ", int2
if (int1 = 10 AND int2 = 20) then
MOVE flag TO flag
else
MOVE 1 TO flag
END-IF
EXEC SQL FETCH SUN INTO :int1,:int2 END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " ", int1 ", ", int2
if (int1 = 100 AND int2 = 200) then
MOVE flag TO flag
else
MOVE 1 TO flag
END-IF
EXEC SQL CLOSE SUN END-EXEC
MOVE SQLCODE TO SQL-COD
if (flag = 0) then
DISPLAY " *** pass *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0261','pass','PCO') END-EXEC
MOVE SQLCODE TO SQL-COD
else
DISPLAY " dml060.pco *** fail *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0261','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 TEST0261 *******************
******************** BEGIN TEST0262 *******************
DISPLAY " Computation in Where Clause "
DISPLAY "Reference X3.135-1989 section 5.9 General Rules "
DISPLAY " ------------------------------------------ "
DISPLAY " TEST0262 "
DISPLAY " Reference 5.9 General Rules )"
DISPLAY " - - - - - - - - - - - - - - - - - - - - - "
DISPLAY " "
DISPLAY " "
DISPLAY " UPDATE VTABLE"
DISPLAY " SET COL1 = 1"
DISPLAY " WHERE COL1 = 0;"
DISPLAY " "
DISPLAY " DECLARE SUN1 CURSOR "
DISPLAY " FOR SELECT COL1, COL2"
DISPLAY " FROM VTABLE"
DISPLAY " WHERE (COL3 * COL2 / COL1) > ALL"
DISPLAY " (SELECT HOURS FROM WORKS)"
DISPLAY " OR -(COL3 * COL2 /COL1) >
- " ANY"
DISPLAY " (SELECT HOURS FROM WORKS)"
DISPLAY " ORDER BY COL1;"
DISPLAY " "
EXEC SQL UPDATE VTABLE
SET COL1 = 1
WHERE COL1 = 0 END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL DECLARE SUN1 CURSOR
FOR SELECT COL1, COL2
FROM VTABLE
WHERE (COL3 * COL2 / COL1) > ALL
(SELECT HOURS FROM WORKS)
OR -(COL3 * COL2 /COL1) > ANY
(SELECT HOURS FROM WORKS)
ORDER BY COL1 END-EXEC
EXEC SQL OPEN SUN1 END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " The correct answer is :"
DISPLAY " 100, 200"
DISPLAY " 1000, -2000"
DISPLAY " Your answer is :"
MOVE 0 TO flag
EXEC SQL FETCH SUN1 INTO :int1,:int2 END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " ", int1 ", ", int2
if (int1 = 100 AND int2 = 200) then
MOVE flag TO flag
else
MOVE 1 TO flag
END-IF
EXEC SQL FETCH SUN1 INTO :int1,:int2 END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " ", int1 ", ", int2
if (int1 = 1000 AND int2 = -2000) then
MOVE flag TO flag
else
MOVE 1 TO flag
END-IF
EXEC SQL CLOSE SUN1 END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL ROLLBACK WORK END-EXEC
MOVE SQLCODE TO SQL-COD
if (flag = 0) then
DISPLAY " *** pass *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0262','pass','PCO') END-EXEC
MOVE SQLCODE TO SQL-COD
else
DISPLAY " dml060.pco *** fail *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0262','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 TEST0262 *******************
******************** BEGIN TEST0263 *******************
DISPLAY " Computation in ORDER BY "
DISPLAY "Reference X3.135-1989 section 5.9 General Rules "
DISPLAY " ------------------------------------------ "
DISPLAY " TEST0263 "
DISPLAY " Reference 5.9 General Rules )"
DISPLAY " - - - - - - - - - - - - - - - - - - - - - "
DISPLAY " "
DISPLAY " FOR SELECT COL1, COL3 * COL2 /COL1 -
- " COL2 + 10"
DISPLAY " FROM VTABLE"
DISPLAY " WHERE COL1 > 0"
DISPLAY " ORDER BY 2;"
DISPLAY " "
EXEC SQL DECLARE SUN2 CURSOR
FOR SELECT COL1, (COL3 * COL2 /COL1 - COL2 + 10)
FROM VTABLE
WHERE COL1 > 0
ORDER BY 2 END-EXEC
EXEC SQL OPEN SUN2 END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " The correct answer is :"
DISPLAY " 1000, -3990"
DISPLAY " 10, 50"
DISPLAY " 100, 410"
DISPLAY " Your answer is :"
MOVE 0 TO flag
EXEC SQL FETCH SUN2 INTO :int1,:int2 END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " ", int1 ", ", int2
if (int1 = 1000 AND int2 = -3990) then
MOVE flag TO flag
else
MOVE 1 TO flag
END-IF
EXEC SQL FETCH SUN2 INTO :int1,:int2 END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " ", int1 ", ", int2
if (int1 = 10 AND int2 = 50) then
MOVE flag TO flag
else
MOVE 1 TO flag
END-IF
EXEC SQL FETCH SUN2 INTO :int1,:int2 END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " ", int1 ", ", int2
if (int1 = 100 AND int2 = 410) then
MOVE flag TO flag
else
MOVE 1 TO flag
END-IF
EXEC SQL CLOSE SUN2 END-EXEC
MOVE SQLCODE TO SQL-COD
if (flag = 0) then
DISPLAY " *** pass *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0263','pass','PCO') END-EXEC
MOVE SQLCODE TO SQL-COD
else
DISPLAY " dml060.pco *** fail *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0263','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 TEST0263 *******************
******************** BEGIN TEST0265 *******************
DISPLAY " TEST0265 "
DISPLAY " update: positioned -- view with check option"
DISPLAY "reference X3.135-1989 section 6.6 General Rules 2)"
DISPLAY " - - - - - - - - - - - - - - - - - - -"
MOVE 0 TO i
*EXEC SQL CREATE VIEW SUBSP (EMPNUM,PNUM,HOURS)
* AS SELECT EMPNUM,PNUM,HOURS
* FROM WORKS
* WHERE EMPNUM='E3'
* WITH CHECK OPTION;
DISPLAY " "
DISPLAY " INSERT INTO WORKS"
DISPLAY " VALUES ('E3','P4',50);"
DISPLAY " "
DISPLAY " DECLARE DIPER CURSOR"
DISPLAY " FOR SELECT EMPNUM,PNUM,HOURS"
DISPLAY " FROM SUBSP;"
DISPLAY " "
DISPLAY " UPDATE SUBSP"
DISPLAY " SET EMPNUM='E9'"
DISPLAY " WHERE CURRENT OF DIPER;"
DISPLAY " "
EXEC SQL INSERT INTO WORKS
VALUES ('E3','P4',50) END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL DECLARE DIPER CURSOR
FOR SELECT EMPNUM,PNUM,HOURS
FROM SUBSP END-EXEC
* FOR UPDATE OF EMPNUM;
EXEC SQL OPEN DIPER END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL FETCH DIPER INTO :EMPNO1,:PNO1,:HOURS1 END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " EMPNO1=", EMPNO1 ", PNO1=", PNO1 " and HOURS1=",
HOURS1 " "
EXEC SQL UPDATE SUBSP
SET EMPNUM='E9'
WHERE CURRENT OF DIPER END-EXEC
MOVE SQLCODE TO SQL-COD
MOVE SQLCODE TO i
EXEC SQL CLOSE DIPER END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL ROLLBACK WORK END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY "The answer should be: i < 0 "
DISPLAY " Your answer is :"
DISPLAY " i = ", i " "
if (i < 0) then
DISPLAY " *** pass *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0265','pass','PCO') END-EXEC
MOVE SQLCODE TO SQL-COD
else
DISPLAY " dml060.pco *** fail *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0265','fail','PCO') END-EXEC
ADD 1 TO errcnt
MOVE SQLCODE TO SQL-COD
END-IF
DISPLAY "==================================================="
DISPLAY " "
EXEC SQL COMMIT WORK END-EXEC
MOVE SQLCODE TO SQL-COD
******************** END TEST0265 *******************
******************** BEGIN TEST0266 *******************
DISPLAY " TEST0266 "
DISPLAY " update: positioned -- UNIQUE violation under view
- " "
DISPLAY "reference X3.135-1989 section 8.11 General Rules 5)"
DISPLAY " - - - - - - - - - - - - - - - - - - -"
MOVE 0 TO i
*EXEC SQL CREATE VIEW SUBSP (EMPNUM,PNUM,HOURS)
* AS SELECT EMPNUM,PNUM,HOURS
* FROM WORKS
* WHERE EMPNUM='E3'
* WITH CHECK OPTION;
DISPLAY " "
DISPLAY " INSERT INTO WORKS"
DISPLAY " VALUES ('E3','P4',50);"
DISPLAY " "
DISPLAY " DECLARE DOVE CURSOR"
DISPLAY " FOR SELECT EMPNUM,PNUM,HOURS"
DISPLAY " FROM SUBSP;"
DISPLAY " "
DISPLAY " UPDATE SUBSP"
DISPLAY " SET PNUM='P6'"
DISPLAY " WHERE CURRENT OF DOVE;"
DISPLAY " "
EXEC SQL INSERT INTO WORKS
VALUES ('E3','P4',50) END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL DECLARE DOVE CURSOR
FOR SELECT EMPNUM,PNUM,HOURS
FROM SUBSP END-EXEC
* FOR UPDATE OF PNUM;
EXEC SQL OPEN DOVE END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL FETCH DOVE INTO :EMPNO1,:PNO1,:HOURS1 END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " EMPNO1=", EMPNO1 ", PNO1=", PNO1 " and HOURS1=",
HOURS1 " "
EXEC SQL UPDATE SUBSP
SET PNUM='P6'
WHERE CURRENT OF DOVE END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL FETCH DOVE INTO :EMPNO1,:PNO1,:HOURS1 END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " EMPNO1=", EMPNO1 ", PNO1=", PNO1 " and HOURS1=",
HOURS1 " "
EXEC SQL UPDATE SUBSP
SET PNUM='P6'
WHERE CURRENT OF DOVE END-EXEC
MOVE SQLCODE TO SQL-COD
MOVE SQLCODE TO i
EXEC SQL CLOSE DOVE END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL ROLLBACK WORK END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY "The answer should be: i < 0" " "
DISPLAY " Your answer is :"
DISPLAY " i = ", i " "
if (i < 0) then
DISPLAY " *** pass *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0266','pass','PCO') END-EXEC
MOVE SQLCODE TO SQL-COD
else
DISPLAY " dml060.pco *** fail *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0266','fail','PCO') END-EXEC
ADD 1 TO errcnt
MOVE SQLCODE TO SQL-COD
END-IF
DISPLAY "==================================================="
DISPLAY " "
EXEC SQL COMMIT WORK END-EXEC
MOVE SQLCODE TO SQL-COD
******************** END TEST0266 *******************
******************** BEGIN TEST0267 *******************
DISPLAY " Update compound key, interim uniqueness conflict"
DISPLAY "Reference X3.135-1989 sections 6.6 GR2 and 8.12 GR2
- " "
DISPLAY " ------------------------------------------ "
DISPLAY " TEST0267 "
DISPLAY " Reference 5.9 General Rules )"
DISPLAY " - - - - - - - - - - - - - - - - - - - - - "
DISPLAY " UPDATE WORKS1"
DISPLAY " SET PNUM = EMPNUM, EMPNUM = PNUM;"
EXEC SQL DECLARE PANDA CURSOR
FOR SELECT DISTINCT PX.PNUM,PY.PNUM
FROM WORKS PX, WORKS PY
ORDER BY 2 DESC END-EXEC
EXEC SQL DELETE FROM WORKS1 END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL OPEN PANDA END-EXEC
MOVE SQLCODE TO SQL-COD
MOVE 1 TO ii
PERFORM P50 UNTIL ii > 36
EXEC SQL CLOSE PANDA END-EXEC
MOVE SQLCODE TO SQL-COD
COMPUTE i = -1
EXEC SQL UPDATE WORKS1
SET PNUM = EMPNUM, EMPNUM = PNUM END-EXEC
MOVE SQLCODE TO SQL-COD
MOVE SQLCODE TO i
MOVE 0 TO HOURS1
EXEC SQL SELECT COUNT(*)
INTO :HOURS1 FROM WORKS1
WHERE EMPNUM = 'P1' AND HOURS > 30 END-EXEC
MOVE SQLCODE TO SQL-COD
DISPLAY " The correct answer is :"
DISPLAY " i = 0"
DISPLAY " count1 = 6"
DISPLAY " Your answer is :"
DISPLAY " i = ", i
DISPLAY " count1 = ", HOURS1
EXEC SQL CLOSE PANDA END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL ROLLBACK WORK END-EXEC
MOVE SQLCODE TO SQL-COD
if (i = 0 AND HOURS1 = 6) then
DISPLAY " *** pass *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0267','pass','PCO') END-EXEC
MOVE SQLCODE TO SQL-COD
else
DISPLAY " dml060.pco *** fail *** "
EXEC SQL INSERT INTO TESTREPORT
VALUES('0267','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 TEST0267 *******************
**** TESTER MAY CHOOSE TO INSERT CODE FOR errcnt > 0
STOP RUN.
* **** Procedures for PERFORM statements
P50.
EXEC SQL FETCH PANDA INTO :PNO1,:PNO2 END-EXEC
MOVE SQLCODE TO SQL-COD
EXEC SQL INSERT INTO WORKS1
VALUES(:PNO1,:PNO2,:ii) END-EXEC
MOVE SQLCODE TO SQL-COD
ADD 1 TO ii
.
¤ Dauer der Verarbeitung: 0.14 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.
|