Oracle триггер создания с оператором case - PullRequest
0 голосов
/ 29 января 2020

У меня проблема с созданием триггера в oracle, у меня есть таблица "сток". И у меня есть поля "ххх", "гггг" и "zzz". Я хотел бы создать триггер, который может заполнить другое поле в этой «стоковой» таблице сразу после вставки или обновления. Я устал от чего-то подобного, но не мог.

 create or replace 
Trigger Connector_Stock_Trg 
AFTER INSERT OR UPDATE OF xxx,yyy,zzz ON STOCK
For Each Row 
Declare 
L_Temp VARCHAR2(64);
BEGIN
L_Temp := Case  
         When Xxx Is Not Null Then Xxx
         When yyy Is Not Null And zzz Is Not Null Then yyy||'_'||zzz
         When Yyy Is Null And zzz Is Not Null Then zzz
         WHEN zzz IS NULL AND yyy IS NOT NULL THEN yyy
   END;

   Update Stock 
   SET CONNECTOR=L_Temp;
END;

1 Ответ

2 голосов
/ 29 января 2020

Вам не нужно обновлять таблицу STOCK, но вам просто нужно назначить выражение для :NEW.CONNECTOR следующим образом.

CREATE OR REPLACE TRIGGER CONNECTOR_STOCK_TRG BEFORE
    INSERT OR UPDATE OF XXX, YYY, ZZZ ON STOCK
    FOR EACH ROW
--DECLARE
--    L_TEMP   VARCHAR2(64);
BEGIN
    :NEW.CONNECTOR := -- USE :NEW
        CASE
            WHEN :NEW.XXX IS NOT NULL THEN :NEW.XXX
            WHEN :NEW.YYY IS NOT NULL AND :NEW.ZZZ IS NOT NULL THEN :NEW.YYY
                                                          || '_'
                                                          || :NEW.ZZZ
            WHEN :NEW.YYY IS NULL AND :NEW.ZZZ IS NOT NULL THEN :NEW.ZZZ
            WHEN :NEW.ZZZ IS NULL AND :NEW.YYY IS NOT NULL THEN :NEW.YYY
        END;

--    UPDATE STOCK
--    SET
--        CONNECTOR = L_TEMP;

END;
/

Примечание. Вы можете использовать концепцию Virtual Columns в Oracle для таких требований. смотри это

Ура !!

...