2013-05-11 67 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