【发布时间】:2020-09-15 16:04:51
【问题描述】:
我正在尝试构建一个触发器,在插入后根据某些标准更新 col 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 上创建一个触发器,它会更新它并将列ID_TREE 设置为4401 或4402。
4401 的条件:项目 (kod_id) 和此列:(DOD_CT_O.RID_CT_O = CT_O.RID_OBJ) 必须匹配。如果为真,则设置新值。
尝试:
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;
/
我还没有测试它,但它看起来像一个可运行的吗? (我不这么认为。)
【问题讨论】:
-
:new.ct_count 指的是表 dod_ct_l 中的列 ct_count。从您的代码看来 ct_count 是一个局部变量。将 :new.ct_count 替换为 ct_count。然后,编译和测试。您是测试自己代码的最佳人选。