使用 gixsql 进行预处理会添加无法编译的 gnucobol 代码

问题描述 投票:0回答:2

我最近开始在我正在进行的一个项目中使用 gixsql。 https://github.com/mridoni/gix/blob/main/doc/gixsql.md

我按照自述文件中的示例进行操作,但是使用 GnuCobol 进行编译时,示例 TEST001.cbsql 不起作用:

TEST001.cbsql: in paragraph 'GIXSQL-CI-P-TEST001-EMPTBL':
TEST001.cbsql:394: error: syntax error, unexpected Identifier
TEST001.cbsql: in paragraph '100-EXIT':
TEST001.cbsql:383: error: 'GIX-SKIP-CRSR-INIT' is not defined

如果我删除此生成的代码,则程序可以编译,尽管它从程序中删除了一个重要部分并且无法正常工作。只是想知道我可能做错了什么?我按照示例使用 GnuCobol 编译预处理的 cobol 以连接到 PostGres 数据库。

cobc -x TEST001.cbsql -L /opt/gixsql/lib -lgixsql

这是导致编译问题的生成部分:

GIXSQL*
GIXSQL*   ESQL CURSOR DECLARATIONS (START)
GIXSQL     GO TO GIX-SKIP-CRSR-INIT.
GIXSQL GIXSQL-CI-P-TEST001-EMPTBL.
GIXSQL     CALL STATIC "GIXSQLCursorDeclare" USING
GIXSQL         BY REFERENCE SQLCA
GIXSQL         BY REFERENCE x"00"
GIXSQL         BY VALUE 0
GIXSQL         BY REFERENCE "TEST001_EMPTBL" & x"00"
GIXSQL         BY VALUE 0
GIXSQL         BY REFERENCE SQ0001
GIXSQL         BY VALUE 0
GIXSQL     END-CALL
GIXSQL GIX-SKIP-CRSR-INIT.
GIXSQL*
GIXSQL*   ESQL CURSOR DECLARATIONS (END)

