>

이 프로그램에서 호출 한 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

    Case 문에 END가 누락되어 커서에 WITH HOLD를 사용하면 도움이 될 것 같습니다.

    EXEC SQL
        DECLARE STOCK_070 CURSOR WITH HOLD 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
             END
                 ,A.CLIENT_ID
         END-EXEC.
        EXEC SQL
    
    

  • 이전 c# - HttpWebRequest, WebResponse 및 WebBrowser의 차이점
  • 다음 Taleo로 Google 태그 관리자를 어떻게 구성합니까?