【问题标题】:Data isn't retrieved from database (SQLCODE 100) even though data exists即使数据存在,也不会从数据库中检索数据 (SQLCODE 100)
【发布时间】:2013-05-11 16:23:07
【问题描述】:

我正在从我的数据库中获取数据,其中一个条件将始终相同,而另一个条件将具有从 1 到 13 的值。查询必须执行 13 次,每个值执行一次。

一切都可以编译,但是当我查看输出时,我注意到用于从 SELECT 语句中检索数据的值从不包含任何值。当我在 SQL Server Management Studio 中使用硬编码的 WHERE 语句执行完全相同的查询时,会按预期检索数据。 我收到的SQLCODE100

当我省略PERFORM VARYING 循环并提供我的查询硬编码数据时,我的QUESTION-CODEANSWER-CODE 字段包含正确的数据,但AMOUNT 首先是空的,然后是零。

我在 SQL Server 2012 中使用 OpenCobol 编译器。

我忽略了什么?

01 WS-FIELDS.
    05 I PIC 9(2).

01 WS-EVALUATION.
    05 QUESTION-CODE PIC 9(3).
    05 ANSWER-CODE PIC 9(3).

01 WS-RESULT.
    05 OV PIC 9(3).
    05 V PIC 9(3).
    05 G PIC 9(3).
    05 ZG PIC 9(3).
    05 NVT PIC 9(3).
    05 AMOUNT PIC 9(3).

LINKAGE SECTION.
    01 ROUTE-CODE PIC X(10) VALUE SPACES.

   EXEC SQL
    DECLARE crs 
     CURSOR FOR
      SELECT QuestionCode, AnswerCode, COUNT(AnswerCode)
      FROM Answers
      WHERE Route = :ROUTE-CODE AND QuestionCode= :I
      GROUP BY QuestionCode, AnswerCode
    END-EXEC

    EXEC SQL
     OPEN crs
    END-EXEC

    PERFORM UNTIL SQLCODE <> 0
     PERFORM VARYING I FROM 1 BY 1 UNTIL I = 13

      EXEC SQL
       FETCH crs INTO :QUESTION-CODE, :ANSWER-CODE, AMOUNT
      END-EXEC

      IF SQLCODE = 0
       EVALUATE TRUE 
        WHEN ANSWER-CODE = 1
         MOVE AMOUNT TO OV
        WHEN ANSWER-CODE = 2
         MOVE AMOUNT TO V
        WHEN ANSWER-CODE = 3
         MOVE AMOUNT TO G
        WHEN ANSWER-CODE = 4
         MOVE AMOUNT TO ZG
        WHEN ANSWER-CODE = 5
         MOVE AMOUNT TO NVT
        WHEN OTHER
         DISPLAY "Error" UPON SYSOUT
       END-EVALUATE
      END-IF

     END-PERFORM
    END-PERFORM
   .     

【问题讨论】:

  • 我不了解 SQL Server,但对于 DB2 100 是找不到行。可能是类型不匹配造成的。尝试更改 Route = trim(:Route),问题代码也是数字???尝试将 I 定义为 comp 同步。
  • 我添加了 LTRIM(RTRIM()) 并将字段定义更改为 comp sync:两者都没有改变。我相信由于游标声明而存在错误:它是用变量I 声明的,但这个值永远不会被覆盖。我应该如何解决这个问题?我可以每次都用新值 I 覆盖这个光标吗?
  • 不,将 SQL 更改为 1 到 13 之间的 QuestionCode(或者是 0 到 14,我需要检查)并且不要使用 PERFORM VARYING I FROM 1 BY 1 UNTIL I = 13,你只需要 PERFORM UNTIL SQLCODE 0

标签: sql sql-server-2012 cobol


【解决方案1】:

更改如下:

    EXEC SQL
     DECLARE crs 
      CURSOR FOR
        SELECT QuestionCode, AnswerCode, COUNT(AnswerCode)
        FROM Answers
        WHERE Route = :ROUTE-CODE AND QuestionCode between 1 and 13
        GROUP BY QuestionCode, AnswerCode
        Order By QuestionCode
    END-EXEC

    EXEC SQL
     OPEN crs
    END-EXEC

    EXEC SQL
     FETCH crs
       ......
    END-EXEC

    PERFORM UNTIL SQLCODE <> 0

      EXEC SQL
        FETCH crs
          ......
      END-EXEC
    End-Perform

注意:您可能需要根据数据/逻辑检查是否缺少 QuestionCode

同样在 Cobol PERFORM UNTIL SQLCODE 0 在大多数语言中实际上是一个 while 循环。 如果您希望在循环结束时完成测试,请使用 With Test After 选项。

或者,您可以在每一行的循环中删除光标和选择。

【讨论】:

  • 这解决了问题(至少:我有 99% 的把握做到了。不能完全确定,因为变量中没有输入 COUNT(AnswerCode) 的值)!不过需要注意的是:ORDER BY 子句必须放在 GROUP BY 之后。
猜你喜欢
  • 2018-04-21
  • 1970-01-01
  • 2019-04-20
  • 2012-12-18
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 2018-05-18
相关资源
最近更新 更多