原始 cbl 文件来自 gixsql 示例

       IDENTIFICATION DIVISION.
       
       PROGRAM-ID. TEST001. 
       
       
       ENVIRONMENT DIVISION. 
       
       CONFIGURATION SECTION. 
       SOURCE-COMPUTER. IBM-AT. 
       OBJECT-COMPUTER. IBM-AT. 
       
       INPUT-OUTPUT SECTION. 
       FILE-CONTROL. 
       
       DATA DIVISION.  
       
       FILE SECTION.  
       
       WORKING-STORAGE SECTION. 
       
       EXEC SQL 
        INCLUDE EMPREC 
       END-EXEC. 
       
           01 DBNAME PIC X(64).
           01 DBAUTH PIC X(64).
           01 T1     PIC 9(3) VALUE 0.  
           01 DISP-RATE PIC 9(15). 
           01 DISP-COM PIC 9(3).  
           01 DISP-CODE PIC 9(8). 
           01 FAKE-CHAR PIC X.  
           01 ANSS PIC X. 
           01 COM-NULL-IND PIC S9(4) COMP. 
           
           01 VARC PIC X(20).
           01 VARD PIC X(20).
       
       EXEC SQL 
            INCLUDE SQLCA 
       END-EXEC. 
      *  declare cursor for select 
           EXEC SQL
               DECLARE EMPTBL CURSOR FOR
               SELECT                     
                    ENO,
                    LNAME,
                    FNAME,
                    STREET,
                    CITY,
                    ST,
                    ZIP,
                    DEPT,
                    PAYRATE,
                    COM,
                    MISCDATA
                 FROM EMPTABLE
               ORDER BY LNAME
           END-EXEC              
       PROCEDURE DIVISION. 
 
       000-CONNECT.
         DISPLAY "DBNAME" UPON ENVIRONMENT-NAME.
         ACCEPT DBNAME FROM ENVIRONMENT-VALUE.
         DISPLAY "DBAUTH" UPON ENVIRONMENT-NAME.
         ACCEPT DBAUTH FROM ENVIRONMENT-VALUE.
         
      *   DISPLAY '***************************************'.
      *   DISPLAY " DB  : " DBNAME.
      *   DISPLAY " USER: " DBAUTH.
      *   DISPLAY '***************************************'.

           EXEC SQL
              CONNECT TO :DBNAME USER :DBAUTH
           END-EXEC.      
           
           IF SQLCODE <> 0 THEN
              DISPLAY 'SQLCODE. ' SQLCODE
              DISPLAY 'SQLERRM. ' SQLERRM
              GO TO 100-EXIT
           END-IF.
       100-MAIN.

           EXEC SQL
              START TRANSACTION
           END-EXEC.                                                    
       
      *  open cursor
           EXEC SQL
               OPEN EMPTBL
           END-EXEC 
           MOVE SQLCODE TO DISP-CODE
           DISPLAY 'open ' DISP-CODE.
           DISPLAY 'open ' SQLERRM.
       
      *  fetch a data item 
           EXEC SQL
               FETCH EMPTBL INTO 
                 :ENO,:LNAME,:FNAME,:STREET,:CITY, 
                 :ST,:ZIP,:DEPT,:PAYRATE, 
                 :COM,:MISCDATA
           END-EXEC. 
       
       100-test. 
           MOVE SQLCODE TO DISP-CODE
           DISPLAY 'fetch ' DISP-CODE
       
      *  loop until no more data
           PERFORM UNTIL SQLCODE < 0 OR SQLCODE = 100
       
      *  display the record
           MOVE PAYRATE TO DISP-RATE
           MOVE COM TO DISP-COM
           DISPLAY 'employee #: [' ENO ']'
           
           DISPLAY 'last name : [' LNAME ']'
           DISPLAY 'first name: [' FNAME ']'
           DISPLAY 'street    : [' STREET ']'
           DISPLAY 'city      : [' CITY ']'
           DISPLAY 'state     : [' ST ']'
           DISPLAY 'zip code  : [' ZIP ']'
           DISPLAY 'department: [' DEPT ']'
           DISPLAY 'payrate   : [' PAYRATE ']'
           DISPLAY 'commission: [' COM ']'
           DISPLAY 'misc      : [' MISCDATA-TEXT ']'
           DISPLAY 'misc (len): [' MISCDATA-LEN ']'
           
           IF COM-NULL-IND < 0 
               DISPLAY 'commission is null' 
           ELSE 
               DISPLAY 'commission ' DISP-COM 
           END-IF 
      *     DISPLAY 'Do you want to see the next record? (y/n)' 
      *     ACCEPT ANSS 
      *     IF ANSS = 'Y' OR 'y' 
               EXEC SQL 
                 FETCH EMPTBL INTO 
                   :ENO,:LNAME,:FNAME,:STREET,:CITY, 
                   :ST,:ZIP,:DEPT,:PAYRATE, 
                   :COM,:MISCDATA
               END-EXEC 
      *     ELSE 
      *         GO TO CLOSE-LOOP 
      *     END-IF 
           MOVE SQLCODE TO DISP-CODE 
           DISPLAY 'fetch ' DISP-CODE 
           DISPLAY 'fetch ' SQLCODE 
           END-PERFORM  
       
           DISPLAY 'All records in this table have been selected'. 
       
       CLOSE-LOOP.
      *  close the cursor 
           EXEC SQL 
               CLOSE EMPTBL 
           END-EXEC. 
       
       100-EXIT. 
             STOP RUN.
preprocessor cobol gnucobol
2个回答
2
投票

使用我们的 Enterprise COBOL 编译器,我会收到一条类似于“需要句点”的消息 - 在开始新部分之前,您必须以句点结束前一句

.
。 所以尝试在
GIX-SKIP-CRSR-INIT.
之前添加句点:

GIXSQL GIXSQL-CI-P-TEST001-EMPTBL.
GIXSQL     CALL STATIC "GIXSQLCursorDeclare" USING
GIXSQL         BY REFERENCE SQLCA
GIXSQL         BY REFERENCE x"00"
GIXSQL         BY VALUE 0
GIXSQL         BY REFERENCE "TEST001_EMPTBL" & x"00"
GIXSQL         BY VALUE 0
GIXSQL         BY REFERENCE SQ0001
GIXSQL         BY VALUE 0
GIXSQL     END-CALL
           .
GIXSQL GIX-SKIP-CRSR-INIT.

但是不要问我为什么它不是由你的工具生成的...


0
投票

将 GNU Cobol 方言设置为 imb 即可 -std=ibm

ibm cobol 语法更加宽松,可以接受不带句点的段落

© www.soinside.com 2019 - 2024. All rights reserved.