我有一个由程序调用的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语句的情况下是有效的。但是,当然,在添加了案例之后,行为是混乱的,因为重启没有考虑到案例。
为了进一步解释-它是一个游标,所以它被称为,比方说,一个3次的MaxCall (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中没有重新启动代码,它将返回
20,21,22,20,21,22,20,21,22 ... ad infinitum.
(which explains why a Restart is needed).使用当前显示的重新启动(在添加Order by中的CASE语句之后):
20,21,22,23,27,29遗漏了一些结果(因为客户端01低于23,因此被丢弃)。
因此,我需要的是一种更改重新启动代码的方法,以解决Order By子句中添加的CASE语句。
有没有办法通过SQL解决这个问题?
发布于 2018-08-23 20:10:38
在我看来,您可能缺少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 SQLhttps://stackoverflow.com/questions/51956033
复制相似问题