ORACL PL / SQL触发器使用两个不同的表

时间:2017-09-29 12:20:23

标签: sql database oracle plsql triggers

除了编写迁移SQL和一些基本触发器之外,我对PL / SQL主题没有多少经验。因此我会直接问我的问题,至少在我的触发器中有一个起点,我期待。

我们有以下表格:

enter image description here enter image description here

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',我尝试了一些执行立即或其他一些工作人员,但找不到任何东西。

你能帮忙吗?

1 个答案:

答案 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;
/