UPSERT将重复的空条目插入表(ORACLE)

时间:2018-08-22 12:37:28

标签: sql oracle database-trigger

我正在通过检查一些示例来尝试通过PL / SQL在ORACLE上触发更新,我做得很好,我认为这是我只应配置的最后一步。我的要求是:

将要插入该字段的系统将保持一列始终为空,因此我将从另一张表中读取列值,然后使用该值将其向上插入。

  

d2c_region_locale_config 拥有 d2c_is_active 值,因此我首先阅读有关语言环境条件的值,然后触发插入或更新表,并在 active_for_d2c 列上添加此值。(对于更新,我使用的是locale和country列,如where子句所示,它们不是PK,但没有空条件

所以我创建了此触发器:

CREATE OR REPLACE TRIGGER BL_PIM_LOCALE_COUNTRY 
BEFORE INSERT OR UPDATE ON PIM_LOCALE_COUNTRY REFERENCING NEW AS NEW OLD AS OLD 
FOR EACH ROW
DECLARE
   l_active_for_d2c INTEGER;
BEGIN
  if :NEW.active_for_d2c is null then
    DELETE from pim_locale_country where active_for_d2c is null;
   select distinct(d2c_isactive) into l_active_for_d2c from d2c_region_locale_config where d2c_locale= :NEW.locale;
   UPDATE pim_locale_country 
    SET locale = :NEW.locale, locale_name = :NEW.locale_name, 
    country = :NEW.country, country_name = :NEW.country_name, isdummy = :NEW.isdummy,
    active_for_d2c = l_active_for_d2c, itextpos = :NEW.itextpos, locale_charset = :NEW.locale_charset,
    fallback_locale = :NEW.fallback_locale, default_for_lang = :NEW.default_for_lang, opeclang = :NEW.opeclang
    where locale = :NEW.locale and country = :NEW.country;
   IF ( sql%notfound ) THEN
      INSERT INTO PIM_LOCALE_COUNTRY (locale,locale_name,country,country_name,isdummy,active_for_d2c,itextpos,locale_charset,fallback_locale,default_for_lang,opeclang)
      VALUES (:NEW.locale, :NEW.locale_name,:NEW.country,:NEW.country_name,:NEW.isdummy,l_active_for_d2c,:NEW.itextpos,:NEW.locale_charset,:NEW.fallback_locale,:NEW.default_for_lang,:NEW.opeclang);
   END IF;
  end if;
END; 

它当前正在执行工作,读取值并为其他值插入或更新现有的语言环境国家/地区对。但关键是,表始终具有一个“空”值(请检查屏幕截图),即使我在触发器的开头运行删除语句。所以我的问题是如何删除,或者如何在触发端进行这种处理?

enter image description here

非常感谢您的回答!

1 个答案:

答案 0 :(得分:2)

之前触发不会插入本身,因此您将记录插入两次。也就是说,一旦触发器完成工作(插入或更新的记录),oracle将使用触发器的新记录中的值继续进行插入(或更新)。如果触发器修改了NEW。,它将在您进行更改时存储,但是如果触发器本身插入了某些内容,则可以获得更多记录。

您可以使用代替插入或更新触发器,然后oracle在触发器完成后将不会运行自己的插入/更新。

但是1-记录触发器的更常见的方法是修改NEW中的字段,在这种情况下为NEW.d2c_is_active。

看起来像这样(可能是错别字,请检查)

CREATE OR REPLACE TRIGGER BL_PIM_LOCALE_COUNTRY 
BEFORE INSERT OR UPDATE ON PIM_LOCALE_COUNTRY REFERENCING NEW AS NEW OLD AS OLD 
FOR EACH ROW
BEGIN
  if :NEW.active_for_d2c is null then
    select d2c_isactive 
    into :NEW.active_for_d2c 
    from d2c_region_locale_config 
    where d2c_locale= :NEW.locale and rownum<=1;
  end if;
END; 
相关问题