首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL游标重新打开GnuCOBOL中的错误

PostgreSQL游标重新打开GnuCOBOL中的错误
EN

Stack Overflow用户
提问于 2018-04-19 13:42:10
回答 1查看 589关注 0票数 5

我正试图从甲骨文转到PostgreSQL on GnuCOBOL。我有一段代码,它使用游标,需要多次打开游标。然而,当再次尝试打开游标时,我得到了错误ERROR: cursor "fetchtbl_c1" already exists

代码语言:javascript
复制
        IDENTIFICATION              DIVISION.
        PROGRAM-ID.                 FETCHTBL.

        DATA                        DIVISION.
        WORKING-STORAGE             SECTION.
        01  D-SOC-REC.
            05  D-SOC-NO-1          PIC  X(3).
            05  FILLER              PIC  X.
            05  D-SOC-NO-2          PIC  X(3).

        EXEC SQL BEGIN DECLARE SECTION END-EXEC.
        01  USERNAME                PIC  X(30) VALUE SPACE.
        01  SOC-REC-VARS.
            05  SOC-NO-1            PIC X(3).
            05  SOC-NO-2            PIC X(3).
        EXEC SQL END DECLARE SECTION END-EXEC.

        EXEC SQL INCLUDE SQLCA END-EXEC.
        PROCEDURE                   DIVISION.
        MAIN-RTN.
            MOVE  SPACE             TO   USERNAME.
            EXEC SQL
                CONNECT :USERNAME
            END-EXEC.
            IF  SQLCODE NOT = ZERO DISPLAY "ERROR CONNECTING".

       *    DECLARE CURSOR
            EXEC SQL
                DECLARE C1 CURSOR FOR
                SELECT SOC_NO_1, SOC_NO_2
                       FROM INSP
                       ORDER BY SOC_NO_1
            END-EXEC.
            EXEC SQL
                OPEN C1
            END-EXEC.
            IF SQLCODE = ZERO DISPLAY "OPEN SUCCESSFUL"
            ELSE DISPLAY "OPEN FAILED".

       *    FETCH
            EXEC SQL
                FETCH C1 INTO :SOC-NO-1,:SOC-NO-2
            END-EXEC.
            IF SQLCODE = ZERO DISPLAY "FETCH SUCCESSFUL"
            ELSE DISPLAY "FETCH FAILED".
            PERFORM UNTIL SQLCODE NOT = ZERO
               MOVE  SOC-NO-1      TO    D-SOC-NO-1
               MOVE  SOC-NO-2      TO    D-SOC-NO-2
               DISPLAY D-SOC-REC
               EXEC SQL
                   FETCH C1 INTO :SOC-NO-1,:SOC-NO-2
               END-EXEC
            END-PERFORM.

       *    CLOSE CURSOR
            EXEC SQL
                CLOSE C1
            END-EXEC.
            IF SQLCODE = ZERO DISPLAY "CLOSE SUCCESSFUL"
            ELSE DISPLAY "CLOSE FAILED".

       *    OPEN AGAIN
            EXEC SQL
                OPEN C1
            END-EXEC.
            IF SQLCODE = ZERO DISPLAY "REOPEN SUCCESSFUL"
            ELSE DISPLAY "REOPEN FAILED " SQLERRMC.
       *    COMMIT
            EXEC SQL
                COMMIT WORK
            END-EXEC.

       *    DISCONNECT
            EXEC SQL
                DISCONNECT ALL
            END-EXEC.

       *    END
            STOP RUN.

使用ocesql预编译代码,用cobc -x编译代码。

Postgres输出

代码语言:javascript
复制
OPEN SUCCESSFUL
FETCH SUCCESSFUL
003 001
005 001
CLOSE SUCCESSFUL
REOPEN FAILED ERROR:  cursor "fetchtbl_c1" already exists

上面的代码在Oracle中非常好地工作(连接部分除外)。

Oracle输出

代码语言:javascript
复制
OPEN SUCCESSFUL
FETCH SUCCESSFUL
003 001
CLOSE SUCCESSFUL
REOPEN SUCCESSFUL

我试过在网上搜索,但没有任何运气。有人能帮我吗?我使用的是PostgreSQL版本10.3和GnuCOBOL版本2.2.0。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-20 14:07:55

ocesql预编译器似乎存在一个问题.我在函数ocdb.c中放置了一个修复OCDBSetResultStatus,以便在没有结果资源的情况下返回一个成功的代码(对于打开的游标情况是这样的)。

这可能不是完全正确的,但经过几个小时的测试,我觉得这个很好。

代码更改:

代码语言:javascript
复制
int
OCDBSetResultStatus(int id, struct sqlca_t *st){
    struct s_conn *p_conn;
    int retval;

    p_conn = look_up_conn_lists(id);
    if(p_conn == NULL){
      //return OCDB_RES_FATAL_ERROR;
        return RESULT_ERROR;
    }
    if(p_conn->resaddr == OCDB_RES_DEFAULT_ADDRESS){
        // 結果リソースが無いため成功で返す
        // Ankit: uncommented since there is no result resource,
        //        (true in case of open cursor)
        return OCDB_RES_COMMAND_OK;
        //return RESULT_ERROR;
    }

#ifdef PGSQL_MODE_ON
    retval = OCDB_PGSetResultStatus(p_conn->resaddr,st);
#endif
    return retval;
}

如果有人因为这一变化而面临任何问题,请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49922636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档