Oracle после триггера с регистром и переменной - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь создать триггер, который после вставки обновляет столбец ID_TREE в соответствии с некоторыми критериями:

Таблица DOD_CT_L

RID VARCHAR2(16) --PK
ID_TREE NUMBER(16)
FLAGS_S VARCHAR2(254)
DAT_OD DATE(7) --> FROM
DAT_DO DATE(7) --> TO   

Таблица DOD_CT_O

RID_O NUMBER(16) --PK
ID_R NUMBER(16) --PK
KOD_ID NUMBER(22) --FK
RID_CT_O VARCHAR2(16)

Таблица CT_O

RID_OBJ VARCHAR2(16) --PK
KOD_ID NUMBER(22) --FK
S_STAMP VARCHAR(254)
TYP NUMBER (22)
NAVOZ_OD DATE(7) --> FROM
NAVOZ_DO DATE(7) --> TO

Итак, мне нужен триггер в таблице DOD_CT_L, который обновит его и установит col ID_TREE до 4401 или 4402. Критерии для 4401: элемент (kod_id) и этот столбец: (DOD_CT_O.RID_CT_O = CT_O.RID_OBJ) должны совпадать. Если это правда, установите новое значение.

Attemtp:

CREATE OR REPLACE TRIGGER DOD_CT_L_TREE
AFTER INSERT OR UPDATE on DOD_CT_L
FOR EACH ROW

DECLARE

ct_count number(2)

when (new.FLAGS_S in (0,4) )

BEGIN

select 1 into ct_count from dod_ct_o o where o.rid_ct_o in (
 select rid_obj from ct_o where kod_id = o.kod_id and s_stamp = '0' and typ in (10,11) 
 and ( dat_do Is Null Or dat_do >= trunc(Sysdate) ) group by rid_obj) group by 1;

:new.id_tree :=
 CASE
  WHEN  :new.ct_count > 0 and (:new.NAVOZ_DO > trunc(sysdate) or :new.NAVOZ_DO is null) 
   then '4401'
  WHEN  :new.ct_count >= 0 and :new.NAVOZ_DO <= trunc(sysdate) then '4402'

 END;
END;
/

Я еще не тестировал его, но похоже ли он на работоспособный? (Я так не думаю.)

1 Ответ

1 голос
/ 28 мая 2020

В вашем коде несколько проблем.

  • Неверное положение предложения WHEN
  • Отсутствует запятая после CT_COUNT NUMBER (2)
  • Использование :new с CT_COUNT. :new используется только со столбцом таблицы, для которого создан триггер

Вам необходимо использовать следующий код (см. Встроенные комментарии):

CREATE OR REPLACE TRIGGER DOD_CT_L_TREE AFTER
    INSERT OR UPDATE ON DOD_CT_L
    FOR EACH ROW
WHEN ( NEW.FLAGS_S IN ( 0,4) ) -- position of WHEN clause was worng in your code
DECLARE 
CT_COUNT NUMBER(2); -- missing comma
BEGIN
    SELECT COUNT(1) -- use count function and removed GROUP BY 1
    INTO CT_COUNT
    FROM DOD_CT_O O
    WHERE
        O.RID_CT_O IN (
            SELECT RID_OBJ
            FROM CT_O
            WHERE KOD_ID = O.KOD_ID
                AND S_STAMP = '0'
                    AND TYP IN (10, 11)
                        AND ( DAT_DO IS NULL
                              OR DAT_DO >= TRUNC(SYSDATE) )
            GROUP BY RID_OBJ
        );

    :NEW.ID_TREE :=
        CASE --:new from :new.CT_COUNT is not correct, use only CT_COUNT
            WHEN CT_COUNT > 0 AND ( :NEW.NAVOZ_DO > TRUNC(SYSDATE) OR :NEW.NAVOZ_DO IS NULL ) THEN
                '4401'
            WHEN CT_COUNT >= 0 AND :NEW.NAVOZ_DO <= TRUNC(SYSDATE) THEN
                '4402'
        END;

END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...