2013-05-11 31 views
0

我从数据库中提取数据,其中一个条件总是相同,另一个条件将具有1到13的值。该查询必须执行13次,每个值一次。即使数据存在,也不从数据库(SQLCODE 100)中检索数据

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

当我省略了PERFORM VARYING循环,给我的查询硬编码的数据,我QUESTION-CODEANSWER-CODE字段包含正确的数据,但AMOUNT一个是先空,则为零。

我使用的是SQL Server中的OpenCobol编译2012年

我是什么俯瞰?

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 
    .  
+0

我不知道SQL Server,但是对于DB2 100,找不到行。这可能会导致类型不匹配。尝试更改Route = trim(:Route),也是问题代码数字?尝试将我定义为音频同步。 – 2013-05-11 21:32:49

+0

我已经添加了LTRIM(RTRIM()),并将字段定义更改为压缩同步:两者都没有改变。我相信这个错误是因为游标声明而存在的:它用变量'I'声明,但是这个值永远不会被覆盖。我应该如何解决这个问题?我可以每次用新的I值覆盖这个光标吗? – 2013-05-11 21:51:31

+0

不,将SQL更改为1到13之间的QuestionCode(或者它是0和14,我需要检查),并且不要使用PERFORM VARYING I FROM 1 BY 1直到I = 13,您只需要PERFORM UNTIL SQLCODE < > 0 – 2013-05-11 22:14:25

回答

2

变化如下:

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选项。

另外,你可以删除游标和每一行循环中的选择。

+0

解决了这个问题(至少:我99%确定它已经完成了,无法完全确定,因为'COUNT(AnswerCode)'的值没有被输入到变量中)!小记:'ORDER BY'子句必须放在'GROUP BY'之后。 – 2013-05-12 11:08:15