我有一个类似程序的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解决此问题?
答案 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