【发布时间】:2017-08-04 22:13:52
【问题描述】:
我以前从未编写过脚本,我在工作中的任务是为以下内容编写脚本:
我们有一个表“WRCF_Day”。此表的目的是列出 DATE_HIRED 和 DATE_END 之间所有机制的每一天。因此,Mech1 于 2017 年 1 月 1 日被聘用并于 2017 年 5 月 7 日离开,这两个日期之间的每个日期都会有单独的记录。这和其他一些添加可以让我们看到谁被安排在工作日,无论他们是否及时输入其他不相关的表格。所有机甲的列表,包括 DATE_HIREd 和 DATE_END 字段,在表“SD_CF”中。
我们需要删除过去 30 天内的记录,然后插入更新的记录,这样我们就可以考虑变化,例如员工在该时间段内被雇用或离职。
我已经编写了删除过去 30 天记录的脚本,不再使用日期字段名称“DATE_ASSIGNED”。为了插入记录,我和我的主管编写了以下脚本:
DECLARE
CURSOR c_cf IS SELECT b.CF_ID FROM AFM_PHILADELPHIA.SD_CF b
WHERE b.DATE_END > trunc(sysdate-30) OR b.DATE_END is null;
r_cf c_cf%ROWTYPE;
BEGIN
FOR i in 1..30 LOOP
OPEN c_cf;
LOOP
FETCH c_cf INTO r_cf;
EXIT WHEN c_cf%NOTFOUND;
INSERT INTO AFM_PHILADELPHIA.SD_WRCF_DAY a (CF_ID, DATE_ASSIGNED)
VALUES (r_cf.CF_ID, sysdate-i);
END LOOP;
CLOSE c_cf;
END LOOP;
END;
我得到“匿名块完成”的结果,并且没有记录被插入到 WRCF_DAY 表中。
如果我们在过去 30 天内没有始终如一地重新插入,那么如果有人在该时间段内离开,表格将不会更新,并且会继续将他们归因于可以工作,即使他们已经离开或不包括新员工。
示例:机甲 1 于 2017 年 1 月 1 日被雇用,表格显示了他在 2017 年 1 月 1 日到当前日期之间的每个日期。 Mech1 实际上离开 6/30/17。这将在 DATE_END 下的“SD_CF”中更新。但是,“WRCF_DAY”将继续为每个日期生成一条新记录,因为它尚未使用他的新 DATE_END 进行更新。所以在删除之前,表格显示了 1/1/17 和 7/13/17 之间的 Mech 1 记录,最后 30 条被删除,然后我们想重新插入 DATE_END 大于最后 30 天的记录,所以它将反映他离开的事实,并且仅显示 1/1/7 到 6/30/17 之间的记录。
人们不断地来来往往,我们需要相应地更新表格,通常一次有大约 400 个机制,因此脚本需要运行“SD_CF”中的每个机制,确定他们的 DATE_HIRED 或 DATE_END 是否符合我们的参数,然后将适当数量的记录插入“WRCF_Day”。
我希望这是有道理的。任何帮助都会很棒!如果有更好的脚本可以根据参数在另一个表中插入记录,我愿意接受其他选择。
【问题讨论】:
标签: sql oracle oracle-sqldeveloper