我正在通过检查一些示例来尝试通过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;
它当前正在执行工作,读取值并为其他值插入或更新现有的语言环境国家/地区对。但关键是,表始终具有一个“空”值(请检查屏幕截图),即使我在触发器的开头运行删除语句。所以我的问题是如何删除,或者如何在触发端进行这种处理?
非常感谢您的回答!
答案 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;