Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle自定义合并_Sql_Oracle_Plsql - Fatal编程技术网

Sql Oracle自定义合并

Sql Oracle自定义合并,sql,oracle,plsql,Sql,Oracle,Plsql,我们有两个表,一个是源表,另一个是目标表。源表使用外部数据源更新/刷新,我们有一个PL/SQL块,它每天运行,并使用Oracle的merge函数更新/插入目标表行 现在我们遇到了一种情况,目标表中的一列(电子邮件)可能会被一些外部源更新。因此,使用上述PL/SQL的合并功能,源表的电子邮件将更新/覆盖此电子邮件 merge函数中是否存在某些内容,使得它仅在电子邮件以外的内容发生更改时更新目标表中的行。如果需要,我很乐意在源表和目标表中添加新列 create or replace PROCEDUR

我们有两个表,一个是源表,另一个是目标表。源表使用外部数据源更新/刷新,我们有一个PL/SQL块,它每天运行,并使用Oracle的merge函数更新/插入目标表行

现在我们遇到了一种情况,目标表中的一列(电子邮件)可能会被一些外部源更新。因此,使用上述PL/SQL的合并功能,源表的电子邮件将更新/覆盖此电子邮件

merge函数中是否存在某些内容,使得它仅在电子邮件以外的内容发生更改时更新目标表中的行。如果需要,我很乐意在源表和目标表中添加新列

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;

谢谢

在您的更新声明中添加where子句

我不能完全确定我是否理解这个问题。您只是不想更新目标表的
email
列吗?如果源表中电子邮件地址以外的内容发生更改,并且目标表的电子邮件地址发生更改,您是否保证源电子邮件地址正确?您是否控制更新电子邮件地址的“其他”应用程序?您有办法知道上次运行合并进程的时间吗?@JustinCave,对于目标表中所有电子邮件已由外部源更新的记录,我不想重新更新源表中的电子邮件地址。其余信息必须以正常方式更新。@Bob,是的,我可以控制外部应用程序,并且可以找到上次运行合并进程的时间。