IDENTIFICATION DIVISION.
PROGRAM-ID. DML112.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. xyz.
OBJECT-COMPUTER. xyz.
DATA DIVISION.
WORKING-STORAGE SECTION.
* Standard COBOL (file "DML112.SCO") calling SQL
* procedures in file "DML112.MCO".
****************************************************************
*
* COMMENT SECTION
*
* DATE 1993/11/10 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.
*
* DML112.SCO
* WRITTEN BY: David W. Flater
* TRANSLATED AUTOMATICALLY FROM EMBEDDED COBOL BY CHRIS SCHANZLE
*
* This routine tests NULLs with DATETIME data types and in
* outer joins, datetimes in a <default clause>, TRIM, and also
* some schema manipulation statements.
* This is the non-dynamic version of DML113.PC.
*
* REFERENCES
* FIPS PUB 127-2 14.1 Transitional SQL
* ANSI SQL-1992
*
****************************************************************
* EXEC SQL BEGIN DECLARE SECTION END-EXEC
01 SQLCODE PIC S9(9) COMP.
01 SQLSTATE PIC X(5).
01 uid PIC X(18).
01 uidx PIC X(18).
01 int1 PIC S9(9) DISPLAY SIGN LEADING SEPARATE.
01 int2 PIC S9(9) DISPLAY SIGN LEADING SEPARATE.
01 indic1 PIC S9(4) DISPLAY SIGN LEADING SEPARATE.
01 chx PIC X(1).
01 ch3 PIC X(2).
01 ch9 PIC X(9).
01 ch10 PIC X(10).
01 chtime PIC X(8).
01 ch1 PIC X(11).
01 ch2 PIC X(14).
* EXEC SQL END DECLARE SECTION END-EXEC
01 norm1 PIC S9(9) DISPLAY SIGN LEADING SEPARATE.
01 norm2 PIC S9(9) DISPLAY SIGN LEADING SEPARATE.
01 ALPNUM-TABLE VALUE IS
"01234ABCDEFGH56789IJKLMNOPQRSTUVWXYZ".
05 ALPNUM PIC X OCCURS 36 TIMES.
01 NORMSQ.
05 NORMSQX PIC X OCCURS 5 TIMES.
01 errcnt PIC S9(9) DISPLAY SIGN LEADING SEPARATE.
*date_time declaration
01 TO-DAY PIC 9(6).
01 THE-TIME PIC 9(8).
01 flag PIC S9(9) DISPLAY SIGN LEADING SEPARATE.
01 SQL-COD PIC S9(9) DISPLAY SIGN LEADING SEPARATE.
PROCEDURE DIVISION.
P0.
MOVE "FLATER " 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 SQLSTATE uidx
MOVE SQLCODE TO SQL-COD
* EXEC SQL ROLLBACK WORK;
CALL "SUB2" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
if (uid NOT = uidx) then
DISPLAY "ERROR: User ", uid " expected. User ", uidx "
- " connected"
STOP RUN
END-IF
MOVE 0 TO errcnt
DISPLAY
"SQL Test Suite, V6.0, Module COBOL, dml112.sco"
DISPLAY
"59-byte ID"
DISPLAY "TEd Version #"
*date_time print
ACCEPT TO-DAY FROM DATE
ACCEPT THE-TIME FROM TIME
DISPLAY "Date run YYMMDD: " TO-DAY " at hhmmssff: " THE-TIME
******************** BEGIN TEST0621 *******************
MOVE 1 TO flag
DISPLAY " TEST0621 "
DISPLAY " DATETIME NULLs (static)"
DISPLAY "References:"
DISPLAY " FIPS PUB 127-2 14.1 Transitional SQL features
- " 5,20"
DISPLAY " - - - - - - - - - - - - - - - - - - -"
COMPUTE SQLCODE = -1
MOVE "xxxxx" TO SQLSTATE
DISPLAY "CREATE TABLE MERCH ("
DISPLAY " ITEMKEY INT,"
DISPLAY " ORDERED DATE,"
DISPLAY " RDATE DATE,"
DISPLAY " RTIME TIME,"
DISPLAY " SOLD TIMESTAMP);"
* EXEC SQL CREATE TABLE MERCH (
* ITEMKEY INT,
* ORDERED DATE,
* RDATE DATE,
* RTIME TIME,
* SOLD TIMESTAMP);
CALL "SUB3" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB4" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "CREATE TABLE TURNAROUND ("
DISPLAY " ITEMKEY INT,"
DISPLAY " MWAIT INTERVAL MONTH,"
DISPLAY " DWAIT INTERVAL DAY TO HOUR);"
* EXEC SQL CREATE TABLE TURNAROUND (
* ITEMKEY INT,
* MWAIT INTERVAL MONTH,
* DWAIT INTERVAL DAY TO HOUR);
CALL "SUB5" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB6" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
*Do this with an outer join in a combined test later.
*For FSQL, use SELECT DISTINCT (all that stuff)
DISPLAY "CREATE VIEW INVENTORY AS"
DISPLAY " SELECT MERCH.ITEMKEY AS ITEMKEY, ORDERED,"
DISPLAY " MWAIT, DWAIT FROM MERCH, TURNAROUND COR1 WHERE
- " RDATE"
DISPLAY " IS NOT NULL AND SOLD IS NULL AND"
DISPLAY " MERCH.ITEMKEY = COR1.ITEMKEY"
DISPLAY " UNION"
DISPLAY " SELECT ITEMKEY, ORDERED,"
DISPLAY " CAST (NULL AS INTERVAL MONTH),"
DISPLAY " CAST (NULL AS INTERVAL DAY TO HOUR) FROM"
DISPLAY " MERCH WHERE RDATE IS NOT NULL AND SOLD IS NULL"
DISPLAY " AND MERCH.ITEMKEY NOT IN (SELECT ITEMKEY"
DISPLAY " FROM TURNAROUND);"
* EXEC SQL CREATE VIEW INVENTORY AS
* SELECT MERCH.ITEMKEY AS ITEMKEY, ORDERED,
* MWAIT, DWAIT FROM MERCH, TURNAROUND COR1 WHERE RDATE
* IS NOT NULL AND SOLD IS NULL AND
* MERCH.ITEMKEY = COR1.ITEMKEY
* UNION
* SELECT ITEMKEY, ORDERED,
* CAST (NULL AS INTERVAL MONTH),
* CAST (NULL AS INTERVAL DAY TO HOUR) FROM
* MERCH WHERE RDATE IS NOT NULL AND SOLD IS NULL
* AND MERCH.ITEMKEY NOT IN (SELECT ITEMKEY
* FROM TURNAROUND);
CALL "SUB7" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB8" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
*Something ordered but not received
DISPLAY "INSERT INTO MERCH VALUES ("
DISPLAY " 0, DATE '1993-11-23',"
DISPLAY " NULL, NULL, NULL);"
* EXEC SQL INSERT INTO MERCH VALUES (
* 0, DATE '1993-11-23',
* NULL, NULL, NULL);
CALL "SUB9" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
*Something we don't know what time it arrived
MOVE "12:34:56" TO chtime
DISPLAY "chtime is 12:34:56"
COMPUTE indic1 = -1
DISPLAY "indic1 = -1;"
DISPLAY "INSERT INTO MERCH VALUES ("
DISPLAY " 1, DATE '1993-12-10',"
DISPLAY " DATE '1994-01-03',"
DISPLAY " CAST (:chtime:indic1 AS TIME), NULL);"
* EXEC SQL INSERT INTO MERCH VALUES (
* 1, DATE '1993-12-10',
* DATE '1994-01-03',
* CAST (:chtime:indic1 AS TIME), NULL);
CALL "SUB10" USING SQLCODE SQLSTATE chtime indic1
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
*Something back-ordered
DISPLAY "INSERT INTO MERCH VALUES ("
DISPLAY " 2, DATE '1993-12-11',"
DISPLAY " NULL, NULL,"
DISPLAY " CAST ('TIMESTAMP ''1993-12-11 13:00:00''' AS
- " TIMESTAMP));"
* EXEC SQL INSERT INTO MERCH VALUES (
* 2, DATE '1993-12-11',
* NULL, NULL,
* CAST ('TIMESTAMP ''1993-12-11 13:00:00''' AS TIMESTAMP))
* ;
CALL "SUB11" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "INSERT INTO MERCH VALUES ("
DISPLAY " 4, DATE '1993-01-26', DATE '1993-01-27',"
DISPLAY " NULL, NULL);"
* EXEC SQL INSERT INTO MERCH VALUES (
* 4, DATE '1993-01-26', DATE '1993-01-27',
* NULL, NULL);
CALL "SUB12" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "INSERT INTO TURNAROUND VALUES ("
DISPLAY " 2, INTERVAL '1' MONTH, INTERVAL '20:0' DAY TO
- " HOUR);"
* EXEC SQL INSERT INTO TURNAROUND VALUES (
* 2, INTERVAL '1' MONTH, INTERVAL '20:0' DAY TO HOUR)
* ;
CALL "SUB13" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
*We have only a vague idea of the turnaround for this thing
DISPLAY "chtime is 20:0"
MOVE "20:0 " TO chtime
DISPLAY "indic1 = -1;"
COMPUTE indic1 = -1
DISPLAY "INSERT INTO TURNAROUND VALUES ("
DISPLAY " 5, INTERVAL '5' MONTH,"
DISPLAY " CAST (:chtime:indic1 AS INTERVAL DAY TO HOUR));"
* EXEC SQL INSERT INTO TURNAROUND VALUES (
* 5, INTERVAL '5' MONTH,
* CAST (:chtime:indic1 AS INTERVAL DAY TO HOUR));
CALL "SUB14" USING SQLCODE SQLSTATE chtime indic1
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "INSERT INTO TURNAROUND VALUES ("
DISPLAY " 6, INTERVAL '2' MONTH, NULL);"
* EXEC SQL INSERT INTO TURNAROUND VALUES (
* 6, INTERVAL '2' MONTH, NULL);
CALL "SUB15" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "SELECT COUNT(*) INTO :int1 FROM"
DISPLAY " MERCH A, MERCH B WHERE A.SOLD = B.SOLD;"
COMPUTE int1 = -1
* EXEC SQL SELECT COUNT(*) INTO :int1 FROM
* MERCH A, MERCH B WHERE A.SOLD = B.SOLD;
CALL "SUB16" 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 FROM"
DISPLAY " MERCH A, MERCH B WHERE A.RTIME = B.RTIME;"
COMPUTE int1 = -1
* EXEC SQL SELECT COUNT(*) INTO :int1 FROM
* MERCH A, MERCH B WHERE A.RTIME = B.RTIME;
CALL "SUB17" 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
DISPLAY "SELECT COUNT(*) INTO :int1 FROM"
DISPLAY " MERCH WHERE RDATE IS NULL;"
COMPUTE int1 = -1
* EXEC SQL SELECT COUNT(*) INTO :int1 FROM
* MERCH WHERE RDATE IS NULL;
CALL "SUB18" USING SQLCODE SQLSTATE int1
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY "int1 should be 2; its value is ", int1
if (int1 NOT = 2) then
MOVE 0 TO flag
END-IF
DISPLAY "SELECT COUNT(*) INTO :int1 FROM"
DISPLAY " TURNAROUND WHERE DWAIT IS NOT NULL;"
COMPUTE int1 = -1
* EXEC SQL SELECT COUNT(*) INTO :int1 FROM
* TURNAROUND WHERE DWAIT IS NOT NULL;
CALL "SUB19" 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 EXTRACT (DAY FROM RDATE) INTO :int1:indic1"
DISPLAY " FROM MERCH, TURNAROUND WHERE MERCH.ITEMKEY ="
DISPLAY " TURNAROUND.ITEMKEY;"
COMPUTE int1 = -1
MOVE 2 TO indic1
* EXEC SQL SELECT EXTRACT (DAY FROM RDATE) INTO :int1:indic1
* FROM MERCH, TURNAROUND WHERE MERCH.ITEMKEY =
* TURNAROUND.ITEMKEY;
CALL "SUB20" USING SQLCODE SQLSTATE int1 indic1
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY "indic1 should be -1; its value is ", indic1
if (indic1 NOT = -1) then
MOVE 0 TO flag
END-IF
DISPLAY "DECLARE C11211 CURSOR FOR"
DISPLAY " SELECT ITEMKEY FROM MERCH WHERE SOLD IS NOT
- " NULL;"
* EXEC SQL DECLARE C11211 CURSOR FOR
* SELECT ITEMKEY FROM MERCH WHERE SOLD IS NOT NULL END-EXEC
DISPLAY " "
DISPLAY "OPEN C11211;"
* EXEC SQL OPEN C11211;
CALL "SUB21" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
COMPUTE int1 = -1
DISPLAY "FETCH C11211 INTO :int1;"
* EXEC SQL FETCH C11211 INTO :int1;
CALL "SUB22" USING SQLCODE SQLSTATE int1
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY "int1 should be 2; its value is ", int1
if (int1 NOT = 2) then
MOVE 0 TO flag
END-IF
*Cursor left open.
DISPLAY "DECLARE C11212 CURSOR FOR"
DISPLAY " SELECT EXTRACT (HOUR FROM AVG (DWAIT))"
DISPLAY " FROM MERCH, TURNAROUND WHERE"
DISPLAY " MERCH.ITEMKEY = TURNAROUND.ITEMKEY OR"
DISPLAY " TURNAROUND.ITEMKEY NOT IN"
DISPLAY " (SELECT ITEMKEY FROM MERCH);"
* EXEC SQL DECLARE C11212 CURSOR FOR
* SELECT EXTRACT (HOUR FROM AVG (DWAIT))
* FROM MERCH, TURNAROUND WHERE
* MERCH.ITEMKEY = TURNAROUND.ITEMKEY OR
* TURNAROUND.ITEMKEY NOT IN
* (SELECT ITEMKEY FROM MERCH) END-EXEC
DISPLAY " "
DISPLAY "OPEN C11212;"
* EXEC SQL OPEN C11212;
CALL "SUB23" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
DISPLAY "SQLCODE should be >= 0; its value is ", SQL-COD
if (SQLCODE < 0) then
MOVE 0 TO flag
END-IF
DISPLAY "SQLSTATE can be 00000 or 01003; its value is ",
SQLSTATE
PERFORM NOSUBCLASS THRU EXIT-NOSUBCLASS
if (NORMSQ NOT = "00000" AND SQLSTATE NOT =
"01003") then
MOVE 0 TO flag
END-IF
*DML083 set the precedent for requiring 01003 on the fetches.
*One might argue that it ought to be returned just on the
*open and never again. DML083 is under dispute, so status
*codes are checked loosely here.
COMPUTE int1 = -1
DISPLAY "FETCH C11212 INTO :int1;"
* EXEC SQL FETCH C11212 INTO :int1;
CALL "SUB24" USING SQLCODE SQLSTATE int1
MOVE SQLCODE TO SQL-COD
DISPLAY "SQLCODE should be >= 0; its value is ", SQL-COD
if (SQLCODE < 0) then
MOVE 0 TO flag
END-IF
DISPLAY "SQLSTATE can be 00000 or 01003; its value is ",
SQLSTATE
PERFORM NOSUBCLASS THRU EXIT-NOSUBCLASS
if (NORMSQ NOT = "00000" AND SQLSTATE NOT =
"01003") then
MOVE 0 TO flag
END-IF
DISPLAY "int1 should be 0; its value is ", int1
if (int1 NOT = 0) then
MOVE 0 TO flag
END-IF
DISPLAY "SELECT COUNT(*) INTO :int1"
DISPLAY " FROM INVENTORY WHERE MWAIT IS NULL"
DISPLAY " AND DWAIT IS NULL;"
COMPUTE int1 = -1
* EXEC SQL SELECT COUNT(*) INTO :int1
* FROM INVENTORY WHERE MWAIT IS NULL
* AND DWAIT IS NULL;
CALL "SUB25" USING SQLCODE SQLSTATE int1
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY "int1 should be 2; its value is ", int1
if (int1 NOT = 2) then
MOVE 0 TO flag
END-IF
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB26" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "DROP TABLE MERCH CASCADE;"
* EXEC SQL DROP TABLE MERCH CASCADE;
CALL "SUB27" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB28" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "DROP TABLE TURNAROUND CASCADE;"
* EXEC SQL DROP TABLE TURNAROUND CASCADE;
CALL "SUB29" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB30" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
if ( flag = 1 ) then
DISPLAY " *** pass *** "
* EXEC SQL INSERT INTO HU.TESTREPORT
* VALUES('0621','pass','MCO');
CALL "SUB31" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
else
DISPLAY " dml112.sco *** fail *** "
* EXEC SQL INSERT INTO HU.TESTREPORT
* VALUES('0621','fail','MCO');
CALL "SUB32" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
COMPUTE errcnt = errcnt + 1
END-IF
DISPLAY "==============================================="
* EXEC SQL COMMIT WORK;
CALL "SUB33" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
******************** END TEST0621 ********************
******************** BEGIN TEST0623 *******************
MOVE 1 TO flag
DISPLAY " TEST0623 "
DISPLAY "OUTER JOINs with NULLs and empty tables (static)"
DISPLAY "References:"
DISPLAY " FIPS PUB 127-2 14.1 Transitional SQL feature
- " 4"
DISPLAY " - - - - - - - - - - - - - - - - - - -"
COMPUTE SQLCODE = -1
MOVE "xxxxx" TO SQLSTATE
DISPLAY "CREATE TABLE JNULL1 (C1 INT, C2 INT);"
* EXEC SQL CREATE TABLE JNULL1 (C1 INT, C2 INT)
* ;
CALL "SUB34" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB35" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "CREATE TABLE JNULL2 (D1 INT, D2 INT);"
* EXEC SQL CREATE TABLE JNULL2 (D1 INT, D2 INT)
* ;
CALL "SUB36" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB37" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "CREATE VIEW JNULL3 AS"
DISPLAY " SELECT C1, D1, D2 FROM JNULL1 LEFT OUTER JOIN
- " JNULL2"
DISPLAY " ON C2 = D2;"
* EXEC SQL CREATE VIEW JNULL3 AS
* SELECT C1, D1, D2 FROM JNULL1 LEFT OUTER JOIN JNULL2
* ON C2 = D2;
CALL "SUB38" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB39" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "CREATE VIEW JNULL4 AS"
DISPLAY " SELECT D1, D2 AS C2 FROM JNULL2;"
* EXEC SQL CREATE VIEW JNULL4 AS
* SELECT D1, D2 AS C2 FROM JNULL2;
CALL "SUB40" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB41" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "CREATE VIEW JNULL5 AS"
DISPLAY " SELECT C1, D1, C2 FROM JNULL1 RIGHT OUTER JOIN
- " JNULL4"
DISPLAY " USING (C2);"
* EXEC SQL CREATE VIEW JNULL5 AS
* SELECT C1, D1, C2 FROM JNULL1 RIGHT OUTER JOIN JNULL4
* USING (C2);
CALL "SUB42" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB43" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "CREATE VIEW JNULL6 AS"
DISPLAY " SELECT * FROM JNULL1 LEFT OUTER JOIN JNULL4"
DISPLAY " USING (C2);"
* EXEC SQL CREATE VIEW JNULL6 AS
* SELECT * FROM JNULL1 LEFT OUTER JOIN JNULL4
* USING (C2);
CALL "SUB44" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB45" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "INSERT INTO JNULL1 VALUES (NULL, NULL);"
* EXEC SQL INSERT INTO JNULL1 VALUES (NULL, NULL);
CALL "SUB46" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "INSERT INTO JNULL1 VALUES (1, NULL);"
* EXEC SQL INSERT INTO JNULL1 VALUES (1, NULL);
CALL "SUB47" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "INSERT INTO JNULL1 VALUES (NULL, 1);"
* EXEC SQL INSERT INTO JNULL1 VALUES (NULL, 1);
CALL "SUB48" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "INSERT INTO JNULL1 VALUES (1, 1);"
* EXEC SQL INSERT INTO JNULL1 VALUES (1, 1);
CALL "SUB49" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "INSERT INTO JNULL1 VALUES (2, 2);"
* EXEC SQL INSERT INTO JNULL1 VALUES (2, 2);
CALL "SUB50" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
COMPUTE int1 = -1
DISPLAY "SELECT COUNT(*) INTO :int1 FROM JNULL3;"
* EXEC SQL SELECT COUNT(*) INTO :int1 FROM JNULL3;
CALL "SUB51" USING SQLCODE SQLSTATE int1
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY "int1 should be 5; its value is ", int1
if (int1 NOT = 5) then
MOVE 0 TO flag
END-IF
COMPUTE int1 = -1
DISPLAY "SELECT COUNT(*) INTO :int1 FROM JNULL3"
DISPLAY " WHERE D2 IS NOT NULL OR D1 IS NOT NULL;"
* EXEC SQL SELECT COUNT(*) INTO :int1 FROM JNULL3
* WHERE D2 IS NOT NULL OR D1 IS NOT NULL;
CALL "SUB52" 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
DISPLAY "SELECT COUNT(*) INTO :int1 FROM JNULL5;"
COMPUTE int1 = -1
* EXEC SQL SELECT COUNT(*) INTO :int1 FROM JNULL5;
CALL "SUB53" 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
DISPLAY "SELECT COUNT(*) INTO :int1 FROM"
DISPLAY " JNULL6"
DISPLAY " WHERE C2 IS NOT NULL;"
* EXEC SQL SELECT COUNT(*) INTO :int1 FROM
* JNULL6
* WHERE C2 IS NOT NULL;
CALL "SUB54" USING SQLCODE SQLSTATE int1
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY "int1 should be 3; its value is ", int1
if (int1 NOT = 3) then
MOVE 0 TO flag
END-IF
*Nonempty table
DISPLAY "INSERT INTO JNULL2"
DISPLAY " SELECT * FROM JNULL1;"
* EXEC SQL INSERT INTO JNULL2
* SELECT * FROM JNULL1;
CALL "SUB55" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "UPDATE JNULL2"
DISPLAY " SET D2 = 1 WHERE D2 = 2;"
* EXEC SQL UPDATE JNULL2
* SET D2 = 1 WHERE D2 = 2;
CALL "SUB56" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
COMPUTE int1 = -1
DISPLAY "SELECT COUNT(*) INTO :int1 FROM JNULL3;"
* EXEC SQL SELECT COUNT(*) INTO :int1 FROM JNULL3;
CALL "SUB57" 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
DISPLAY "SELECT COUNT(*) INTO :int1"
DISPLAY " FROM JNULL3 WHERE C1 IS NULL;"
* EXEC SQL SELECT COUNT(*) INTO :int1
* FROM JNULL3 WHERE C1 IS NULL;
CALL "SUB58" 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
DISPLAY "SELECT COUNT(*) INTO :int1"
DISPLAY " FROM JNULL3 WHERE D1 IS NULL;"
COMPUTE int1 = -1
* EXEC SQL SELECT COUNT(*) INTO :int1
* FROM JNULL3 WHERE D1 IS NULL;
CALL "SUB59" USING SQLCODE SQLSTATE int1
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY "int1 should be 5; its value is ", int1
if (int1 NOT = 5) then
MOVE 0 TO flag
END-IF
DISPLAY "SELECT COUNT(*) INTO :int1"
DISPLAY " FROM JNULL3 WHERE D2 IS NULL;"
COMPUTE int1 = -1
* EXEC SQL SELECT COUNT(*) INTO :int1
* FROM JNULL3 WHERE D2 IS NULL;
CALL "SUB60" USING SQLCODE SQLSTATE int1
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY "int1 should be 3; its value is ", int1
if (int1 NOT = 3) then
MOVE 0 TO flag
END-IF
DISPLAY "SELECT AVG(D1) * 10 INTO :int1"
DISPLAY " FROM JNULL3;"
COMPUTE int1 = -1
* EXEC SQL SELECT AVG(D1) * 10 INTO :int1
* FROM JNULL3;
CALL "SUB61" USING SQLCODE SQLSTATE int1
MOVE SQLCODE TO SQL-COD
DISPLAY "SQLCODE should be >= 0; its value is ", SQL-COD
if (SQLCODE < 0) then
MOVE 0 TO flag
END-IF
DISPLAY "SQLSTATE should be 01003; its value is ", SQLSTATE
if (SQLSTATE NOT = "01003") then
MOVE 0 TO flag
END-IF
DISPLAY "int1 should be 15; its value is ", int1
if (int1 NOT = 15) then
MOVE 0 TO flag
END-IF
DISPLAY "SELECT COUNT(*) INTO :int1"
DISPLAY " FROM JNULL6"
DISPLAY " WHERE C2 = 1;"
COMPUTE int1 = -1
* EXEC SQL SELECT COUNT(*) INTO :int1
* FROM JNULL6
* WHERE C2 = 1;
CALL "SUB62" USING SQLCODE SQLSTATE int1
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY "int1 should be 6; its value is ", int1
if (int1 NOT = 6) then
MOVE 0 TO flag
END-IF
DISPLAY "SELECT COUNT(*) INTO :int1"
DISPLAY " FROM JNULL6"
DISPLAY " WHERE C2 IS NULL;"
COMPUTE int1 = -1
* EXEC SQL SELECT COUNT(*) INTO :int1
* FROM JNULL6
* WHERE C2 IS NULL;
CALL "SUB63" USING SQLCODE SQLSTATE int1
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY "int1 should be 2; its value is ", int1
if (int1 NOT = 2) then
MOVE 0 TO flag
END-IF
DISPLAY "SELECT COUNT(*) INTO :int1"
DISPLAY " FROM JNULL6"
DISPLAY " WHERE C2 = C1 AND"
DISPLAY " D1 IS NULL;"
COMPUTE int1 = -1
* EXEC SQL SELECT COUNT(*) INTO :int1
* FROM JNULL6
* WHERE C2 = C1 AND
* D1 IS NULL;
CALL "SUB64" USING SQLCODE SQLSTATE int1
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY "int1 should be 2; its value is ", int1
if (int1 NOT = 2) then
MOVE 0 TO flag
END-IF
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB65" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "DROP TABLE JNULL1 CASCADE;"
* EXEC SQL DROP TABLE JNULL1 CASCADE;
CALL "SUB66" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB67" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "DROP TABLE JNULL2 CASCADE;"
* EXEC SQL DROP TABLE JNULL2 CASCADE;
CALL "SUB68" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB69" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
if ( flag = 1 ) then
DISPLAY " *** pass *** "
* EXEC SQL INSERT INTO HU.TESTREPORT
* VALUES('0623','pass','MCO');
CALL "SUB70" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
else
DISPLAY " dml112.sco *** fail *** "
* EXEC SQL INSERT INTO HU.TESTREPORT
* VALUES('0623','fail','MCO');
CALL "SUB71" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
COMPUTE errcnt = errcnt + 1
END-IF
DISPLAY "==============================================="
* EXEC SQL COMMIT WORK;
CALL "SUB72" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
******************** END TEST0623 ********************
******************** BEGIN TEST0625 *******************
MOVE 1 TO flag
DISPLAY " TEST0625 "
DISPLAY " ADD COLUMN and DROP COLUMN (static)"
DISPLAY "References:"
DISPLAY " FIPS PUB 127-2 14.1 Transitional SQL feature
- " 3"
DISPLAY " 11.11 "
DISPLAY " 11.15 "
DISPLAY " - - - - - - - - - - - - - - - - - - -"
COMPUTE SQLCODE = -1
MOVE "xxxxx" TO SQLSTATE
DISPLAY "CREATE TABLE CHANGG"
DISPLAY " (NAAM CHAR (14) NOT NULL PRIMARY KEY, AGE INT);"
* EXEC SQL CREATE TABLE CHANGG
* (NAAM CHAR (14) NOT NULL PRIMARY KEY, AGE INT);
CALL "SUB73" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB74" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "CREATE VIEW CHANGGVIEW AS"
DISPLAY " SELECT * FROM CHANGG;"
* EXEC SQL CREATE VIEW CHANGGVIEW AS
* SELECT * FROM CHANGG;
CALL "SUB75" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB76" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
*should not be able to drop CHANGG.NAAM RESTRICT due to 11.15 SR
DISPLAY "ALTER TABLE CHANGG"
DISPLAY " DROP NAAM RESTRICT;"
* EXEC SQL ALTER TABLE CHANGG
* DROP NAAM RESTRICT;
CALL "SUB77" 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 42000; its value is ", SQLSTATE
PERFORM NOSUBCLASS THRU EXIT-NOSUBCLASS
if (NORMSQ NOT = "42000") then
MOVE 0 TO flag
END-IF
if (NORMSQ = "42000" AND NORMSQ NOT = SQLSTATE)
then
DISPLAY "Valid implementation-defined SQLSTATE accepted."
END-IF
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB78" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
DISPLAY " "
DISPLAY "INSERT INTO CHANGG VALUES ('RALPH',
- "22);"
* EXEC SQL INSERT INTO CHANGG VALUES ('RALPH',
* 22);
CALL "SUB79" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "INSERT INTO CHANGG VALUES ('RUDOLPH',
- "54);"
* EXEC SQL INSERT INTO CHANGG VALUES ('RUDOLPH',
* 54);
CALL "SUB80" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "INSERT INTO CHANGG VALUES ('QUEEG',
- "33);"
* EXEC SQL INSERT INTO CHANGG VALUES ('QUEEG',
* 33);
CALL "SUB81" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "INSERT INTO CHANGG VALUES ('BESSIE',
- "106);"
* EXEC SQL INSERT INTO CHANGG VALUES ('BESSIE',
* 106);
CALL "SUB82" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
*This select should fail
DISPLAY "SELECT COUNT(*) INTO :int1"
DISPLAY " FROM CHANGG WHERE DIVORCES IS NULL;"
* EXEC SQL SELECT COUNT(*) INTO :int1
* FROM CHANGG WHERE DIVORCES IS NULL;
CALL "SUB83" USING SQLCODE SQLSTATE int1
MOVE SQLCODE TO SQL-COD
DISPLAY "SQLCODE should be < 0; its value is ", SQL-COD
DISPLAY "SQLSTATE should be '42000'; its value is '",
SQLSTATE "'"
if (SQLCODE NOT < 0) then
MOVE 0 TO flag
END-IF
PERFORM NOSUBCLASS THRU EXIT-NOSUBCLASS
if (NORMSQ NOT = "42000") then
MOVE 0 TO flag
END-IF
if (NORMSQ = "42000" AND NORMSQ NOT = SQLSTATE)
then
DISPLAY "Valid implementation-defined SQLSTATE accepted."
END-IF
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB84" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "ALTER TABLE CHANGG ADD NUMBRR CHAR(11);"
* EXEC SQL ALTER TABLE CHANGG ADD NUMBRR CHAR(11)
* ;
CALL "SUB85" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB86" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
COMPUTE int1 = -1
DISPLAY "SELECT MAX(AGE) INTO :int1 FROM CHANGGVIEW;"
* EXEC SQL SELECT MAX(AGE) INTO :int1 FROM CHANGGVIEW
* ;
CALL "SUB87" USING SQLCODE SQLSTATE int1
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY "int1 should be 106; its value is ", int1
if (int1 NOT = 106) then
MOVE 0 TO flag
END-IF
*11.11 GR.2: This statement should fail.
DISPLAY "SELECT NUMBRR INTO :ch1 FROM CHANGGVIEW;"
* EXEC SQL SELECT NUMBRR INTO :ch1 FROM CHANGGVIEW;
CALL "SUB88" USING SQLCODE SQLSTATE ch1
MOVE SQLCODE TO SQL-COD
DISPLAY "SQLCODE should be < 0; its value is ", SQL-COD
DISPLAY "SQLSTATE should be '42000'; its value is '",
SQLSTATE "'"
if (SQLCODE NOT < 0) then
MOVE 0 TO flag
END-IF
PERFORM NOSUBCLASS THRU EXIT-NOSUBCLASS
if (NORMSQ NOT = "42000") then
MOVE 0 TO flag
END-IF
if (NORMSQ = "42000" AND NORMSQ NOT = SQLSTATE)
then
DISPLAY "Valid implementation-defined SQLSTATE accepted."
END-IF
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB89" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "DROP VIEW CHANGGVIEW CASCADE;"
* EXEC SQL DROP VIEW CHANGGVIEW CASCADE;
CALL "SUB90" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB91" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
*Optional keyword!
DISPLAY "ALTER TABLE CHANGG"
DISPLAY " ADD COLUMN DIVORCES INT DEFAULT 0;"
* EXEC SQL ALTER TABLE CHANGG
* ADD COLUMN DIVORCES INT DEFAULT 0;
CALL "SUB92" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB93" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
*Check that defaults are correct
DISPLAY "SELECT COUNT(*) INTO :int1"
DISPLAY " FROM CHANGG WHERE NUMBRR IS NOT NULL"
DISPLAY " OR DIVORCES <> 0;"
COMPUTE int1 = -1
* EXEC SQL SELECT COUNT(*) INTO :int1
* FROM CHANGG WHERE NUMBRR IS NOT NULL
* OR DIVORCES <> 0;
CALL "SUB94" 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
*Do some uncomplicated things
DISPLAY "UPDATE CHANGG"
DISPLAY " SET NUMBRR = '837-47-1847', DIVORCES = 3"
DISPLAY " WHERE NAAM = 'RUDOLPH';"
* EXEC SQL UPDATE CHANGG
* SET NUMBRR = '837-47-1847', DIVORCES = 3
* WHERE NAAM = 'RUDOLPH';
CALL "SUB95" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "UPDATE CHANGG"
DISPLAY " SET NUMBRR = '738-47-1847', DIVORCES = NULL"
DISPLAY " WHERE NAAM = 'QUEEG';"
* EXEC SQL UPDATE CHANGG
* SET NUMBRR = '738-47-1847', DIVORCES = NULL
* WHERE NAAM = 'QUEEG';
CALL "SUB96" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "DELETE FROM CHANGG"
DISPLAY " WHERE NUMBRR IS NULL;"
* EXEC SQL DELETE FROM CHANGG
* WHERE NUMBRR IS NULL;
CALL "SUB97" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "INSERT INTO CHANGG (NAAM, AGE, NUMBRR)"
DISPLAY " VALUES ('GOOBER', 16, '000-10-0001');"
* EXEC SQL INSERT INTO CHANGG (NAAM, AGE, NUMBRR)
* VALUES ('GOOBER', 16, '000-10-0001');
CALL "SUB98" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "INSERT INTO CHANGG"
DISPLAY " VALUES ('OLIVIA', 20, '111-11-1111', 0);"
* EXEC SQL INSERT INTO CHANGG
* VALUES ('OLIVIA', 20, '111-11-1111', 0);
CALL "SUB99" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
COMPUTE int1 = -1
COMPUTE int2 = -1
MOVE "xxxxxxxxxxx" TO ch1
DISPLAY "SELECT AGE, NUMBRR, DIVORCES"
DISPLAY " INTO :int1, :ch1, :int2"
DISPLAY " FROM CHANGG"
DISPLAY " WHERE NAAM = 'RUDOLPH';"
* EXEC SQL SELECT AGE, NUMBRR, DIVORCES
* INTO :int1, :ch1, :int2
* FROM CHANGG
* WHERE NAAM = 'RUDOLPH';
CALL "SUB100" USING SQLCODE SQLSTATE int1 ch1 int2
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY "int1 should be 54; its value is ", int1
DISPLAY "int2 should be 3; its value is ", int2
DISPLAY "ch1 should be '837-47-1847'; its value is '",
ch1 "'"
if (int1 NOT = 54 OR int2 NOT = 3) then
MOVE 0 TO flag
END-IF
if (ch1 NOT = "837-47-1847") then
MOVE 0 TO flag
END-IF
COMPUTE int1 = -1
COMPUTE int2 = -1
MOVE 10 TO indic1
MOVE "xxxxxxxxxxx" TO ch1
DISPLAY "SELECT AGE, NUMBRR, DIVORCES"
DISPLAY " INTO :int1, :ch1, :int2:indic1"
DISPLAY " FROM CHANGG"
DISPLAY " WHERE NAAM = 'QUEEG';"
* EXEC SQL SELECT AGE, NUMBRR, DIVORCES
* INTO :int1, :ch1, :int2:indic1
* FROM CHANGG
* WHERE NAAM = 'QUEEG';
CALL "SUB101" USING SQLCODE SQLSTATE int1 ch1 int2 indic1
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY "int1 should be 33; its value is ", int1
DISPLAY "indic1 should be -1; its value is ", indic1
DISPLAY "ch1 should be '738-47-1847'; its value is '",
ch1 "'"
if (int1 NOT = 33 OR indic1 NOT = -1) then
MOVE 0 TO flag
END-IF
if (ch1 NOT = "738-47-1847") then
MOVE 0 TO flag
END-IF
COMPUTE int1 = -1
COMPUTE int2 = -1
MOVE "xxxxxxxxxxx" TO ch1
DISPLAY "SELECT AGE, NUMBRR, DIVORCES"
DISPLAY " INTO :int1, :ch1, :int2"
DISPLAY " FROM CHANGG"
DISPLAY " WHERE NAAM = 'GOOBER';"
* EXEC SQL SELECT AGE, NUMBRR, DIVORCES
* INTO :int1, :ch1, :int2
* FROM CHANGG
* WHERE NAAM = 'GOOBER';
CALL "SUB102" USING SQLCODE SQLSTATE int1 ch1 int2
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY "int1 should be 16; its value is ", int1
DISPLAY "int2 should be 0; its value is ", int2
DISPLAY "ch1 should be '000-10-0001'; its value is '",
ch1 "'"
if (int1 NOT = 16 OR int2 NOT = 0) then
MOVE 0 TO flag
END-IF
if (ch1 NOT = "000-10-0001") then
MOVE 0 TO flag
END-IF
COMPUTE int1 = -1
COMPUTE int2 = -1
MOVE "xxxxxxxxxxx" TO ch1
DISPLAY "SELECT AGE, NUMBRR, DIVORCES"
DISPLAY " INTO :int1, :ch1, :int2"
DISPLAY " FROM CHANGG"
DISPLAY " WHERE NAAM = 'OLIVIA';"
* EXEC SQL SELECT AGE, NUMBRR, DIVORCES
* INTO :int1, :ch1, :int2
* FROM CHANGG
* WHERE NAAM = 'OLIVIA';
CALL "SUB103" USING SQLCODE SQLSTATE int1 ch1 int2
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY "int1 should be 20; its value is ", int1
DISPLAY "int2 should be 0; its value is ", int2
DISPLAY "ch1 should be '111-11-1111'; its value is '",
ch1 "'"
if (int1 NOT = 20 OR int2 NOT = 0) then
MOVE 0 TO flag
END-IF
if (ch1 NOT = "111-11-1111") then
MOVE 0 TO flag
END-IF
COMPUTE int1 = -1
DISPLAY "SELECT COUNT(*) INTO :int1 FROM CHANGG;"
* EXEC SQL SELECT COUNT(*) INTO :int1 FROM CHANGG;
CALL "SUB104" 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
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB105" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
*Age is nobody's business!
DISPLAY "ALTER TABLE CHANGG DROP AGE CASCADE;"
* EXEC SQL ALTER TABLE CHANGG DROP AGE CASCADE
* ;
CALL "SUB106" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB107" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
*Optional keyword!
DISPLAY "ALTER TABLE CHANGG DROP COLUMN DIVORCES RESTRICT;"
* EXEC SQL ALTER TABLE CHANGG DROP COLUMN DIVORCES
* RESTRICT;
CALL "SUB108" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB109" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
*This select should fail
DISPLAY "SELECT COUNT(*) INTO :int1"
DISPLAY " FROM CHANGG WHERE AGE > 30;"
* EXEC SQL SELECT COUNT(*) INTO :int1
* FROM CHANGG WHERE AGE > 30;
CALL "SUB110" USING SQLCODE SQLSTATE int1
MOVE SQLCODE TO SQL-COD
DISPLAY "SQLCODE should be < 0; its value is ", SQL-COD
DISPLAY "SQLSTATE should be '42000'; its value is '",
SQLSTATE "'"
if (SQLCODE NOT < 0) then
MOVE 0 TO flag
END-IF
PERFORM NOSUBCLASS THRU EXIT-NOSUBCLASS
if (NORMSQ NOT = "42000") then
MOVE 0 TO flag
END-IF
if (NORMSQ = "42000" AND NORMSQ NOT = SQLSTATE)
then
DISPLAY "Valid implementation-defined SQLSTATE accepted."
END-IF
*This select should fail too
MOVE "xxxxx" TO SQLSTATE
DISPLAY "SELECT COUNT(*) INTO :int1"
DISPLAY " FROM CHANGG WHERE DIVORCES IS NULL;"
* EXEC SQL SELECT COUNT(*) INTO :int1
* FROM CHANGG WHERE DIVORCES IS NULL;
CALL "SUB111" USING SQLCODE SQLSTATE int1
MOVE SQLCODE TO SQL-COD
DISPLAY "SQLCODE should be < 0; its value is ", SQL-COD
DISPLAY "SQLSTATE should be '42000'; its value is '",
SQLSTATE "'"
if (SQLCODE NOT < 0) then
MOVE 0 TO flag
END-IF
PERFORM NOSUBCLASS THRU EXIT-NOSUBCLASS
if (NORMSQ NOT = "42000") then
MOVE 0 TO flag
END-IF
if (NORMSQ = "42000" AND NORMSQ NOT = SQLSTATE)
then
DISPLAY "Valid implementation-defined SQLSTATE accepted."
END-IF
MOVE "xxxxxxxxxxxxxx" TO ch2
DISPLAY "SELECT NAAM INTO :ch2"
DISPLAY " FROM CHANGG"
DISPLAY " WHERE NUMBRR LIKE '%000%';"
* EXEC SQL SELECT NAAM INTO :ch2
* FROM CHANGG
* WHERE NUMBRR LIKE '%000%';
CALL "SUB112" USING SQLCODE SQLSTATE ch2
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY "ch2 should be 'GOOBER '; its value is '",
ch2 "'"
if (ch2 NOT = "GOOBER ") then
MOVE 0 TO flag
END-IF
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB113" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
*create a referential constraint on table CHANGG
DISPLAY "CREATE TABLE REFERENCE_CHANGG ("
DISPLAY " NAAM CHAR (14) NOT NULL PRIMARY KEY"
DISPLAY " REFERENCES CHANGG);"
* EXEC SQL CREATE TABLE REFERENCE_CHANGG (
* NAAM CHAR (14) NOT NULL PRIMARY KEY
* REFERENCES CHANGG);
CALL "SUB114" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB115" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
*verify referential constraint
DISPLAY "INSERT INTO REFERENCE_CHANGG VALUES
- "('NO SUCH NAAM');"
* EXEC SQL INSERT INTO REFERENCE_CHANGG VALUES
* ('NO SUCH NAAM');
CALL "SUB116" 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 23000; its value is ", SQLSTATE
PERFORM NOSUBCLASS THRU EXIT-NOSUBCLASS
if (NORMSQ NOT = "23000") then
MOVE 0 TO flag
END-IF
if (NORMSQ = "23000" AND NORMSQ NOT = SQLSTATE)
then
DISPLAY "Valid implementation-defined SQLSTATE accepted."
END-IF
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB117" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
*should not be able to drop CHANGG.NAAM RESTRICT due to RI const
DISPLAY "ALTER TABLE CHANGG"
DISPLAY " DROP NAAM RESTRICT;"
* EXEC SQL ALTER TABLE CHANGG
* DROP NAAM RESTRICT;
CALL "SUB118" 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 42000; its value is ", SQLSTATE
PERFORM NOSUBCLASS THRU EXIT-NOSUBCLASS
if (NORMSQ NOT = "42000") then
MOVE 0 TO flag
END-IF
if (NORMSQ = "42000" AND NORMSQ NOT = SQLSTATE)
then
DISPLAY "Valid implementation-defined SQLSTATE accepted."
END-IF
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB119" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
DISPLAY " "
*should be able to drop CHANGG.NAAM CASCADE
DISPLAY "ALTER TABLE CHANGG"
DISPLAY " DROP NAAM CASCADE;"
* EXEC SQL ALTER TABLE CHANGG
* DROP NAAM CASCADE;
CALL "SUB120" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB121" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
*verify referential constraint was a dropped object
DISPLAY "INSERT INTO REFERENCE_CHANGG VALUES
- "('NO SUCH NAAM');"
* EXEC SQL INSERT INTO REFERENCE_CHANGG VALUES
* ('NO SUCH NAAM');
CALL "SUB122" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB123" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
*TEd Hook #1 Check 11.15 SR.3 (can't drop all the columns)
*This is a syntax error. If it is rejected at compile time,
*save the error and use the TEd hooks to remove this subtest.
DISPLAY "ALTER TABLE CHANGG"
DISPLAY " DROP NUMBRR RESTRICT;"
* EXEC SQL ALTER TABLE CHANGG
* DROP NUMBRR RESTRICT;
CALL "SUB124" 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 42000; its value is ", SQLSTATE
PERFORM NOSUBCLASS THRU EXIT-NOSUBCLASS
if (NORMSQ NOT = "42000") then
MOVE 0 TO flag
END-IF
if (NORMSQ = "42000" AND NORMSQ NOT = SQLSTATE)
then
DISPLAY "Valid implementation-defined SQLSTATE accepted."
END-IF
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB125" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
DISPLAY " "
*TEd Hook #2
DISPLAY "DROP TABLE CHANGG CASCADE;"
* EXEC SQL DROP TABLE CHANGG CASCADE;
CALL "SUB126" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB127" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
*11.18 SR.4 -- only the constraint, not the referencing
*table, was dropped.
DISPLAY "DROP TABLE REFERENCE_CHANGG CASCADE;"
* EXEC SQL DROP TABLE REFERENCE_CHANGG CASCADE
* ;
CALL "SUB128" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB129" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
if ( flag = 1 ) then
DISPLAY " *** pass *** "
* EXEC SQL INSERT INTO HU.TESTREPORT
* VALUES('0625','pass','MCO');
CALL "SUB130" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
else
DISPLAY " dml112.sco *** fail *** "
* EXEC SQL INSERT INTO HU.TESTREPORT
* VALUES('0625','fail','MCO');
CALL "SUB131" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
COMPUTE errcnt = errcnt + 1
END-IF
DISPLAY "==============================================="
* EXEC SQL COMMIT WORK;
CALL "SUB132" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
******************** END TEST0625 ********************
******************** BEGIN TEST0631 *******************
MOVE 1 TO flag
DISPLAY " TEST0631 "
DISPLAY " Datetimes in a (static)"
DISPLAY "References:"
DISPLAY " FIPS PUB 127-2 14.1 Transitional SQL feature
- " 5"
DISPLAY " 11.5 "
DISPLAY " 6.8 "
DISPLAY " 5.3 "
DISPLAY " - - - - - - - - - - - - - - - - - - -"
COMPUTE SQLCODE = -1
MOVE "xxxxx" TO SQLSTATE
DISPLAY "CREATE TABLE OBITUARIES ("
DISPLAY " NAAM CHAR (14) NOT NULL PRIMARY KEY,"
DISPLAY " BORN DATE DEFAULT DATE '1880-01-01',"
DISPLAY " DIED DATE DEFAULT CURRENT_DATE,"
DISPLAY " ENTERED TIMESTAMP DEFAULT CURRENT_TIMESTAMP);"
* EXEC SQL CREATE TABLE OBITUARIES (
* NAAM CHAR (14) NOT NULL PRIMARY KEY,
* BORN DATE DEFAULT DATE '1880-01-01',
* DIED DATE DEFAULT CURRENT_DATE,
* ENTERED TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
* TESTING1 DATE,
* TESTING2 TIMESTAMP);
CALL "SUB133" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB134" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "CREATE TABLE BIRTHS ("
DISPLAY " NAAM CHAR (14) NOT NULL PRIMARY KEY,"
DISPLAY " CHECKIN TIME (0)"
DISPLAY " DEFAULT TIME '00:00:00',"
DISPLAY " LABOR INTERVAL HOUR"
DISPLAY " DEFAULT INTERVAL '4' HOUR,"
DISPLAY " CHECKOUT TIME"
DISPLAY " DEFAULT CURRENT_TIME);"
* EXEC SQL CREATE TABLE BIRTHS (
* NAAM CHAR (14) NOT NULL PRIMARY KEY,
* CHECKIN TIME (0)
* DEFAULT TIME '00:00:00',
* LABOR INTERVAL HOUR
* DEFAULT INTERVAL '4' HOUR,
* CHECKOUT TIME
* DEFAULT CURRENT_TIME,
* TESTING TIME);
CALL "SUB135" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
*The <default option> must be a <literal> or a <datetime value
*function> so I can't use a CAST to change CURRENT_TIME to have
*no fractional seconds.
PERFORM CHCKOK
DISPLAY " "
DISPLAY "COMMIT WORK;"
* EXEC SQL COMMIT WORK;
CALL "SUB136" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "INSERT INTO OBITUARIES (NAAM, TESTING1, TESTING2)"
DISPLAY " VALUES ('KEITH', CURRENT_DATE,
- " CURRENT_TIMESTAMP);"
* EXEC SQL INSERT INTO OBITUARIES (NAAM, TESTING1, TESTING2)
* VALUES ('KEITH', CURRENT_DATE, CURRENT_TIMESTAMP)
* ;
CALL "SUB137" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "INSERT INTO BIRTHS (NAAM, TESTING)"
DISPLAY " VALUES ('BJORN', CURRENT_TIME);"
* EXEC SQL INSERT INTO BIRTHS (NAAM, TESTING)
* VALUES ('BJORN', CURRENT_TIME);
CALL "SUB138" USING SQLCODE SQLSTATE
MOVE SQLCODE TO SQL-COD
PERFORM CHCKOK
DISPLAY " "
DISPLAY "SELECT EXTRACT (HOUR FROM CHECKIN) +"
DISPLAY " EXTRACT (MINUTE FROM CHECKIN) +"
DISPLAY " EXTRACT (SECOND FROM CHECKIN)"
DISPLAY " INTO :int1 FROM BIRTHS;"
COMPUTE int1 = -1
* EXEC SQL SELECT EXTRACT (HOUR FROM CHECKIN) +
* EXTRACT (MINUTE FROM CHECKIN) +
* EXTRACT (SECOND FROM CHECKIN)
* INTO :int1 FROM BIRTHS;
CALL "SUB139" 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
DISPLAY "SELECT EXTRACT (HOUR FROM LABOR) INTO :int1 FROM
- " BIRTHS;"
COMPUTE int1 = -1
* EXEC SQL SELECT EXTRACT (HOUR FROM LABOR) INTO :int1 FROM
* BIRTHS;
CALL "SUB140" 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
DISPLAY "SELECT COUNT (*) INTO :int1 FROM BIRTHS"
DISPLAY " WHERE TESTING <> CHECKOUT OR CHECKOUT IS NULL;"
COMPUTE int1 = -1
* EXEC SQL SELECT COUNT (*) INTO :int1 FROM BIRTHS
* WHERE TESTING <> CHECKOUT OR CHECKOUT IS NULL;
CALL "SUB141" 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
DISPLAY "SELECT COUNT (*) INTO :int1 FROM OBITUARIES"
DISPLAY " WHERE BORN <> DATE '1880-01-01'"
DISPLAY " OR BORN IS NULL"
DISPLAY " OR DIED <> TESTING1"
DISPLAY " OR DIED IS NULL"
DISPLAY " OR ENTERED <> TESTING2"
DISPLAY " OR ENTERED IS NULL;"
COMPUTE int1 = -1
* EXEC SQL SELECT COUNT (*) INTO :int1 FROM OBITUARIES
* WHERE BORN <> DATE '1880-01-01'
* OR BORN IS NULL
* OR DIED <> TESTING1
* OR DIED IS NULL
* OR ENTERED <> TESTING2
* OR ENTERED IS NULL;
CALL "SUB142" USING SQLCODE SQLSTATE int1
--> --------------------
--> maximum size reached
--> --------------------
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.71Angebot
Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können
¤
|
Lebenszyklus
Die hierunter aufgelisteten Ziele sind für diese Firma wichtig
Ziele
Entwicklung einer Software für die statische Quellcodeanalyse
|