通过 PLSQL 过程查找丢失的记录

时间:2021-04-05 08:47:19

标签: sql database plsql

我有一种情况,我在本地数据库中有一个表,它必须始终与服务器中的数据库保持同步。服务器数据库中的记录由第三方更新/删除/插入,我必须保持本地数据库与服务器同步。

我的本​​地机器接收服务器中的当前数据。假设服务器数据库有 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; 

2 个答案:

答案 0 :(得分:0)

MERGEDELETE 的组合怎么样?您可以在同一过程中完成所有事情,即您不必“返回”任何内容(作为 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

并使它成为一个

db-fiddle

相关问题