我之前从未编写脚本,而且我的工作任务是为以下内容编写脚本:
我们有一张桌子" WRCF_Day"。此表的目的是列出所有机制的DATE_HIRED和DATE_END之间的每一天。因此,Mech1于2017年1月1日被聘用,并于2017年5月7日离开,它将在这两个日期之间的每个日期都有一个单独的记录。这个以及其他一些补充内容可以让我们看到谁被安排上班,无论他们是否及时进入其他无关的表。使用DATE_HIREd和DATE_END字段的所有Mech(活动和非活动)列表位于表" 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于1月1日17日被雇用,表格显示了他在1/1/17和当前日期之间的每个日期。 Mech1实际上是6/30/17。这将在" SD_CF"中更新在DATE_END下。然而," WRCF_DAY"将继续为每个日期生成新记录,因为它尚未使用新的DATE_END进行更新。因此,在删除之前,该表显示1/17/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。"
我希望这是有道理的。任何帮助都会很棒!如果有一个更好的脚本来根据参数在另一个表中插入记录,我可以使用其他选项。
答案 0 :(得分:0)
您的案例不需要Cursor,Loops等。只需使用CONNECT BY LEVEL
在SQL中加入日期生成器,即可将插入内容写入表中。
INSERT INTO AFM_PHILADELPHIA.SD_WRCF_DAY a
(CF_ID, DATE_ASSIGNED
)
SELECT b.CF_ID,
dates.dte DATE_ASSIGNED
FROM AFM_PHILADELPHIA.SD_CF b ,
( SELECT SYSDATE -30 + LEVEL dte FROM DUAL CONNECT BY LEVEL < 30
) dates
WHERE b.DATE_END > TRUNC(sysdate-30)
OR b.DATE_END IS NULL;