过程PLSQL中的2条合并语句

问题描述

我正在尝试在Procedure内部使用2个Merge语句。 一个应该删除不在另一个表中的行。

一个应该插入不在表中的那些。

在这种情况下,我收到了缺少关键字的错误

create or replace noneditionable procedure merge_test
as
BEGIN

Execute immediate 'alter table
   table person
disABLE constraint
FK_FGH_ID ';


Merge into (select distinct * from 
person_test) t1
Using (select * from person) p1
On (p1.person_id = t1.person_id)
When not matched then
DELETE
FROM
    person
WHERE
    Person_id = p1.person_id;
COMMIT;

Merge into person p
USING (select distinct * from 
person_test) t
On (t.person_id = p.person_id)
When not matched then
Insert(person_id,vorname,nachname,mobil,telefon,fax,e_mail,fgh_id)
values(t.person_id,t.vorname,t.nachname,t.mobil,t.telefon,t.fax,t.e_mail,t.fgh_id);
COMMIT;

Execute immediate 'alter table
   person
ENABLE constraint
   FK_FGH_ID ';


End merge_test;

关键字丢失的错误在第一个合并中位于“未匹配时”。 另一个Queston是在一个过程中甚至可能有2个Merge语句。

解决方法

是的,在过程中具有两个MERGE语句绝对是可能的,但是为什么在这种情况下使用它们?只需使用简单的DELETE然后使用INSERT语句即可,如下所示。

CREATE OR REPLACE NONEDITIONABLE PROCEDURE merge_test
AS
BEGIN
    EXECUTE IMMEDIATE 'alter table person DISABLE constraint FK_FGH_ID';

    DELETE FROM person
          WHERE person_id NOT IN (SELECT person_id FROM person_test);

    INSERT INTO person (person_id,vorname,nachname,mobil,telefon,fax,e_mail,fgh_id)
        SELECT person_id,fgh_id
          FROM person_test
         WHERE person_id NOT IN (SELECT person_id FROM person);

    EXECUTE IMMEDIATE 'alter table person ENABLE constraint FK_FGH_ID';
END merge_test;
,

在存储过程中使用多个<link>语句不是问题。

您仍然可以通过转换相关部分来使用第一个MERGE语句

MERGE

至:

WHEN NOT MATCHED THEN
DELETE FROM person
WHERE Person_id = p1.person_id

但是 WHEN MATCHED THEN UPDATE SET t1.person_id = p1.person_id DELETE WHERE person_id = p1.person_id 之后不能进行DELETE声明

顺便说一句,这不是一个好习惯,两个在一个事务中有多个WHEN NOT MATCHED THEN,而只保留最后一个。

,

类似这样的东西:

create or replace noneditionable procedure merge_test
IS

BEGIN

    Execute immediate 'alter table person DISABLE constraint FK_FGH_ID ';

    Merge into person_test t1
    Using (select * from person) p1
    On (t1.person_id = p1.person_id)
    when matched then 
         update set t1.Person_id = t1.Person_id
             where t1.Person_id = p1.person_id
         delete 
             where t1.Person_id = p1.person_id;

    COMMIT;
    
    Merge into person p
    USING (select * from person_test) t
    On (t.person_id = p.person_id)
    When not matched then
        Insert(person_id,fgh_id)
        values(t.person_id,t.vorname,t.nachname,t.mobil,t.telefon,t.fax,t.e_mail,t.fgh_id);
    
    COMMIT;
    
    Execute immediate 'alter table person ENABLE constraint FK_FGH_ID ';

End merge_test;
/

请注意,您的第一个“立即执行”语句中有错误。应该是:

Execute immediate 'alter table person DISABLE constraint FK_FGH_ID ';