我從數據庫中提取數據,其中一個條件總是相同,另一個條件將具有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