조건 중 하나가 항상 같고 다른 조건 중 하나가 1에서 13 사이의 값을 갖는 데이터베이스에서 데이터를 가져옵니다. 쿼리는 각 값에 대해 한 번씩 13 번 실행해야합니다.데이터가 존재하더라도 데이터가 데이터베이스 (SQLCODE 100)에서 검색되지 않습니다.
모든 것이 컴파일되지만 출력을 보면 SELECT
문에서 데이터를 검색하는 데 사용 된 값이 절대로 값을 보유하지 않음을 알 수 있습니다. SQL Server Management Studio에서 하드 코드 된 WHERE
문을 사용하여 정확히 동일한 쿼리를 실행하면 데이터가 예상대로 검색됩니다. 내가받는 SQLCODE
은 100
입니다. 내가 하드 코드 된 데이터를 PERFORM VARYING
루프를 생략하고 내 쿼리를 줄 때
내 QUESTION-CODE
및 ANSWER-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
.
SQL Server에 대해 잘 모르겠지만 DB2 100의 경우 행을 찾을 수 없습니다. 유형이 일치하지 않을 수 있습니다. Route = trim (: Route)를 변경해보십시오. 또한 질문 코드 숫자입니까 ??? I를 comp sync로 정의 해보십시오. –
LTRIM (RTRIM())을 추가하고 필드 정의를 comp sync로 변경했습니다. 차이가 없습니다. 나는 커서 선언 때문에 에러가 존재한다고 믿는다 : 그것은 변수'I'로 선언되었지만,이 값은 결코 덮어 쓰이지 않는다. 이 문제를 어떻게 해결해야합니까? 이 커서를 매번 새로운 값 I로 덮어 쓸 수 있습니까? –
아니요, 1에서 13 사이의 QuestionCode로 SQL을 변경하십시오 (또는 0과 14가 맞는지 확인해야합니다). 그리고 사용하지 마십시오. 1에서 1까지 가변 1 = 13, SQLCODE UNTIL 만 필요합니다. > 0 –