在Oracle表上创建ON INSERT触发器

时间:2013-03-20 08:19:00

标签: sql oracle triggers oracle10g

我必须在Oracle数据库上创建这个时髦的ON INSERT触发器。

我得到了这个缺少部分源代码的旧项目,所以现在我只能使用数据库来完成一些魔法。触发器应该更新插入行,其他视图中缺少值。

以下是一些组成的样本数据:

我有这个表,我们称之为 TABLE1 。 然后我有了这个观点,我们称之为 VIEW2 。 在视图中,可能有多个记录具有相同的CODE,但它们是完全相同的,因此任何行都是有效的。这些重复项只有少数几个,但客户尚未将它们过滤掉。

  • TABLE1 VIEW1 包含以下字段(CODE, PARTNER, COUNTRY)
  • TABLE1 也有字段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

更新 TABLE1

嗯,我希望情况很清楚。 由于我没有使用oracle的经验,因此非常感谢我解决问题。

感恩。

1 个答案:

答案 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