【发布时间】:2012-06-12 16:23:48
【问题描述】:
我们有两张表,一张是源表,另一张是目标表。源表使用外部数据源更新/刷新,我们有一个每天运行的 PL/SQL 块,并使用 Oracle 的 merge 函数更新/插入目标表行。
现在我们遇到了这样一种情况,即目标表中的列(电子邮件)可能会被某个外部源更新。因此,这封电子邮件正在被源表的电子邮件更新/覆盖,并具有上述 PL/SQL 的合并功能。
合并函数中是否存在某些内容,以便仅在电子邮件以外的内容发生更改时才更新目标表中的行。如果需要,我很乐意将新列添加到源表和目标表中。
create or replace
PROCEDURE INSERT_UPDATE_TARGET AS
BEGIN
merge into INTEGRATION_TARGET t
using v_merge vm
on (t.person_num = vm.person_num)
when matched then update set T.YEAR_START = VM.YEAR_START,
T.SEMESTER_START = VM.SEMESTER_START,
T.SATAC_DATABASE_NAME = VM.SATAC_DATABASE_NAME,
T.STUDY_LEVEL = VM.STUDY_LEVEL,
T.REF_NUM = VM.REF_NUM,
T.SEX = VM.SEX,
T.DATE_OF_BIRTH = VM.DATE_OF_BIRTH,
T.DATE_RECEIVED = VM.DATE_RECEIVED,
T.TITLE = VM.TITLE,
T.FAMILY_NAME = VM.FAMILY_NAME,
T.GIVEN_NAME_1 = VM.GIVEN_NAME_1,
T.STREET_NAME = VM.STREET_NAME,
T.STREET_NAME_2 = VM.STREET_NAME_2,
T.STREET_NAME_3 = VM.STREET_NAME_3,
T.POSTAL_STATE = VM.POSTAL_STATE,
T.POSTAL_TOWN = VM.POSTAL_TOWN,
T.POSTAL_POSTCODE = VM.POSTAL_POSTCODE,
T.COUNTRY = VM.COUNTRY,
T.MOBILE = VM.MOBILE,
T.EMAIL = VM.EMAIL
when not matched then insert (T.YEAR_START,
T.SEMESTER_START,
T.SATAC_DATABASE_NAME,
T.STUDY_LEVEL,
T.REF_NUM,
T.PERSON_NUM,
T.SEX,
T.DATE_OF_BIRTH,
T.DATE_RECEIVED,
T.TITLE,
T.FAMILY_NAME,
T.GIVEN_NAME_1,
T.STREET_NAME,
T.STREET_NAME_2,
T.STREET_NAME_3,
T.POSTAL_STATE,
T.POSTAL_TOWN,
T.POSTAL_POSTCODE,
T.COUNTRY,
T.MOBILE,
T.EMAIL
)
values(VM.YEAR_START,
VM.SEMESTER_START,
VM.SATAC_DATABASE_NAME,
VM.STUDY_LEVEL,
VM.REF_NUM,
VM.PERSON_NUM,
VM.SEX,
VM.DATE_OF_BIRTH,
VM.DATE_RECEIVED,
VM.TITLE,
VM.FAMILY_NAME,
VM.GIVEN_NAME_1,
VM.STREET_NAME,
VM.STREET_NAME_2,
VM.STREET_NAME_3,
VM.POSTAL_STATE,
VM.POSTAL_TOWN,
VM.POSTAL_POSTCODE,
VM.COUNTRY,
VM.MOBILE,
VM.EMAIL
);
END;
谢谢
【问题讨论】:
-
我不完全确定我理解了这个问题。您只是不想更新目标表的
email列吗?如果源表中的邮箱地址以外的东西发生了变化,而目的表的邮箱地址也发生了变化,你能保证源邮箱地址是正确的吗? -
您是否可以控制更新电子邮件地址的“其他”应用程序?您有什么方法可以知道最后一次运行合并过程的时间吗?
-
@JustinCave,对于 Target 表中已由外部源更新其电子邮件的所有记录,我不想重新更新源表中的电子邮件地址。其余信息必须以正常方式更新。
-
@Bob,是的,我可以控制外部应用程序,并且可以找到上次运行合并过程的时间。