代码SQL DB2中的SQL语法问题中的触发器

时间:2015-04-09 21:38:16

标签: sql triggers db2

问题:

我的代码一直有效,直到达到最后一行,然后它会引发语法错误。

错误:

DB21034E该命令作为SQL语句处理,因为它不是 有效的命令行处理器命令。在SQL处理期间,它返回: SQL0104N在“(case when”之后)发现了一个意外的令牌“temp_dept”。 预期的代币可能包括:“加入”。 SQLSTATE = 42601

我正在尝试这样做:

  • 在RD_EMP上的每次插入
  • 之后 每行
  • 插入RD_Supervisor
  • 检查案例,如果temp_dept.RD_E_ID< = 0那么RD_Supervisor.RD_E_SUP 0

代码:

create trigger RD_total_dep_emp \
after insert on RD_Emp \
referencing new table as temp_dept
for each statement \
   insert into RD_Supervisor(RD_E_SUP, RD_E_EMP, RD_QUOT) \
   select temp_dept.RD_E_ID, 
       (case \
         when temp_dept.RD_E_ID <= 0 then 0 \
         when temp_dept.RD_E_ID > 0 AND temp_dept.RD_E_ID <= 15 then 15 \
         when temp_dept.RD_E_ID > 15 AND temp_dept.RD_E_ID <= 25 then 25 \
         when temp_dept.RD_E_ID > 25 AND temp_dept.RD_E_ID <= 35 then 35 \
         when temp_dept.RD_E_ID > 35 then 100 \ 
        end) as RD_E_SUP \ 
   from temp_dept        

2 个答案:

答案 0 :(得分:1)

CASE之前有一个左括号,但在END之后你没有右括号。

https://xkcd.com/859/

答案 1 :(得分:1)

insert中有三列,但select中只有两列 - 它们似乎排列错误。以下可能更符合您的意图:

create trigger RD_total_dep_emp \
after insert on RD_Emp \
referencing new table as temp_dept
for each statement \
   insert into RD_Supervisor(RD_E_EMP, RD_E_SUP) \
       select temp_dept.RD_E_ID, 
           (case \
             when temp_dept.RD_E_ID <= 0 then 0 \
             when temp_dept.RD_E_ID > 0 AND temp_dept.RD_E_ID <= 15 then 15 \
             when temp_dept.RD_E_ID > 15 AND temp_dept.RD_E_ID <= 25 then 25 \
             when temp_dept.RD_E_ID > 25 AND temp_dept.RD_E_ID <= 35 then 35 \
             when temp_dept.RD_E_ID > 35 then 100 \ 
            end) as RD_E_SUP \ 
       from temp_dept

如果您要为RD_QUOT设置一个值,那么您也可以在insertselect中指定该值。