【问题标题】:Oracle after trigger with case and variable带有案例和变量的触发器后的Oracle
【发布时间】: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 设置为440144024401 的条件:项目 (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。然后,编译和测试。您是测试自己代码的最佳人选。

标签: sql oracle triggers


【解决方案1】:

您的代码中有多个问题。

  • WHEN 子句的位置不正确
  • CT_COUNT NUMBER(2) 后缺少逗号
  • :newCT_COUNT 一起使用。 :new 仅与创建触发器的表的列一起使用

您需要使用以下代码(参见内联 cmets):

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-14
    • 2020-07-02
    • 2019-03-26
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 2017-08-30
    • 2015-08-17
    相关资源
    最近更新 更多