除了编写迁移SQL和一些基本触发器之外,我对PL / SQL主题没有多少经验。因此我会直接问我的问题,至少在我的触发器中有一个起点,我期待。
我们有以下表格:
VIB: Varchar
Locale: Varchar
Status : Varchar
Released : boolean
我需要D2C_EVENT_GENERATION_MASTER
表上的触发器,要求是,某些系统会为此表添加插入“vib”列 而没有针对vib的LOCALE值 。因此,我们期望在该系统的插入操作之前计算语言环境(从release_table中查找适当的语言环境),方法是RELEASE_TABLE
询问VIB
存在的适当语言环境,并且释放标志为“true”。
CREATE OR REPLACE TRIGGER BL_D2C_EVENT_GENERATION_MASTER
BEFORE INSERT
ON D2C_EVENT_GENERATION_MASTER
FOR EACH ROW
DECLARE
l_locale varchar2(100);
BEGIN
if :NEW.locale is null then
for rec in (select locale from RELEASE_TABLE@pdpe.mch.bshg.com where vib=:NEW.vib AND released = 1)
loop
INSERT INTO d2c_event_generation_master (vib,locale) VALUES (:NEW.vib,rec.locale);
end loop;
DELETE FROM d2c_event_generation_master where vib=:NEW.vib AND locale is null;
end if;
END;
我即将创建此触发器,但只有一个异常发生,我无法修复。当我在表中插入一个具有空语言环境值的行时,如下所示:
INSERT INTO D2C_EVENT_GENERATION_AP (vib) values ('GP200046');
它从其他表中获取语言环境但插入三行:
GP200046 fr-BE
GP200046 nl-BE
GP200046 null
我不想在这里看到'null',我尝试了一些执行立即或其他一些工作人员,但找不到任何东西。
你能帮忙吗?
答案 0 :(得分:2)
这是插入之前的一个触发器,用于从发布表中获取值:
CREATE OR REPLACE TRIGGER BI_D2C_EVENT_GENERATION_MASTER
BEFORE INSERT
ON D2C_EVENT_GENERATION_MASTER
FOR EACH ROW
DECLARE
l_locale varchar2(100);
BEGIN
if :NEW.locale is null then
select locale INTO l_locale from release where vib=:NEW.vib;
:NEW.locale := l_locale;
end if;
END;
/
修改强>
对于第二种解决方案,我建议创建一个程序:
CREATE OR REPLACE PROCEDURE MI_D2C_EVENT_GENERATION_MASTER (p_vib number, p_locale varchar2)
IS
l_vib number := p_vib;
l_locale varchar2(100) := p_locale;
BEGIN
MERGE INTO D2C_EVENT_GENERATION_MASTER event
USING (SELECT vib, locale from D2C_EVENT_GENERATION_MASTER) old_event
ON (event.vib = l_vib
and event.locale = l_locale)
WHEN MATCHED THEN
UPDATE SET event.STATUS = 'NEW'
WHERE event.STATUS != 'NEW'
WHEN NOT MATCHED THEN
INSERT (vib,locale,status) VALUES (l_vib, l_locale, 'STATUS')';
END;
/