根据符合某些参数的另一个表中的记录插入记录(SQL Developer)

时间:2017-08-04 13:32:03

标签: sql oracle oracle-sqldeveloper

我之前从未编写脚本,而且我的工作任务是为以下内容编写脚本:

我们有一张桌子" 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。"

我希望这是有道理的。任何帮助都会很棒!如果有一个更好的脚本来根据参数在另一个表中插入记录,我可以使用其他选项。

1 个答案:

答案 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;