我必须在Oracle数据库上创建这个时髦的ON INSERT
触发器。
我得到了这个缺少部分源代码的旧项目,所以现在我只能使用数据库来完成一些魔法。触发器应该更新插入行,其他视图中缺少值。
以下是一些组成的样本数据:
我有这个表,我们称之为 TABLE1 。 然后我有了这个观点,我们称之为 VIEW2 。 在视图中,可能有多个记录具有相同的CODE,但它们是完全相同的,因此任何行都是有效的。这些重复项只有少数几个,但客户尚未将它们过滤掉。
(CODE, PARTNER, COUNTRY)
。COMMENT
。所有字段都是varchar类型。
在此字段中,COMMENT
属于varchar
类型,并且后缀添加了其值,如下所示:
“ - XXX-CODE”,例如“some comment-XXX-123”。
这是我的观点:
这将插入 TABLE1 :
**CODE;PARTNER;COUNTRY;COMMENT**
- 123;TEST;USA;SOME COMMENT
- 145;TEST2;GB;SOME COMMENT
- NULL;NULL;NULL;SOME COMMENT-XXX-154
这是触发器应该启动的地方。
- IF字段 CODE IS NULL,触发器触发火灾
- 根据-XXX-前缀解析代码(在本例中取值154)
- 在 VIEW 上进行选择(从VIEW1中选择代码,合作伙伴,国家/地区代码= 154
- 如果找到记录,则应使用code, partner and country
值
嗯,我希望情况很清楚。 由于我没有使用oracle的经验,因此非常感谢我解决问题。
感恩。
答案 0 :(得分:2)
我不知道列CODE的类型是什么,所以我猜它是INTEGER。 你在这里
CREATE OR REPLACE TRIGGER tri_check_nulls
BEFORE INSERT ON TABLE1
FOR EACH ROW WHEN (new.CODE is NULL)
DECLARE
VIEW_CODE INTEGER;
BEGIN
VIEW_CODE := TO_NUMBER(SUBSTR(new.COMMENT, INSTR(new.COMMENT, '-', -1, 1) + 1));
select distinct v.CODE, v.PARTNER, v.COUNTRY
into :new.CODE, :new.PARTNER, :new.COUNTRY
from VIEW1 v
where v.CODE = VIEW_CODE;
END;
/
当然,您必须添加一些错误处理程序。 请阅读Oracle文档CREATE TRIGGER