我有一种情况,我在本地数据库中有一个表,它必须始终与服务器中的数据库保持同步。服务器数据库中的记录由第三方更新/删除/插入,我必须保持本地数据库与服务器同步。
我的本地机器接收服务器中的当前数据。假设服务器数据库有 4 条记录,我的本地机器收到这 4 条记录,我必须使用主键更新我的本地数据库。
当有人删除服务器DB中的一条记录(只剩下3条记录)时,它只会发送剩余的记录(本地DB只收到3条记录)。
我如何找到被删除的记录。 (本地机器接收要使用的主键)。
我尝试了以下过程,但似乎是在服务器中找到我的附加详细信息,而不是已删除的。
PROCEDURE CheckDeletedRecord ( primarykeyRecieved IN varchar, toDeletedPrimarykey OUT varchar) AS
vStorePrimaryKey VARCHAR2(45);
BEGIN
SELECT t.primarykeyOfTable INTO vStorePrimaryKey FROM tableName t where t.primarykeyOfTable = primarykeyRecieved
IF vStorePrimaryKey = '' THEN
toDeletedPrimarykey := primarykeyRecieved ;
END IF;
END CheckDeletedInfections;
答案 0 :(得分:0)
MERGE
和 DELETE
的组合怎么样?您可以在同一过程中完成所有事情,即您不必“返回”任何内容(作为 OUT
参数)。像这样:
create or replace procedure p_check (pkrec in varchar2) is
begin
-- if pkrec represents new or updated row
merge into local_table a
using server_table b
on (a.pkrec = b.pkrec)
when matched then update set (a.col1 = b.col1,
a.col2 = b.col2, ...
)
when not matched then insert (pkrec, col1, col2, ...)
values (pkrec, b.col1, b.col2, ...);
-- remove rows which are deleted in the server table
delete from local_table a
where not exists (select null
from server_table b
where b.pkrec = a.pkrec
);
end;
答案 1 :(得分:0)
SELECT INTO
在查询的行不存在时抛出 NO_DATA_FOUND
,所以(虚拟是我的测试表):
CREATE PROCEDURE CheckDeletedRecord ( primarykeyRecieved IN varchar, toDeletedPrimarykey OUT varchar) AS
vStorePrimaryKey varchar(45);
BEGIN
SELECT t.primaryKey INTO vStorePrimaryKey FROM dummy t where t.primaryKey = primarykeyRecieved;
EXCEPTION
WHEN NO_DATA_FOUND THEN
toDeletedPrimarykey := primarykeyRecieved ;
END CheckDeletedRecord;
/
写了一个存储函数来测试它:
CREATE FUNCTION todelete (primarykeyRecieved IN varchar) return varchar IS
l_retval varchar(45) := '';
BEGIN
CheckDeletedRecord(primarykeyRecieved, l_retval);
return l_retval;
END;
/
测试准备:
insert into dummy values('EXISTS');
测试:
select todelete('EXISTS') from dual;
输出
null
不存在测试
select todelete('EXISTS NOT') from dual;
输出
EXISTS NOT
并使它成为一个