2013-05-11 2 views
0

조건 중 하나가 항상 같고 다른 조건 중 하나가 1에서 13 사이의 값을 갖는 데이터베이스에서 데이터를 가져옵니다. 쿼리는 각 값에 대해 한 번씩 13 번 실행해야합니다.데이터가 존재하더라도 데이터가 데이터베이스 (SQLCODE 100)에서 검색되지 않습니다.

모든 것이 컴파일되지만 출력을 보면 SELECT 문에서 데이터를 검색하는 데 사용 된 값이 절대로 값을 보유하지 않음을 알 수 있습니다. SQL Server Management Studio에서 하드 코드 된 WHERE 문을 사용하여 정확히 동일한 쿼리를 실행하면 데이터가 예상대로 검색됩니다. 내가받는 SQLCODE100입니다. 내가 하드 코드 된 데이터를 PERFORM VARYING 루프를 생략하고 내 쿼리를 줄 때

QUESTION-CODEANSWER-CODE 필드는 올바른 데이터를 포함하고 있지만, AMOUNT 하나는, 제로 빈 처음이다.

나는 2012 년

나는 무엇을 내려다하고 SQL 서버와 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 
    .  
+0

SQL Server에 대해 잘 모르겠지만 DB2 100의 경우 행을 찾을 수 없습니다. 유형이 일치하지 않을 수 있습니다. Route = trim (: Route)를 변경해보십시오. 또한 질문 코드 숫자입니까 ??? I를 comp sync로 정의 해보십시오. –

+0

LTRIM (RTRIM())을 추가하고 필드 정의를 comp sync로 변경했습니다. 차이가 없습니다. 나는 커서 선언 때문에 에러가 존재한다고 믿는다 : 그것은 변수'I'로 선언되었지만,이 값은 결코 덮어 쓰이지 않는다. 이 문제를 어떻게 해결해야합니까? 이 커서를 매번 새로운 값 I로 덮어 쓸 수 있습니까? –

+0

아니요, 1에서 13 사이의 QuestionCode로 SQL을 변경하십시오 (또는 0과 14가 맞는지 확인해야합니다). 그리고 사용하지 마십시오. 1에서 1까지 가변 1 = 13, SQLCODE UNTIL 만 필요합니다. > 0 –

답변

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 데이터에 따라 누락 된 경우 확인해야 할 수 있습니다 코볼에서 또한

이 SQLCODE UNTIL PERFORM/논리를 <> 0 실제로 대부분의 언어에서 while 루프입니다. 루프 끝에서 테스트를 수행하려면 옵션 뒤에 테스트 옵션을 사용하십시오.

대신 커서를 제거하고 각 행의 루프에서 선택 항목을 제거 할 수 있습니다.

+0

그게 문제를 풀었습니다 (최소한 : 저는 99 퍼센트를 확신했습니다. 변수에'COUNT (AnswerCode)'의 값이 입력되지 않았기 때문에 완전히 말할 수는 없습니다)! 작은 노트 : 'ORDER BY' 절은 GROUP BY 뒤에 위치해야합니다. –

관련 문제