我从数据库中提取数据,其中一个条件总是相同,另一个条件将具有1到13的值。该查询必须执行13次,每个值一次。即使数据存在,也不从数据库(SQLCODE 100)中检索数据
一切都在编译,但是当我看着输出时,我注意到用于从SELECT
语句检索数据的值从不保留任何值。当我使用SQL Server Management Studio中的硬编码WHERE
语句执行完全相同的查询时,数据按预期检索。我收到的SQLCODE
是100
。
当我省略了PERFORM VARYING
循环,给我的查询硬编码的数据,我QUESTION-CODE
和ANSWER-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
.
我不知道SQL Server,但是对于DB2 100,找不到行。这可能会导致类型不匹配。尝试更改Route = trim(:Route),也是问题代码数字?尝试将我定义为音频同步。 – 2013-05-11 21:32:49
我已经添加了LTRIM(RTRIM()),并将字段定义更改为压缩同步:两者都没有改变。我相信这个错误是因为游标声明而存在的:它用变量'I'声明,但是这个值永远不会被覆盖。我应该如何解决这个问题?我可以每次用新的I值覆盖这个光标吗? – 2013-05-11 21:51:31
不,将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