长时间用户,第一次“提问者”。
我尝试构造一个Oracle过程和/或触发器,它将两个表与MINUS操作进行比较,然后将任何结果行插入另一个表中。我理解如何在标准SQL中进行查询,但是我无法使用PL / SQL提出一种有效的方法。
不可否认,我对Oracle很陌生,而且一般都是SQL。这可能是实现我的目标的一种愚蠢的方式,所以请允许我解释我想要做的事情。
我需要创建某种警报,当 V_ $ PARAMETER 视图发生变化时会触发警报。显然触发器无法响应视图的更改,而是只能替换视图上的操作...我不想这样做。所以,我所做的是创建一个表来镜像该视图,基本上将其保存为“快照”。
create table mirror_v_$parameter as select * from v_$parameter;
然后,我尝试制作一个减去这两个的程序,这样,只要对 v_ $ parameter 进行更改,它就会返回快照之间的差异, mirror_v_ $参数即可。我尝试使用以下命令创建游标:
select * from v_$parameter minus select * from mirror_v_$parameter;
要在过程中使用,以便它可以用于获取任何返回的行并将它们插入另一个名为 alerts_v_ $ parameter 的表中。意图是,当某些内容添加到“警报”表时,触发器可用于某种方式(还没有到目前为止)通知我的团队 v_ $参数<已更改< / strong>表格,他们可以参考 alerts_v_ $ parameter 来查看更改内容。我会使用某种脚本定期运行此过程。也许有一天,当我更好地理解这一切时,操纵 alerts_v_ $ parameter 表中的内容,以便它提供更好的信息,例如具体说明哪些列已更改,其先前值是多少等等。
有任何建议或指示吗?
感谢您抽出宝贵时间阅读本文。任何想法都将非常感激。
答案 0 :(得分:0)
我会根据v_ $参数的确切结构创建一个表,并为“last_update”添加一个额外的时间戳列,并定期(通过DBMS_Scheduler)将真实v_ $参数表中的任何更改合并到其中并捕获时间戳任何检测到的变化。
您也可以同时填充历史记录表,使用更新表或SQL时使用触发器。
除了作为SQL代码的过程包装器之外,不太可能需要PL / SQL。
Merge的示例在此处的文档中:http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_9016.htm#SQLRF01606