带案例的游标

时间:2018-08-21 20:11:18

标签: sql db2 cics

我有一个类似程序的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,因此行为被弄乱了。

要进一步说明-它的光标,所以它被称为3次MaxCall(程序中定义的MaxCall,此处未显示)。然后关闭光标。然后,如果用户需要更多结果,则重新启动光标。因此,为什么重新启动代码很重要-它告诉数据库不要重新从头开始。

例如

此数据集-(格式为A.CLIENT_ID-C1.CUR_ASMT_SCD)=(20-6,21-6,22-6,23-6,01-4,27-04,29-4)。< / p>

应按以下顺序显示:

 20,21,22,23,01,27,29

如果MaxCall为3,并且SQL中没有重新启动代码-它将返回

 20,21,22,20,21,22,20,21,22 ... ad infinitum.
 (which explains why a Restart is needed).

使用当前显示的Restart(在Order by中的CASE语句添加之后):

 20,21,22,23,27,29

省略一些结果(因为客户端01低于23,因此被丢弃)。

因此,我需要的是一种更改重新启动代码的方法,以解决Order By子句中添加的CASE语句。

是否可以通过SQL解决此问题?

1 个答案:

答案 0 :(得分:0)

在我看来,您似乎在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