首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带大小写的光标

带大小写的光标
EN

Stack Overflow用户
提问于 2018-08-22 04:11:18
回答 1查看 104关注 0票数 0

我有一个由程序调用的SQL游标,如下所示

代码语言:javascript
复制
   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语句的情况下是有效的。但是,当然,在添加了案例之后,行为是混乱的,因为重启没有考虑到案例。

为了进一步解释-它是一个游标,所以它被称为,比方说,一个3次的MaxCall (MaxCall在程序中定义,这里没有显示)。然后关闭光标。然后,如果用户需要更多结果,则重新启动光标。因此,为什么重新启动代码很重要-它告诉数据库不要从头重新启动。

例如,

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

应按以下顺序显示:

代码语言:javascript
复制
 20,21,22,23,01,27,29

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

代码语言:javascript
复制
 20,21,22,20,21,22,20,21,22 ... ad infinitum.
 (which explains why a Restart is needed).

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

代码语言:javascript
复制
 20,21,22,23,27,29

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

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

有没有办法通过SQL解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2018-08-23 20:10:38

在我看来,您可能缺少CASE语句中的END,也许在游标上使用WITH HOLD会有所帮助。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51956033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档