Можно ли динамически изменить предложение where в триггере (Oracle)? - PullRequest
0 голосов
/ 20 апреля 2020

Выберите ... что-то ... откуда-то ... где-то ... где условие1 и (если обновление, то условие2, если удаление, то условие3). Это конечно просто псевдокод. Можно ли сделать такое заявление? Когда я пытаюсь это подчеркивает updating. Что я должен использовать? Случай? Логические операторы? все, кажется, запрещено. Это только после начала в триггере.

CREATE OR REPLACE TRIGGER FIX_UPD_LIMITS
BEFORE UPDATE OR DELETE ON LIMITS
FOR EACH ROW
DECLARE
    is_deleted_dependant VARCHAR2(1 BYTE);
    is_editable_dependant VARCHAR2(1 BYTE);
BEGIN
    SELECT IS_DELETE, IS_EDITABLE 
    INTO is_deleted_dependant, is_editable_dependant
    FROM MAP_CALCULATION MC 
        INNER JOIN map_calculation_group MG ON MC.ID_CALC = MG.ID_CALC
    WHERE MG.ID_CALC = MC.ID_CALC
    AND ((UPDATING AND mg.id_group = :new.id_group)
        OR (DELETING AND :old.id_group = mg.id_group)
    ); 

    IF UPDATING AND (is_editable_dependant = 'F' OR is_deleted_dependant = 'T') THEN
        ...   
    ELSIF DELETING AND (is_editable_dependant = 'F' OR is_deleted_dependant = 'T') THEN
        ...
    END IF;

END;
/

1 Ответ

0 голосов
/ 20 апреля 2020

ОБНОВЛЕНИЕ и УДАЛЕНИЕ являются ключевыми словами PL / SQL и действительны только в теле триггера. Двигатель SQL их не понимает. Следовательно, ошибка компиляции.

: NEW.GROUP_ID будет заполняться при обновлении и иметь нулевое значение при удалении. Так что это должно работать для вас:

    SELECT IS_DELETE, IS_EDITABLE 
    INTO is_deleted_dependant, is_editable_dependant
    FROM MAP_CALCULATION MC 
        INNER JOIN map_calculation_group MG ON MC.ID_CALC = MG.ID_CALC
    WHERE MG.ID_CALC = MC.ID_CALC
    AND mg.id_group = coalesce(:new.id_group, :old.id_group)
    ); 



...