过程PLSQL中的2个合并语句
我试图在过程中使用两个合并语句。 其中一个表应该删除不在另一个表中的行 另一个应该插入表中没有的 在这种情况下,我得到的错误是缺少一个关键字过程PLSQL中的2个合并语句,sql,oracle,plsql,keyword,Sql,Oracle,Plsql,Keyword,我试图在过程中使用两个合并语句。 其中一个表应该删除不在另一个表中的行 另一个应该插入表中没有的 在这种情况下,我得到的错误是缺少一个关键字 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
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;
关键字丢失错误位于第一次合并中的“不匹配时”。
另一个问题是,在一个过程中是否可能有两个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,
vorname,
nachname,
mobil,
telefon,
fax,
e_mail,
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;
在存储过程中使用多个
MERGE
语句不是问题
通过转换相关部分,仍然可以使用第一个MERGE
语句
WHEN NOT MATCHED THEN
DELETE FROM person
WHERE Person_id = p1.person_id
致:
但是DELETE
语句在之后不匹配时不能发生
顺便说一句,在一个事务中两个有多个COMMIT
,而不是只保留最后一个,这不是一个好的做法。类似这样的事情:
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,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;
/
请注意,您的第一个Execute immediate语句中有一个错误。应该是:
Execute immediate 'alter table person DISABLE constraint FK_FGH_ID ';
你应该绝对避免这种可怕的“select*
”行为。用显式列名替换它。MERGE语句中的DELETE仅适用于合并表,也就是说,我们只能从WHEN MATCHED分支调用它。整个第一个合并语句完全错误。当搜索者从person\u test
查询时,使用DISTINCT。假设他们有这样做的正当理由,你应该把它包括在你的插入。。。SELECT语句。
Execute immediate 'alter table person DISABLE constraint FK_FGH_ID ';