我有一组数据示例:
seq id status in_process processed
3 A N T F
这是我按计划使用的临时表的模型。它相当复杂,但我希望这足以说明问题。
此记录的处理每15分钟进行一次。对于给定的“id”,记录按seq从最低到最高的顺序处理。如果status ='N'(新),则将处理记录。如果在运行时遇到上述记录,则会处理和处理的id数据将更新为“T”
稍后如果遇到以下情况......
seq id status in_process processed
5 A D T F
将处理ID并将目的地通知新状态='D'(已删除),处理后将更新为'T'
但如果相反,则在运行之间发生以下情况:
seq id status in_process processed
5 A D T F
3 A N T F
我希望不进行任何处理,只需将处理更新为“T”
鉴于上一个场景,我可以使用哪种更新查询?我想基本上说
update myTable set processed = 'T' where {processed = 'F' and status was N and is now D for a given id}
这是花括号中的最后一部分,我不知道如何写。由于在D状态之后相同的id将不具有N的状态,所以我不需要引用seq值,只要status ='N'并且处理='F'用于相同的id我计划更新。更多示例,在下面的示例中,我想要更新ID A和D1而不进行处理,并将B和C记录单独保留更新。
seq id status in_process processed
8 D1 D T F
7 D1 N T F
6 C D T F
5 A D T F
4 B N T F
3 A N T F
任何帮助都将不胜感激。
答案 0 :(得分:0)
一种方法可能是使用display:none
- 触发器,它控制是否应插入新记录或更新现有记录。
作为INSTEAD OF INSERT
- Oracle中的触发器只能为视图(而不是表)定义,因此必须执行以下操作:
将您的表重命名为INSTEAD OF INSERT
并创建一个视图staging_data
,
例如为staging
。
因此,您的应用程序将插入到视图中
将触发您的特定代码。
在触发器代码中,使用create view staging as (select * from staging_data)
- 属性和:new
- 语句
在基础数据表select
上标识是否
更新或插入应该执行。
最后,执行插入或更新。
不幸的是,我没有一个写入触发器的环境并试一试;希望它有所帮助。例如,提供回复Oracle view not updatable, advice on Instead Of triggers或咨询谷歌。