홈>
이 프로그램에서 호출 한 SQL 커서가 있습니다
EXEC SQL
DECLARE STOCK_070 CURSOR FOR
SELECT
A.CLIENT_ID,
C1.CUR_ASMT_SCD,
FROM VSTOCK A
LEFT JOIN VASSES C1
ON C1.CLIENT_ID = A.CLIENT_ID
WHERE
B1.STKPL_RULE_NBR = :STRSN-STKPL-RULE-NBR
AND DATE(A.CDTTM) >= :IOB3-DATE1
AND DATE(A.CDTTM) <= :IOB3-DATE2
*RESTART
AND
(A.CLIENT_ID = :STOCK-CLIENT-ID
OR
A.CLIENT_ID > :STOCK-CLIENT-ID)
*RESTART
ORDER BY
CASE WHEN C1.CUR_ASMT_SCD = '06'
THEN 1
WHEN C1.CUR_ASMT_SCD = '04'
THEN 2
WHEN C1.CUR_ASMT_SCD = '07'
THEN 3
,A.CLIENT_ID
END
END-EXEC.
EXEC SQL
이것은 CASE 문없이 작동합니다. 그러나 CASE가 추가 된 후 RESTART가 CASE를 설명하지 않으므로 동작이 엉망이됩니다.
자세한 설명을 위해-커서, 즉 MaxCall의 3 배 (프로그램에는 MaxCall이 정의되어 있으며 여기에는 표시되지 않음)라고합니다. 그런 다음 커서가 닫힙니다. 그런 다음 사용자에게 더 많은 결과가 필요한 경우 커서가 다시 시작됩니다. 따라서 재시작 코드가 중요한 이유는 데이터베이스가 처음부터 다시 시작하지 않도록 지시하는 것입니다.
예 :
이 데이터 세트-(A.CLIENT_ID-C1.CUR_ASMT_SCD 형식) = (20-6,21-6,22-6,23-6,01-4,27-04,29-4).
이 순서로 표시해야합니다 :
20,21,22,23,01,27,29
MaxCall이 3이고 SQL에 RESTART CODE가없는 경우 반환됩니다.
20,21,22,20,21,22,20,21,22 ... ad infinitum.
(which explains why a Restart is needed).
현재 표시된 재시동 (순서대로 CASE 문이 추가 된 후) :
20,21,22,23,27,29
클라이언트 01이 23보다 작고 버려지기 때문에 일부 결과는 제외합니다.
따라서, 주문 기준 절에 추가 된 CASE 문을 설명하기 위해 재시작 코드를 변경하는 방법이 필요합니다.
SQL을 통해이 문제를 해결할 수있는 방법이 있습니까?
- 답변 # 1
관련 자료
- sql - 테이블 조인과 함께 CASE 사용
- database - SQL에서 ORDER BY를 사용한 CASE 이해
- sql - CASE WHEN과 함께 그룹화?
- postgresql - SQL SELECT에서 INTERSECT가있는 CASE
- sql - PostgreSQL에서 대소 문자 구분을 처리하는 방법
- sqlite - 그룹별로 사례 설명을 사용하는 방법은 무엇입니까?
- LIKE를 사용한 MySQL 사례 조건
- html - CSS로 커서를 어떻게 애니메이션합니까?
- java - 케이스가있는 HQL, 합계 e 최대
- syntax - sql - and 및 or를 사용한 대소 문자 표현
Case 문에 END가 누락되어 커서에 WITH HOLD를 사용하면 도움이 될 것 같습니다.