DB2 i 7.3:编写循环(使用日期变量)从select中插入值的存储过程。

问题描述 投票:0回答:1

我在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
sql stored-procedures db2 db2-400
1个回答
0
投票

错误的使用 FOR 语句。

FOR 在SQLPL中并不像 for loop 在一些编程语言如c或java中。你必须使用 SELECT 声明与 FOR的结果集,它迭代了这个 SELECT 为您提供了一种能力,使您能够在声明中引用相应的列值。FOR 光标名 C1. 在下面的例子中 SELECT 语句,使用递归通用表表达式,从 CURRENT_DATE - 3 YEARSCURRENT_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;
© www.soinside.com 2019 - 2024. All rights reserved.