首页 > 解决方案 > Oracle PL/SQL 中的校验和

问题描述

我们在 oracle 函数中是否有类似的校验和函数 (SQL)。我会将它存储在一个表中并使用键/值来更新语句。我当前的流程之一包含 15 列,需要检查源和目标之间是否存在任何更改,而不是一列检查是否发生更改,希望表中有单列来帮助 15 中是否发生更改列

标签: oracleoracle11goracle10g

解决方案


数据库擅长跟踪变化,这就是它们的用途。

也许内置的ORA_ROWSCN对于您的更改跟踪来说已经足够好了?默认情况下,它仅跟踪每个块的更改,但您可以使用 -odlyly named - 子句启用表来跟踪每一行的更改ROWDEPENDENCIES

CREATE TABLE t (
 a NUMBER, 
 b NUMBER, 
 c NUMBER
) ROWDEPENDENCIES;


INSERT INTO t VALUES (1,1,1);
INSERT INTO t VALUES (2,2,2);
SELECT current_scn FROM v$database;
2380496

过了一会儿:

UPDATE t SET b=20, c=20 WHERE a=2;
SELECT current_scn FROM v$database;
2380665

现在您可以查询系统更改号 SCN 每一行被更改:

SELECT ORA_ROWSCN AS scn, a,b,c FROM t;
SCN       A    B    C    
2380496   1    1    1
2380665   2   20   20

在过去的 5 天里,Oracle 可以将 SCN 转换为近似实时(Oracle 10 ± 5 分钟,Oracle 11 ± 3 秒):

SELECT ORA_ROWSCN AS SCN, SCN_TO_TIMESTAMP(ORA_ROWSCN) AS ts, a,b,c FROM t;
SCN       TS                    A    B    C    
2380496   2020-05-15 20:20:38   1    1    1
2380665   2020-05-15 20:23:06   2   20   20

它记录在 Oracles SQL Language Reference中。


推荐阅读