【发布时间】:2018-08-22 12:37:28
【问题描述】:
我正在尝试通过检查一些示例通过 PL/SQL 在 ORACLE 上创建一个 upsert 触发器,我做得很好,我认为这是我应该只配置的最后一步。我的要求是:
将插入该字段的系统将始终保持一列为空,因此我将从另一个表中读取列值,然后将其插入并包含该值。
d2c_region_locale_config 持有 d2c_is_active 值,所以我首先读取有关区域设置条件的值,然后触发插入或通过在 active_for_d2c 列上添加此值来更新表。(对于更新,我正在使用区域设置和国家/地区列,因为它显示在 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;
它目前完成这项工作,读取值并插入或更新现有的语言环境-国家/地区对以获取其他值。但关键是,表总是有一个“空”值(请检查屏幕截图),即使我在触发器的开头运行 delete 语句。所以我的问题是如何删除,或者如何在触发端使用这种方法?
非常感谢您的回答!
【问题讨论】:
标签: sql oracle database-trigger