我在db2 7.3中创建过程时遇到了问题。主要的想法是在给定的结束日期(应该是今天),从选定的特定表插入值,结果与fist_day(结束日期-3年)和last_day(结束日期-3年)的每个月直到今天都匹配。
目前正在返回这个错误。14:19:25 [CREATE - 0 row(s), 0.000 secs] [Error Code: -199, SQL State: 42601] [SQL0199] Palavra-chave FOR não esperada. 测试结果:;......。1条语句被执行,0行受影响,执行时间:0.0000.000秒 [0成功,0警告,1错误] 。以上是我的代码。
CREATE PROCEDURE MYLIB.SP_DIFJURO ()
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN
DECLARE DATAJURO DATE DEFAULT NULL;
FOR DATAJURO > (SELECT CURRENT_DATE - 3 YEAR FROM SYSIBM.SYSDUMMY1)
DO
INSERT INTO MYLIB.SDDIFJUROD (CONTAJURO, JUROCALC, JURODEBIT, DATAINICIO, DATAFIM)
SELECT NCJCCONTA, totaljurocalculado, NCLJVLRJ, LEFT(CHAR(LAST_DAY(DATAJURO), ISO),8)||'01', LAST_DAY(DATAJURO) FROM ( SELECT SUM(valorjurocalculado) totaljurocalculado, a.NCJCCONTA from
(SELECT C.NCJCCONTA NCJCCONTA, C.NCJCDTPRO, C.NCJCDTJUR,
CASE
WHEN R.NCJCTREG = 'R' THEN R.NCJCSLDV
ELSE C.NCJCSLDV
END saldodatavalor,
CASE
WHEN R.NCJCTREG = 'R' THEN round(R.NCJCTXC,2)
ELSE round(C.NCJCTXC,2)
END taxadiaria, decimal(round((ifnull(R.NCJCSLDV, C.NCJCSLDV)*ifnull(R.NCJCTXC, C.NCJCTXC)/100)/360,2),15,2) valorjurocalculado
FROM (
SELECT NCJCCONTA, NCJCDTPRO, NCJCDTJUR, NCJCTREG, NCJCSLDV, NCJCMOED, NCJCTXC FROM MYLIB.LOGJR
WHERE NCJCDTJUR BETWEEN LEFT(VARCHAR_FORMAT(LAST_DAY(DATAJURO), 'YYYYMMDD'),6)||'01' AND VARCHAR_FORMAT(LAST_DAY(DATAJURO), 'YYYYMMDD')
AND NCJCCLCP = 'DO' AND NCJCTREG = 'C' AND NCJCNUMVD < 0 ) C
LEFT JOIN
(SELECT NCJCCONTA, NCJCDTPRO, NCJCDTJUR, NCJCTREG, NCJCSLDV, NCJCMOED, NCJCTXC FROM MYLIB.LOGJR
WHERE NCJCDTJUR BETWEEN LEFT(VARCHAR_FORMAT(LAST_DAY(DATAJURO), 'YYYYMMDD'),6)||'01' AND VARCHAR_FORMAT(LAST_DAY(DATAJURO), 'YYYYMMDD')
AND NCJCCLCP = 'DO' AND NCJCTREG = 'R' AND NCJCNUMVD < 0) R
ON C.NCJCCONTA = R.NCJCCONTA AND C.NCJCDTJUR = R.NCJCDTJUR
) a group by a.NCJCCONTA
)jurocalc
INNER JOIN MYLIB.LJRDC ON NCLJCONTA = NCJCCONTA
AND LEFT(NCLJBUFFER, 16) = LEFT(VARCHAR_FORMAT(LAST_DAY(DATAJURO), 'YYYYMMDD'),6)||'01'||VARCHAR_FORMAT(LAST_DAY(DATAJURO), 'YYYYMMDD')
WHERE int(ABS(totaljurocalculado)) != int(ABS(NCLJVLRJ));
SET DATAJURO = (SELECT DATAJURO - 1 MONTH FROM SYSIBM.SYSDUMMY1);
END FOR;
END
错误的使用 FOR
语句。
FOR
在SQLPL中并不像 for loop
在一些编程语言如c或java中。你必须使用 SELECT
声明与 FOR
的结果集,它迭代了这个 SELECT
为您提供了一种能力,使您能够在声明中引用相应的列值。FOR
光标名 C1
. 在下面的例子中 SELECT
语句,使用递归通用表表达式,从 CURRENT_DATE - 3 YEARS
到 CURRENT_DATE
. 你可以运行这个 SELECT
单机版检查稍微修改一下它的条件,以返回所需的准确日期列表。注意,你不需要使用 SET
语句来增加你的 "循环变量" C1.DATAJURO
,因为 SELECT
语句处理这个问题。
FOR C1 AS
WITH DATES (DT) AS
(
VALUES FIRST_DAY(CURRENT_DATE)
UNION ALL
SELECT DT - 1 MONTH
FROM DATES
WHERE DT > CURRENT_DATE - 3 YEAR
)
SELECT LAST_DAY(DT) AS DATAJURO
FROM DATES
DO
INSERT INTO MYLIB.SDDIFJUROD ...
... C1.DATAJURO ...
END FOR;