【发布时间】:2020-01-24 22:53:14
【问题描述】:
我正在尝试根据条件增加日期(当日期大于另一个时):
CREATE OR REPLACE PROCEDURE schema.procedura
AS
dt_lst DATE;
dt_md DATE;
eu_val INT;
BEGIN
for i in (select rowid, TABLELORIK.* from TABLELORIK)
LOOP
dt_md := to_date('20290401','YYYYMMDD');
dt_lst := to_date('20190802','YYYYMMDD');
eu_val := 180
while dt_md > dt_lst
LOOP
dt_lst := dt_lst + eu_val;
END LOOP;
UPDATE TABLELORIK set DATE_COL = to_char(dt_lst,'YYYYMMDD') where rowid=i.rowid;
COMMIT;
END LOOP;
END procedura;
/
在这种情况下,我想要的输出是 DATE_COL = 20281212(实际上它比 dt_md 小,循环应该停在那里!)
在这种情况下,我的循环输出是什么:20290610(额外的 +180 天(一个循环步骤,现在条件 dt_md > dt_lst 已损坏))
有人可以帮我完成最后一步以停止循环而不通过 dt_md。
【问题讨论】:
-
为什么要循环执行此操作?还是完全使用 PL/SQL? (为什么要将日期存储为字符串!?)
-
快速修复是
... WHILE dt_md > dt_lst + eu_val LOOP ...。但我认为这不需要任何缓慢的程序部分。 -
不需要循环或过程,计算简单:
dt_lst + trunc((dt_md-dt_lst) / 180) * 180 -
你到底为什么将
DATE值存储为s 字符串(或数字)?不要那样做,将列DATE_COL转换为正确的DATE数据类型。 -
正如其他人已经说过的那样,不需要循环。除此之外,当您使用
WHERE ROWID = ...时,您应该使用FOR UPDATE锁定记录,否则ROWID可能会更改。见stackoverflow.com/questions/49110728/where-current-of-in-pl-sql/…