【问题标题】:Inserting Records based on records in another table meeting certain parameters (SQL Developer)根据另一个表中满足某些参数的记录插入记录(SQL Developer)
【发布时间】: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


    【解决方案1】:

    您的情况不需要光标、循环等。只需使用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; 
    

    【讨论】:

    • 所以我在 SQL Developer 中运行了它,它成功了,输出告诉我插入了 57913 行。但是,当我在 MS Access 中检查表时,在过去 30 天内没有添加新记录,然后 MS Access 出现了关于粘贴到 DATE_ASSIGNED 中的错误,并在该表中创建了一个名为 Paste Errors 的新表是上面的代码。所以我不确定发生了什么......
    • 应该是 MS 访问的一些问题。如果可以解决,请检查此链接:answers.microsoft.com/en-us/msoffice/forum/…。另外,既然您在 SQL developer 中说它是 57913 rows inserted,您可以从 sql developer 查询同一张表并检查是否插入了所有预期的最近记录?
    • 过去 30 天内没有最近的记录插入到表中。我不知道应该插入了哪些 57913 行,但它们不是最近的。
    • 另外,如果我继续重新运行它,它会一直告诉我插入了 57913 行,而不是 0。刷新表确认没有添加新行。
    • 我觉得这里有些不对劲。选择中的条件b.DATE_END &gt; TRUNC(sysdate-30) 应该给出过去30 天的记录。如果没有,那么它必须插入所有满足 OR b.DATE_END IS NULL 的记录。此外,您的目标表没有任何约束来防止重复记录?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多