1

长期用户,第一次“提问”。

我试图构建一个 Oracle 过程和/或触发器,它将两个表与 MINUS 操作进行比较,然后将任何结果行插入另一个表。我了解如何在标准 SQL 中进行查询,但我无法想出使用 PL/SQL 执行此操作的有效方法。

诚然,我对 Oracle 很陌生,而且对 SQL 非常熟悉。这可能是实现我的目标的一种愚蠢的方式,所以请允许我解释一下我正在尝试做什么。

我需要创建某种警报,当V_$PARAMETER视图更改时将触发该警报。显然触发器不能响应视图的更改,而是只能替换视图上的操作......我不希望这样做。所以,我所做的是创建一个表来镜像该视图,以将其保存为“快照”。

create table mirror_v_$parameter as select * from v_$parameter;

然后,我尝试创建一个减去这两个的过程,这样,每当对v_$parameter进行更改时,它将返回快照mirror_v_$parameter之间的差异。我尝试使用以下命令创建游标:

select * from v_$parameter minus select * from mirror_v_$parameter;

在过程中使用,以便它可以用于获取任何返回的行并将它们插入另一个名为alerts_v_$parameter的表中。目的是,当向“警报”表添加某些内容时,可以使用触发器以某种方式(还没有到这一步)通知我的团队v_$parameter表发生了变化,并且他们可以参考alerts_v_$parameter来查看发生了什么变化。我会使用某种脚本定期运行此过程。也许,有一天,当我更好地理解这一切时,操纵进入alerts_v_$parameter的内容表,以便它提供更好的信息,例如具体更改了哪些列,其先前的值是什么等。

有什么建议或指示吗?

感谢您抽出时间来阅读。任何想法将不胜感激。

4

1 回答 1

0

我将根据 v_$parameter 的确切结构创建一个表,并为“last_update”添加一个额外的时间戳列,并定期(通过 DBMS_Scheduler)将真实 v_$parameter 表中的任何更改合并到其中并捕获任何检测到的更改的时间戳.

您还可以同时填充历史表,或者使用更新表的触发器或使用 SQL。

PL/SQL 不太可能是必需的,除非作为 SQL 代码的过程包装器。

合并示例在此处的文档中:http: //docs.oracle.com/cd/E11882_01/server.112/e26088/statements_9016.htm#SQLRF01606

于 2013-07-15T16:46:36.453 回答