* Standard COBOL (file "DML106.SCO") calling SQL * procedures in file "DML106.MCO".
**************************************************************** * * COMMENT SECTION * * DATE 1993/08/20 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. * * DML106.SCO * WRITTEN BY: Joan Sullivan and David Flater * TRANSLATED AUTOMATICALLY FROM EMBEDDED COBOL BY CHRIS SCHANZLE * * This routine tests several FIPS features in Transitional * SQL. This is the non-dynamic version of DML107. * * REFERENCES * FIPS PUB 127-2 14.1 Transitional SQL * ANSI SQL-1992 * ****************************************************************
DISPLAY"CREATE VIEW UUSIG (U1) AS" DISPLAY" SELECT C1 FROM USIG UNION SELECT C_1 FROM USIG;" * EXEC SQL CREATE VIEW UUSIG (U1) AS * SELECT C1 FROM USIG UNION SELECT C_1 FROM USIG; CALL"SUB3"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD
COMPUTE int1 = -1 DISPLAY"SELECT COUNT(*) INTO :int1 FROM UUSIG;" * EXEC SQL SELECT COUNT(*) INTO :int1 FROM UUSIG; CALL"SUB5"USING SQLCODE SQLSTATE int1 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"int1 should be 4; its value is ", int1
if (int1 NOT = 4) then MOVE 0 TO flag END-IF
COMPUTE int1 = -1 DISPLAY"SELECT COUNT(DISTINCT U1) INTO :int1 FROM UUSIG;" * EXEC SQL SELECT COUNT(DISTINCT U1) INTO :int1 FROM UUSIG * ; CALL"SUB6"USING SQLCODE SQLSTATE int1 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"int1 should be 4; its value is ", int1
if (int1 NOT = 4) then MOVE 0 TO flag END-IF
COMPUTE int1 = -1 DISPLAY"SELECT COUNT(*) INTO :int1 FROM UUSIG WHERE U1 <
- " 0" DISPLAY" OR U1 > 3 OR U1 IS NULL;" * EXEC SQL SELECT COUNT(*) INTO :int1 FROM UUSIG WHERE U1 < 0 * OR U1 > 3 OR U1 IS NULL; CALL"SUB7"USING SQLCODE SQLSTATE int1 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"int1 should be 0; its value is ", int1
DISPLAY"DECLARE UNION1 CURSOR FOR" DISPLAY" SELECT * FROM ABOVE_AVERAGE ORDER BY COLUMN_1;" * EXEC SQL DECLARE UNION1 CURSOR FOR * SELECT * FROM ABOVE_AVERAGE ORDER BY COLUMN_1 END-EXEC
DISPLAY"OPEN UNION1;" * EXEC SQL OPEN UNION1; CALL"SUB11"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK DISPLAY" "
MOVE"xxx"TO ch3 COMPUTE int1 = -1 MOVE"xxxxxxxxxxxxxxx"TO ch15 DISPLAY"FETCH UNION1 INTO :ch3, :int1, :ch15; " * EXEC SQL FETCH UNION1 INTO :ch3, :int1, :ch15; CALL"SUB12"USING SQLCODE SQLSTATE ch3 int1 ch15 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"ch3 should be 'MAX'; its value is ", ch3 DISPLAY"int1 should be 30000; its value is ", int1 DISPLAY"ch15 should be 'Tampa'; its value is ", ch15 if (ch3 NOT = "MAX"OR int1 NOT = 30000 OR ch15 NOT = "Tampa ") then MOVE 0 TO flag END-IF
MOVE"xxx"TO ch3 COMPUTE int1 = -1 MOVE"xxxxxxxxxxxxxxx"TO ch15 DISPLAY"FETCH UNION1 INTO :ch3, :int1, :ch15; " * EXEC SQL FETCH UNION1 INTO :ch3, :int1, :ch15; CALL"SUB13"USING SQLCODE SQLSTATE ch3 int1 ch15 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"ch3 should be 'P2 '; its value is ", ch3 DISPLAY"int1 should be 30000; its value is ", int1 DISPLAY"ch15 should be 'Vienna'; its value is ", ch15 if (ch3 NOT = "P2 "OR int1 NOT = 30000 OR ch15 NOT = "Vienna ") then MOVE 0 TO flag END-IF
MOVE"xxx"TO ch3 COMPUTE int1 = -1 MOVE"xxxxxxxxxxxxxxx"TO ch15 DISPLAY"FETCH UNION1 INTO :ch3, :int1, :ch15; " * EXEC SQL FETCH UNION1 INTO :ch3, :int1, :ch15; CALL"SUB14"USING SQLCODE SQLSTATE ch3 int1 ch15 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"ch3 should be 'P3 '; its value is ", ch3 DISPLAY"int1 should be 30000; its value is ", int1 DISPLAY"ch15 should be 'Tampa'; its value is ", ch15 if (ch3 NOT = "P3 "OR int1 NOT = 30000 OR ch15 NOT = "Tampa ") then MOVE 0 TO flag END-IF
MOVE"xxx"TO ch3 COMPUTE int1 = -1 MOVE"xxxxxxxxxxxxxxx"TO ch15 DISPLAY"FETCH UNION1 INTO :ch3, :int1, :ch15; " * EXEC SQL FETCH UNION1 INTO :ch3, :int1, :ch15; CALL"SUB15"USING SQLCODE SQLSTATE ch3 int1 ch15 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"ch3 should be 'P6 '; its value is ", ch3 DISPLAY"int1 should be 50000; its value is ", int1 DISPLAY"ch15 should be 'Deale'; its value is ", ch15 if (ch3 NOT = "P6 "OR int1 NOT = 50000 OR ch15 NOT = "Deale ") then MOVE 0 TO flag END-IF
DISPLAY"FETCH UNION1 INTO :ch3, :int1, :ch15; " * EXEC SQL FETCH UNION1 INTO :ch3, :int1, :ch15; CALL"SUB16"USING SQLCODE SQLSTATE ch3 int1 ch15 MOVE SQLCODE TO SQL-COD DISPLAY"SQLCODE should be 100; its value is ", SQL-COD if (SQLCODE NOT = 100) then MOVE 0 TO flag END-IF
DISPLAY"DECLARE UNION2 CURSOR FOR" DISPLAY" SELECT EMPNUM, CITY FROM STAFF_DUP ORDER BY
- " CITY;" * EXEC SQL DECLARE UNION2 CURSOR FOR * SELECT EMPNUM, CITY FROM STAFF_DUP ORDER BY CITY END-EXEC
DISPLAY"OPEN UNION2;" * EXEC SQL OPEN UNION2; CALL"SUB20"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK DISPLAY" "
MOVE"xxx"TO ch3 MOVE"xxxxxxxxxxxxxxx"TO ch15 DISPLAY"FETCH UNION2 INTO :ch3, :ch15;" * EXEC SQL FETCH UNION2 INTO :ch3, :ch15; CALL"SUB21"USING SQLCODE SQLSTATE ch3 ch15 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"ch3 should be 'E5 '; its value is ", ch3 DISPLAY"ch15 should be 'Akron'; its value is ", ch15 if (ch3 NOT = "E5 "OR ch15 NOT = "Akron
- " ") then MOVE 0 TO flag END-IF
MOVE"xxx"TO ch3 MOVE"xxxxxxxxxxxxxxx"TO ch15 DISPLAY"FETCH UNION2 INTO :ch3, :ch15;" * EXEC SQL FETCH UNION2 INTO :ch3, :ch15; CALL"SUB22"USING SQLCODE SQLSTATE ch3 ch15 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"ch3 should be 'E5 '; its value is ", ch3 DISPLAY"ch15 should be 'Akron'; its value is ", ch15 if (ch3 NOT = "E5 "OR ch15 NOT = "Akron
- " ") then MOVE 0 TO flag END-IF
COMPUTE int1 = -1 DISPLAY"SELECT COUNT(*) INTO :int1 FROM STAFF_DUP;" * EXEC SQL SELECT COUNT(*) INTO :int1 FROM STAFF_DUP; CALL"SUB23"USING SQLCODE SQLSTATE int1 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"int1 should be 10; its value is ", int1
DISPLAY"CREATE VIEW FOUR_CITIES (C1, C2, C3) AS" DISPLAY" SELECT 'P', CITY, 666" DISPLAY" FROM HU.PROJ" DISPLAY" WHERE BUDGET <> 30000" DISPLAY" UNION" DISPLAY" SELECT 'S', CITY, 777" DISPLAY" FROM HU.STAFF" DISPLAY" WHERE EMPNAME <> 'Ed'" DISPLAY" UNION" DISPLAY" SELECT 'T', CITY, -999" DISPLAY" FROM HU.STAFF3" DISPLAY" WHERE CITY NOT LIKE 'V", DISPLAY" UNION" DISPLAY" SELECT 'X', CITY, -1" DISPLAY" FROM HU.STAFF3" DISPLAY" WHERE CITY = 'Vienna';" * EXEC SQL CREATE VIEW FOUR_CITIES (C1, C2, C3) AS * SELECT 'P', CITY, 666 * FROM HU.PROJ * WHERE BUDGET <> 30000 * UNION * SELECT 'S', CITY, 777 * FROM HU.STAFF * WHERE EMPNAME <> 'Ed' * UNION * SELECT 'T', CITY, -999 * FROM HU.STAFF3 * WHERE CITY NOT LIKE 'V%' * UNION * SELECT 'X', CITY, -1 * FROM HU.STAFF3 * WHERE CITY = 'Vienna'; CALL"SUB25"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD
DISPLAY"DECLARE UNION3 CURSOR FOR" DISPLAY" SELECT C2, C1, C3 FROM FOUR_CITIES ORDER BY C3,
- " C2;" * EXEC SQL DECLARE UNION3 CURSOR FOR * SELECT C2, C1, C3 FROM FOUR_CITIES ORDER BY C3, C2 * END-EXEC
DISPLAY"OPEN UNION3;" * EXEC SQL OPEN UNION3; CALL"SUB27"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK DISPLAY" "
MOVE"xxx"TO ch3 MOVE"xxxxxxxxxxxxxxx"TO ch15 DISPLAY"FETCH UNION3 INTO :ch15, :ch3, :int1;" * EXEC SQL FETCH UNION3 INTO :ch15, :ch3, :int1; CALL"SUB28"USING SQLCODE SQLSTATE ch15 ch3 int1 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"ch15 should be 'Akron'; its value is ", ch15 DISPLAY"ch3 should be 'T'; its value is ", ch3 DISPLAY"int1 should be -999; its value is ", int1 if (ch15 NOT = "Akron "OR ch3 NOT = "T
- " "OR int1 NOT = -999) then MOVE 0 TO flag END-IF
MOVE"xxx"TO ch3 MOVE"xxxxxxxxxxxxxxx"TO ch15 DISPLAY"FETCH UNION3 INTO :ch15, :ch3, :int1;" * EXEC SQL FETCH UNION3 INTO :ch15, :ch3, :int1; CALL"SUB29"USING SQLCODE SQLSTATE ch15 ch3 int1 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"ch15 should be 'Deale'; its value is ", ch15 DISPLAY"ch3 should be 'T'; its value is ", ch3 DISPLAY"int1 should be -999; its value is ", int1 if (ch15 NOT = "Deale "OR ch3 NOT = "T
- " "OR int1 NOT = -999) then MOVE 0 TO flag END-IF
MOVE"xxx"TO ch3 MOVE"xxxxxxxxxxxxxxx"TO ch15 DISPLAY"FETCH UNION3 INTO :ch15, :ch3, :int1;" * EXEC SQL FETCH UNION3 INTO :ch15, :ch3, :int1; CALL"SUB30"USING SQLCODE SQLSTATE ch15 ch3 int1 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"ch15 should be 'Vienna'; its value is ", ch15 DISPLAY"ch3 should be 'X'; its value is ", ch3 DISPLAY"int1 should be -1; its value is ", int1 if (ch15 NOT = "Vienna "OR ch3 NOT = "X
- " "OR int1 NOT = -1) then MOVE 0 TO flag END-IF
MOVE"xxx"TO ch3 MOVE"xxxxxxxxxxxxxxx"TO ch15 DISPLAY"FETCH UNION3 INTO :ch15, :ch3, :int1;" * EXEC SQL FETCH UNION3 INTO :ch15, :ch3, :int1; CALL"SUB31"USING SQLCODE SQLSTATE ch15 ch3 int1 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"ch15 should be 'Deale'; its value is ", ch15 DISPLAY"ch3 should be 'P'; its value is ", ch3 DISPLAY"int1 should be 666; its value is ", int1 if (ch15 NOT = "Deale "OR ch3 NOT = "P
- " "OR int1 NOT = 666) then MOVE 0 TO flag END-IF
MOVE"xxx"TO ch3 MOVE"xxxxxxxxxxxxxxx"TO ch15 DISPLAY"FETCH UNION3 INTO :ch15, :ch3, :int1;" * EXEC SQL FETCH UNION3 INTO :ch15, :ch3, :int1; CALL"SUB32"USING SQLCODE SQLSTATE ch15 ch3 int1 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"ch15 should be 'Vienna'; its value is ", ch15 DISPLAY"ch3 should be 'P'; its value is ", ch3 DISPLAY"int1 should be 666; its value is ", int1 if (ch15 NOT = "Vienna "OR ch3 NOT = "P
- " "OR int1 NOT = 666) then MOVE 0 TO flag END-IF
MOVE"xxx"TO ch3 MOVE"xxxxxxxxxxxxxxx"TO ch15 DISPLAY"FETCH UNION3 INTO :ch15, :ch3, :int1;" * EXEC SQL FETCH UNION3 INTO :ch15, :ch3, :int1; CALL"SUB33"USING SQLCODE SQLSTATE ch15 ch3 int1 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"ch15 should be 'Deale'; its value is ", ch15 DISPLAY"ch3 should be 'S'; its value is ", ch3 DISPLAY"int1 should be 777; its value is ", int1 if (ch15 NOT = "Deale "OR ch3 NOT = "S
- " "OR int1 NOT = 777) then MOVE 0 TO flag END-IF
MOVE"xxx"TO ch3 MOVE"xxxxxxxxxxxxxxx"TO ch15 DISPLAY"FETCH UNION3 INTO :ch15, :ch3, :int1;" * EXEC SQL FETCH UNION3 INTO :ch15, :ch3, :int1; CALL"SUB34"USING SQLCODE SQLSTATE ch15 ch3 int1 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"ch15 should be 'Vienna'; its value is ", ch15 DISPLAY"ch3 should be 'S'; its value is ", ch3 DISPLAY"int1 should be 777; its value is ", int1 if (ch15 NOT = "Vienna "OR ch3 NOT = "S
- " "OR int1 NOT = 777) then MOVE 0 TO flag END-IF
DISPLAY"FETCH UNION3 INTO :ch15, :ch3, :int1;" * EXEC SQL FETCH UNION3 INTO :ch15, :ch3, :int1; CALL"SUB35"USING SQLCODE SQLSTATE ch15 ch3 int1 MOVE SQLCODE TO SQL-COD DISPLAY"SQLCODE should be 100; its value is ", SQL-COD if (SQLCODE NOT = 100) then MOVE 0 TO flag END-IF
COMPUTE int1 = -1 DISPLAY"SELECT COUNT (*) INTO :int1 FROM FOUR_CITIES;" * EXEC SQL SELECT COUNT (*) INTO :int1 FROM FOUR_CITIES * ; CALL"SUB36"USING SQLCODE SQLSTATE int1 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"int1 should be 7; its value is ", int1
if (int1 NOT = 7) then MOVE 0 TO flag END-IF
COMPUTE int1 = -1 DISPLAY"SELECT COUNT(*) INTO :int1 FROM FOUR_CITIES WHERE
- " C3 > 0;" * EXEC SQL SELECT COUNT(*) INTO :int1 FROM FOUR_CITIES WHERE * C3 > 0; CALL"SUB37"USING SQLCODE SQLSTATE int1 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"int1 should be 4; its value is ", int1
if (int1 NOT = 4) then MOVE 0 TO flag END-IF
COMPUTE int1 = -1 DISPLAY"SELECT COUNT(*) INTO :int1 FROM FOUR_CITIES WHERE
- " C2 = 'Vienna';" * EXEC SQL SELECT COUNT(*) INTO :int1 FROM FOUR_CITIES WHERE * C2 = 'Vienna'; CALL"SUB38"USING SQLCODE SQLSTATE int1 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"int1 should be 3; its value is ", int1
* EXEC SQL COMMIT WORK; CALL"SUB50"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD ******************** END TEST0599 ******************** ******************** BEGIN TEST0601 ******************* MOVE 1 TO flag
DISPLAY"CREATE TABLE TEMPUS (TDATE DATE, TTIME TIME," DISPLAY" TTIMESTAMP TIMESTAMP, TINT1 INTERVAL YEAR TO
- " MONTH," DISPLAY" TINT2 INTERVAL DAY TO SECOND);" * EXEC SQL CREATE TABLE TEMPUS (TDATE DATE, TTIME * TIME, * TTIMESTAMP TIMESTAMP, TINT1 INTERVAL YEAR TO MONTH, * TINT2 INTERVAL DAY TO SECOND); CALL"SUB51"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD
DISPLAY"INSERT INTO TEMPUS VALUES (" DISPLAY" DATE '1993-08-24'," DISPLAY" TIME '16:03:00'," DISPLAY" TIMESTAMP '1993-08-24 16:03:00'," DISPLAY" INTERVAL -'1-6' YEAR TO MONTH," DISPLAY" INTERVAL '13 0:10' DAY TO SECOND);" * EXEC SQL INSERT INTO TEMPUS VALUES ( * DATE '1993-08-24', * TIME '16:03:00', * TIMESTAMP '1993-08-24 16:03:00', * INTERVAL -'1-6' YEAR TO MONTH, * INTERVAL '13 0:10' DAY TO SECOND); CALL"SUB53"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK DISPLAY" "
COMPUTE int1 = -1 DISPLAY"SELECT EXTRACT (DAY FROM TDATE)" DISPLAY" INTO :int1 FROM TEMPUS;" * EXEC SQL SELECT EXTRACT (DAY FROM TDATE) * INTO :int1 FROM TEMPUS; CALL"SUB54"USING SQLCODE SQLSTATE int1 MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK DISPLAY"int1 should be 24; its value is ", int1 if (int1 NOT = 24) then MOVE 0 TO flag END-IF
COMPUTE int1 = -1 DISPLAY"SELECT COUNT(*) INTO :int1 FROM TEMPUS" DISPLAY" WHERE (TTIMESTAMP - TIMESTAMP '1995-02-24
- " 16:03:00')" DISPLAY" YEAR TO MONTH = TINT1;" * EXEC SQL SELECT COUNT(*) INTO :int1 FROM TEMPUS * WHERE (TTIMESTAMP - TIMESTAMP '1995-02-24 16:03:00') * YEAR TO MONTH = TINT1; CALL"SUB55"USING SQLCODE SQLSTATE int1 MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK DISPLAY"int1 should be 1; its value is ", int1 if (int1 NOT = 1) then MOVE 0 TO flag END-IF
COMPUTE int1 = -1 DISPLAY"SELECT COUNT(*) INTO :int1 FROM TEMPUS" DISPLAY" WHERE (TTIMESTAMP, TINT1) OVERLAPS" DISPLAY" (TIMESTAMP '1995-02-24 16:03:00',
- " INTERVAL '1-6' YEAR TO MONTH);" * EXEC SQL SELECT COUNT(*) INTO :int1 FROM TEMPUS * WHERE (TTIMESTAMP, TINT1) OVERLAPS * (TIMESTAMP '1995-02-24 16:03:00', INTERVAL '1-6' * YEAR TO MONTH); CALL"SUB56"USING SQLCODE SQLSTATE int1 MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK DISPLAY"int1 should be 0; its value is ", int1 if (int1 NOT = 0) then MOVE 0 TO flag END-IF
* EXEC SQL COMMIT WORK; CALL"SUB62"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD ******************** END TEST0601 ******************** ******************** BEGIN TEST0611 ******************* MOVE 1 TO flag
*6.1 LR.1.a denies us the right to use <time precision> or *<timestamp precision> in the declaration. SR.25 says that *<time precision> defaults to 0 and <timestamp precision> *defaults to 6.
DISPLAY"CREATE TABLE TSFIPS (" DISPLAY" FIPS1 TIME," DISPLAY" FIPS2 TIMESTAMP," DISPLAY" FIPS3 INTERVAL YEAR (2) TO MONTH," DISPLAY" FIPS4 INTERVAL DAY (2) TO SECOND (6));" * EXEC SQL CREATE TABLE TSFIPS ( * FIPS1 TIME, * FIPS2 TIMESTAMP, * FIPS3 INTERVAL YEAR (2) TO MONTH, * FIPS4 INTERVAL DAY (2) TO SECOND (6)); CALL"SUB63"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD
DISPLAY"INSERT INTO TSFIPS VALUES (" DISPLAY" TIME '16:03:00'," DISPLAY" TIMESTAMP '1996-08-24 16:03:00.999999'," DISPLAY" INTERVAL -'99-6' YEAR (2) TO MONTH," DISPLAY" INTERVAL '99 0:10:00.999999' DAY (2) TO SECOND
- " (6));" * EXEC SQL INSERT INTO TSFIPS VALUES ( * TIME '16:03:00', * TIMESTAMP '1996-08-24 16:03:00.999999', * INTERVAL -'99-6' YEAR (2) TO MONTH, * INTERVAL '99 0:10:00.999999' DAY (2) TO SECOND (6)) * ; CALL"SUB65"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK DISPLAY" "
COMPUTE int1 = -1 DISPLAY"SELECT EXTRACT (SECOND FROM FIPS2)" DISPLAY" * 1000000 - 999990 INTO :int1 FROM TSFIPS;" * EXEC SQL SELECT EXTRACT (SECOND FROM FIPS2) * * 1000000 - 999990 INTO :int1 FROM TSFIPS; CALL"SUB66"USING SQLCODE SQLSTATE int1 MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK DISPLAY"int1 should be 9; its value is ", int1 if (int1 NOT = 9) then MOVE 0 TO flag END-IF
COMPUTE int1 = -1 COMPUTE int2 = -1 DISPLAY"SELECT EXTRACT (YEAR FROM FIPS3)," DISPLAY" EXTRACT (MONTH FROM FIPS3) INTO :int1, :int2" DISPLAY" FROM TSFIPS;" * EXEC SQL SELECT EXTRACT (YEAR FROM FIPS3), * EXTRACT (MONTH FROM FIPS3) INTO :int1, :int2 * FROM TSFIPS; CALL"SUB67"USING SQLCODE SQLSTATE int1 int2 MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK DISPLAY"int1 should be -99; its value is ", int1 DISPLAY"int2 should be -6; its value is ", int2 DISPLAY"Note: The sign is specified by Subclause 6.6
- " GR.3.a.i" DISPLAY" in ANSI SQL-1992." if (int1 NOT = -99 OR int2 NOT = -6) then MOVE 0 TO flag END-IF
COMPUTE int1 = -1 COMPUTE int2 = -1 DISPLAY"SELECT EXTRACT (DAY FROM FIPS4)," DISPLAY" EXTRACT (SECOND FROM FIPS4) * 1000000 - 999990" DISPLAY" INTO :int1, :int2 FROM TSFIPS;" * EXEC SQL SELECT EXTRACT (DAY FROM FIPS4), * EXTRACT (SECOND FROM FIPS4) * 1000000 - 999990 * INTO :int1, :int2 FROM TSFIPS; CALL"SUB68"USING SQLCODE SQLSTATE int1 int2 MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK DISPLAY"int1 should be 99; its value is ", int1 DISPLAY"int2 should be 9; its value is ", int2 if (int1 NOT = 99 OR int2 NOT = 9) then MOVE 0 TO flag END-IF
* EXEC SQL COMMIT WORK; CALL"SUB74"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD ******************** END TEST0611 ******************** ******************** BEGIN TEST0613 ******************* MOVE 1 TO flag
DISPLAY"INSERT INTO TSSMALL VALUES (" DISPLAY" CURRENT_DATE, CURRENT_TIME, " DISPLAY"CURRENT_TIMESTAMP);"
* EXEC SQL INSERT INTO TSSMALL VALUES ( * CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP); CALL"SUB77"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK DISPLAY" "
DISPLAY"SELECT COUNT(*) INTO :int1" DISPLAY"FROM TSSMALL WHERE" DISPLAY"EXTRACT (YEAR FROM SMALLD) = EXTRACT (YEAR FROM
- " SMALLTS);"
COMPUTE int1 = -1 * EXEC SQL SELECT COUNT(*) INTO :int1 * FROM TSSMALL WHERE * EXTRACT (YEAR FROM SMALLD) = EXTRACT (YEAR FROM SMALLTS) * ; CALL"SUB78"USING SQLCODE SQLSTATE int1 MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK DISPLAY"int1 should be 1; its value is ", int1 if (int1 NOT = 1) then MOVE 0 TO flag END-IF
DISPLAY"SELECT COUNT(*) INTO :int1" DISPLAY"FROM TSSMALL WHERE" DISPLAY"EXTRACT (MONTH FROM SMALLD) = EXTRACT (MONTH FROM
- " SMALLTS);"
COMPUTE int1 = -1 * EXEC SQL SELECT COUNT(*) INTO :int1 * FROM TSSMALL WHERE * EXTRACT (MONTH FROM SMALLD) = EXTRACT (MONTH FROM * SMALLTS); CALL"SUB79"USING SQLCODE SQLSTATE int1 MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK DISPLAY"int1 should be 1; its value is ", int1 if (int1 NOT = 1) then MOVE 0 TO flag END-IF
DISPLAY"SELECT COUNT(*) INTO :int1" DISPLAY"FROM TSSMALL WHERE" DISPLAY"EXTRACT (DAY FROM SMALLD) = EXTRACT (DAY FROM
- " SMALLTS);"
COMPUTE int1 = -1 * EXEC SQL SELECT COUNT(*) INTO :int1 * FROM TSSMALL WHERE * EXTRACT (DAY FROM SMALLD) = EXTRACT (DAY FROM SMALLTS) * ; CALL"SUB80"USING SQLCODE SQLSTATE int1 MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK DISPLAY"int1 should be 1; its value is ", int1 if (int1 NOT = 1) then MOVE 0 TO flag END-IF
DISPLAY"SELECT COUNT(*) INTO :int1" DISPLAY"FROM TSSMALL WHERE" DISPLAY"EXTRACT (HOUR FROM SMALLT) = EXTRACT (HOUR FROM
- " SMALLTS);"
COMPUTE int1 = -1 * EXEC SQL SELECT COUNT(*) INTO :int1 * FROM TSSMALL WHERE * EXTRACT (HOUR FROM SMALLT) = EXTRACT (HOUR FROM SMALLTS) * ; CALL"SUB81"USING SQLCODE SQLSTATE int1 MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK DISPLAY"int1 should be 1; its value is ", int1 if (int1 NOT = 1) then MOVE 0 TO flag END-IF
DISPLAY"SELECT COUNT(*) INTO :int1" DISPLAY"FROM TSSMALL WHERE" DISPLAY"EXTRACT (MINUTE FROM SMALLT) = EXTRACT (MINUTE
- " FROM SMALLTS);"
COMPUTE int1 = -1 * EXEC SQL SELECT COUNT(*) INTO :int1 * FROM TSSMALL WHERE * EXTRACT (MINUTE FROM SMALLT) = EXTRACT (MINUTE FROM * SMALLTS); CALL"SUB82"USING SQLCODE SQLSTATE int1 MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK DISPLAY"int1 should be 1; its value is ", int1 if (int1 NOT = 1) then MOVE 0 TO flag END-IF
*Time and timestamp have different fractional seconds precision *and we can't assume truncation or rounding.
COMPUTE int1 = -1 DISPLAY"SELECT COUNT(*) INTO :int1" DISPLAY"FROM TSSMALL WHERE" DISPLAY"EXTRACT (SECOND FROM SMALLT) -" DISPLAY"EXTRACT (SECOND FROM SMALLTS) > -1" DISPLAY"AND EXTRACT (SECOND FROM SMALLT) -" DISPLAY"EXTRACT (SECOND FROM SMALLTS) < 1;" * EXEC SQL SELECT COUNT(*) INTO :int1 * FROM TSSMALL WHERE * EXTRACT (SECOND FROM SMALLT) - * EXTRACT (SECOND FROM SMALLTS) > -1 * AND EXTRACT (SECOND FROM SMALLT) - * EXTRACT (SECOND FROM SMALLTS) < 1; CALL"SUB83"USING SQLCODE SQLSTATE int1 MOVE SQLCODE TO SQL-COD PERFORM CHCKOK DISPLAY"int1 should be 1; its value is ", int1 if (int1 NOT = 1) then MOVE 0 TO flag END-IF
* EXEC SQL COMMIT WORK; CALL"SUB89"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD ******************** END TEST0613 ******************** ******************** BEGIN TEST0615 ******************* MOVE 1 TO flag
*If this test is rejected at compile time for some reason which *resembles the desired SQLSTATEs, you win.
*Datetime field overflow = 22008: add a one-year interval to * YEAR 9999 datetime (6.14 GR.3.c) *Interval field overflow = 22015: insert interval with too * many digits in leading field (9.2 GR.3.m) *Invalid datetime format = 22007: cast February 30 to datetime * (COR1 for 6.10 GR 9.a.ii, 10.a.ii, 11.a.ii)
DISPLAY"CREATE TABLE TSERR (" DISPLAY" BADINT INTERVAL YEAR (2) TO MONTH," DISPLAY" BADDATE DATE);"
* EXEC SQL CREATE TABLE TSERR ( * BADINT INTERVAL YEAR (2) TO MONTH, * BADDATE DATE); CALL"SUB90"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD
* NOTICE *The Standard is very clear on the fact that the YEAR *field can't accept values below 1 or above 9999 in *datetime items (see Table 10 and 6.14 GR.3.c). *However, since it seems to us that a reasonable *human being might want to implement YEAR with a *small integer and permit the larger range to be used, *you may replace the 9999 in the date literal below *with as large an integer as you require to generate *the specified error condition. This offer is null *and void if the range limitation on YEAR is upheld by *an official interpretation.
*DML106 TEd Hook #1
DISPLAY"INSERT INTO TSERR VALUES (" DISPLAY" INTERVAL '0-11' YEAR TO MONTH," DISPLAY" DATE '9999-01-01' + INTERVAL '1-00' YEAR TO
- " MONTH);"
* EXEC SQL INSERT INTO TSERR VALUES ( * INTERVAL '0-11' YEAR TO MONTH, * DATE '9999-01-01' + INTERVAL '1-00' YEAR TO MONTH) * ; CALL"SUB92"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD
*DML106 TEd Hook #2
DISPLAY"SQLCODE should be < 0; its value is ", SQL-COD if (SQLCODE NOT < 0) then MOVE 0 TO flag END-IF
DISPLAY"SQLSTATE should be 22008; its value is ", SQLSTATE if (SQLSTATE NOT = "22008") then MOVE 0 TO flag END-IF
DISPLAY"INSERT INTO TSERR VALUES (" DISPLAY" INTERVAL '9999-11' YEAR TO MONTH," DISPLAY" DATE '1984-01-01');"
* EXEC SQL INSERT INTO TSERR VALUES ( * INTERVAL '9999-11' YEAR TO MONTH, * DATE '1984-01-01'); CALL"SUB93"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD
*DML106 TEd Hook #3
DISPLAY"SQLCODE should be < 0; its value is ", SQL-COD if (SQLCODE NOT < 0) then MOVE 0 TO flag END-IF
DISPLAY"SQLSTATE should be 22015; its value is ", SQLSTATE if (SQLSTATE NOT = "22015") then MOVE 0 TO flag END-IF
DISPLAY"INSERT INTO TSERR VALUES (" DISPLAY" INTERVAL '1-11' YEAR TO MONTH," DISPLAY" CAST ('DATE ''1993-02-30''' AS DATE));"
* EXEC SQL INSERT INTO TSERR VALUES ( * INTERVAL '1-11' YEAR TO MONTH, * CAST ('DATE ''1993-02-30''' AS DATE)); CALL"SUB94"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD
DISPLAY"SQLCODE should be < 0; its value is ", SQL-COD if (SQLCODE NOT < 0) then MOVE 0 TO flag END-IF
DISPLAY"SQLSTATE should be 22007; its value is ", SQLSTATE if (SQLSTATE NOT = "22007") then MOVE 0 TO flag END-IF
*The above could be passed for the wrong reason if the uglified *syntax is not supported. Repeat with shorter syntax.
DISPLAY"INSERT INTO TSERR VALUES (" DISPLAY" INTERVAL '1-11' YEAR TO MONTH," DISPLAY" CAST ('1993-02-30' AS DATE));"
* EXEC SQL INSERT INTO TSERR VALUES ( * INTERVAL '1-11' YEAR TO MONTH, * CAST ('1993-02-30' AS DATE)); CALL"SUB95"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD
DISPLAY"SQLCODE should be < 0; its value is ", SQL-COD if (SQLCODE NOT < 0) then MOVE 0 TO flag END-IF
DISPLAY"SQLSTATE should be 22007; its value is ", SQLSTATE if (SQLSTATE NOT = "22007") then MOVE 0 TO flag END-IF
* EXEC SQL COMMIT WORK; CALL"SUB101"USING SQLCODE SQLSTATE MOVE SQLCODE TO SQL-COD ******************** END TEST0615 ******************** **** TESTER MAY CHOOSE TO INSERT CODE FOR errcnt > 0 STOPRUN.
* **** Procedures for PERFORM statements
*Test SQLCODE and SQLSTATE for normal completion.
CHCKOK. DISPLAY"SQLCODE should be 0; its value is ", SQL-COD DISPLAY"SQLSTATE should be 00000; its value is ", SQLSTATE PERFORM NOSUBCLASS THRU EXIT-NOSUBCLASS if (SQLCODE NOT = 0 OR NORMSQ NOT = "00000") then MOVE 0 TO flag END-IF if (NORMSQ = "00000"AND NORMSQ NOT = SQLSTATE) then DISPLAY"Valid implementation-defined SQLSTATE accepted." END-IF
.
NOSUBCLASS.
*This routine replaces valid implementation-defined *subclasses with 000. This replacement equates valid *implementation-defined subclasses with the 000 value *expected by the test case; otherwise the test will fail. *After calling NOSUBCLASS, NORMSQ will be tested * SQLSTATE will be printed.
MOVE SQLSTATE TO NORMSQ
MOVE 3 TO norm1 *subclass begins in position 3 of char array NORMSQ *valid subclass begins with 5-9, I-Z, end of ALPNUM table PERFORMVARYING norm2 FROM 14 BY 1 UNTIL norm2 > 36 if (NORMSQX(norm1) = ALPNUM(norm2)) then MOVE"0"TO NORMSQX(norm1) END-IF END-PERFORM
*Quit if NORMSQ is unchanged. Subclass is not impl.-def. *Changed NORMSQ means implementation-defined subclass, *so proceed to zero it out, if valid (0-9,A-Z) if (NORMSQ = SQLSTATE) then GOTO EXIT-NOSUBCLASS END-IF
MOVE 4 TO norm1 *examining position 4 of char array NORMSQ *valid characters are 0-9, A-Z PERFORMVARYING norm2 FROM 1 BY 1 UNTIL norm2 > 36 if (NORMSQX(norm1) = ALPNUM(norm2)) then MOVE"0"TO NORMSQX(norm1) END-IF END-PERFORM
MOVE 5 TO norm1 *valid characters are 0-9, A-Z *examining position 5 of char array NORMSQ PERFORMVARYING norm2 FROM 1 BY 1 UNTIL norm2 > 36 if (NORMSQX(norm1) = ALPNUM(norm2)) then MOVE"0"TO NORMSQX(norm1) END-IF END-PERFORM
*implementation-defined subclasses are allowed for warnings *(class = 01). These equate to successful completion *SQLSTATE values of 00000. *Reference SQL-92 4.28 SQL-transactions, paragraph 2
if (NORMSQX(1) = "0"AND NORMSQX(2) = "1") then MOVE"0"TO NORMSQX(2) END-IF
.
EXIT-NOSUBCLASS. EXIT.
¤ Dauer der Verarbeitung: 0.45 Sekunden
(vorverarbeitet)
¤
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.