1

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

我得到了这个缺少部分源代码的旧项目,所以现在我必须只使用数据库来做一些魔术。触发器应该使用另一个视图中的缺失值更新插入的行。

这是一些组成的示例数据:

我有这张表,我们称之为TABLE1。然后我有这个视图,我们称之为VIEW2。在视图中可能有多个具有相同 CODE 的记录,但它们是完全重复的,因此任何行都是有效的。只有少数这样的重复,但客户还没有过滤掉它们。

  • TABLE1VIEW1具有以下字段(CODE, PARTNER, COUNTRY)
  • TABLE1也有字段COMMENT

所有字段都是 varchar 类型。

在此字段中,它的值COMMENTvarchar类型,并在其值中添加了一个后缀,如下所示: “-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

这是触发器应该启动的地方。 - 如果字段CODE为 NULL,触发器应该触发 - 根据 -XXX- 前缀解析代码(在本例中取值 154) - 在VIEW上进行选择(选择来自 VIEW1 的代码、合作伙伴、国家/地区,其中代码 = 154 - 如果找到记录,则应使用值更新TABLE1code, partner and country

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

感激。

4

1 回答 1

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

于 2013-03-20T09:04:38.627 回答