Games Engine
Games Engine

Reputation: 1

invalid level number 'EXEC' error in OpenCOBOL

this is my code Here :

  ******************************************************************
  *  Open Cobol ESQL (Ocesql) Sample Program
  *
  *  FETCHTBL --- demonstrates CONNECT, SELECT COUNT(*), 
  *               DECLARE cursor, FETCH cursor, COMMIT, 
  *               ROLLBACK, DISCONNECT
  *
  *  Copyright 2013 Tokyo System House Co., Ltd.
  ******************************************************************
   IDENTIFICATION              DIVISION.
  ******************************************************************
   PROGRAM-ID.                 FETCHTBL.
  ******************************************************************
   DATA                        DIVISION.
  ******************************************************************
   WORKING-STORAGE             SECTION.
   01  D-EMP-REC.
       05  D-EMP-NO            PIC  9(04).
       05  FILLER              PIC  X.
       05  D-EMP-NAME          PIC  X(20).
       05  FILLER              PIC  X.
       05  D-EMP-SALARY        PIC  --,--9.

   EXEC SQL BEGIN DECLARE SECTION END-EXEC.
   01  DBNAME                  PIC  X(30) VALUE SPACE.
   01  USERNAME                PIC  X(30) VALUE SPACE.
   01  PASSWD                  PIC  X(10) VALUE SPACE.
   01  EMP-REC-VARS.
       05  EMP-NO              PIC S9(04).
       05  EMP-NAME            PIC  X(20) .
       05  EMP-SALARY          PIC S9(04).
   01  EMP-CNT                 PIC  9(04).
   EXEC SQL END DECLARE SECTION END-EXEC.

   EXEC SQL INCLUDE SQLCA END-EXEC.
  ******************************************************************
   PROCEDURE                   DIVISION.
  ******************************************************************
   MAIN-RTN.
       DISPLAY "*** FETCHTBL STARTED ***".
       
  *    WHENEVER IS NOT YET SUPPORTED :(
  *      EXEC SQL WHENEVER SQLERROR PERFORM ERROR-RTN END-EXEC.
       
  *    CONNECT
       MOVE  "testdb"          TO   DBNAME.
       MOVE  "postgres"        TO   USERNAME.
       MOVE  SPACE             TO   PASSWD.
       EXEC SQL
           CONNECT :USERNAME IDENTIFIED BY :PASSWD USING :DBNAME 
       END-EXEC.
       IF  SQLCODE NOT = ZERO PERFORM ERROR-RTN STOP RUN.
       
  *    SELECT COUNT(*) INTO HOST-VARIABLE
       EXEC SQL 
           SELECT COUNT(*) INTO :EMP-CNT FROM EMP
       END-EXEC.
       DISPLAY "TOTAL RECORD: " EMP-CNT.
       
  *    DECLARE CURSOR
       EXEC SQL 
           DECLARE C1 CURSOR FOR
           SELECT EMP_NO, EMP_NAME, EMP_SALARY 
                  FROM EMP
                  ORDER BY EMP_NO
       END-EXEC.
       EXEC SQL
           OPEN C1
       END-EXEC.
       
  *    FETCH
       DISPLAY "---- -------------------- ------".
       DISPLAY "NO   NAME                 SALARY".
       DISPLAY "---- -------------------- ------".
       EXEC SQL 
           FETCH C1 INTO :EMP-NO, :EMP-NAME, :EMP-SALARY
       END-EXEC.
       PERFORM UNTIL SQLCODE NOT = ZERO
          MOVE  EMP-NO        TO    D-EMP-NO
          MOVE  EMP-NAME      TO    D-EMP-NAME
          MOVE  EMP-SALARY    TO    D-EMP-SALARY
          DISPLAY D-EMP-REC
          EXEC SQL 
              FETCH C1 INTO :EMP-NO, :EMP-NAME, :EMP-SALARY
          END-EXEC
       END-PERFORM.
       
  *    CLOSE CURSOR
       EXEC SQL 
           CLOSE C1 
       END-EXEC. 
       
  *    COMMIT
       EXEC SQL 
           COMMIT WORK
       END-EXEC.
       
  *    DISCONNECT
       EXEC SQL
           DISCONNECT ALL
       END-EXEC.
       
  *    END
       DISPLAY "*** FETCHTBL FINISHED ***".
       STOP RUN.

  ******************************************************************
   ERROR-RTN.
  ******************************************************************
       DISPLAY "*** SQL ERROR ***".
       DISPLAY "SQLCODE: " SQLCODE " " NO ADVANCING.
       EVALUATE SQLCODE
          WHEN  +10
             DISPLAY "Record not found"
          WHEN  -01
             DISPLAY "Connection falied"
          WHEN  -20
             DISPLAY "Internal error"
          WHEN  -30
             DISPLAY "PostgreSQL error"
             DISPLAY "ERRCODE: "  SQLSTATE
             DISPLAY SQLERRMC
          *> TO RESTART TRANSACTION, DO ROLLBACK.
             EXEC SQL
                 ROLLBACK
             END-EXEC
          WHEN  OTHER
             DISPLAY "Undefined error"
             DISPLAY "ERRCODE: "  SQLSTATE
             DISPLAY SQLERRMC
       END-EVALUATE.
  ******************************************************************

Upvotes: 0

Views: 882

Answers (1)

Simon Sobisch
Simon Sobisch

Reputation: 7297

This is not "pure COBOL", but COBOL with embedded SQL, which in most cases needs a precompiler.
As-is there is a word EXEC where in COBOL a level-number would be expected, therefore the message from your compiler is correct.

In order to compile this source with your COBOL compiler, use an EXEC SQL precompiler to convert the SQL statements into COBOL for you first, most likely the one that the sample program references: ocesql - Open-COBOL-ESQL (PostgreSQL only).

As an alterative you can also use other preparsers (likely with some adjustments, especially for the CONNECT); here's an incomplete list:

  • esqlOC - ESQL for GnuCOBOL/OpenCobol (also works with other compilers, uses ODBC under the hood)
  • Gix ESQL, a recent addition, currently only as part of the Gix-IDE (GnuCOBOL only, currently uses a general ODBC or direct binding to PostgreSQL or MySql)

... and some proprietary variants (only to access their products)

  • Oracle Pro*COBOL
  • IBM DB2 precompiler
  • ...

Upvotes: 3

Related Questions