请帮忙看看这个触发器,高手进,问题解除有奖励哦!!!

时间:2020-12-11 05:01:01
有2张表,分别是专业表t_eol_pro(pro_id,pro_name,pro_state,pro_kens----知识点数量,默认为0.表示可用,1为不可用); 
                            知识点变t_eol_ken(ken_id,ken_name,pro_id,ken_state) 
                  当我向知识点表t_eol_ken插入一条数据的时候,专业表t_eol_pro中的pro_kens数量+1,这个触发器已经写出来了 
            当改变知识点状态ken_state为1的时候表示这个知识点不可用,然后专业表t_eol_pro中的pro_kens数量-1。 

create or replace trigger rowupdate 
        after update on T_EOL_KEN 
        declare 
        old_value int; 
        new_value int; 
        upid int; 
    begin 
    if updating then 
        old_value:=:Old.ken_state; 
        new_value:=:New.ken_state; 
        upid:=:Old.pro_id; 
        end if; 
    if(old_value=0 and new_value=1) then 
    
        update T_EOL_PRO set T_EOL_PRO.PRO_KENS=T_EOL_PRO.PRO_KENS -1 where PRO_ID=upid; 
                    
      end if; 
end rowupdate; 
             现在遇到的问题是:当修改ken_state状态为1(禁用)的时候 提示我触发器未重新认证,请高手指点,在线等解答 先谢谢了!!!

12 个解决方案

#1



--原来的if a=0 and a=1 then...是错误的,给改了下:

create or replace trigger rowupdate
  after update on T_EOL_KEN
begin
  if (:Old.ken_state = 0 or :New.ken_state = 1) and updating then
    update T_EOL_PRO
       set PRO_KENS = PRO_KENS - 1
     where PRO_ID = :Old.pro_id;
  end if;
end rowupdate;



引用楼主 sunchenglin8888 的帖子:
有2张表,分别是专业表t_eol_pro(pro_id,pro_name,pro_state,pro_kens----知识点数量,默认为0.表示可用,1为不可用); 
                            知识点变t_eol_ken(ken_id,ken_name,pro_id,ken_state) 
                  当我向知识点表t_eol_ken插入一条数据的时候,专业表t_eol_pro中的pro_kens数量+1,这个触发器已经写出来了 
            当改变知识点状态ken_state为1的时候表示这个知识点不可用,然后专业表t_e…

#2


按你的创建触发器的时候 提示我给:New and : Old赋值 应该赋什么呢?

#3


1.:New and : Old 均为本条update记录的,不需要赋值的。

2.LZ可以修改T_EOL_KEN表中的一条记录ken_state=0,然后查看:
select * from T_EOL_PRO where PRO_ID=...;



引用 2 楼 sunchenglin8888 的回复:
按你的创建触发器的时候 提示我给:New and : Old赋值 应该赋什么呢?

#4


很多人都说不需要赋值 但我一创建的时候就出个提示框让我赋值 而且赋什么都不对 提示“ORA-01036: 非法的变量名/编号”这是什么原因啊?我的Oracle有问题吗?

#5


很多人都说不需要赋值 但我一创建的时候就出个提示框让我赋值 而且赋什么都不对 提示“ORA-01036: 非法的变量名/编号”这是什么原因啊?我的Oracle有问题吗?

#6


:NEW, :OLD 要用在行级触发器。

#7


create or replace trigger rowupdate 
      after update on T_EOL_KEN
      for each row


#8



create or replace trigger rowupdate
  before update on T_EOL_KEN
begin
  if  :New.ken_state = 1 then
    update T_EOL_PRO
       set PRO_KENS = PRO_KENS - 1   --这里要保证减1后的值不能为负数。
     where PRO_ID = :Old.ken_id;
  end if;
end rowupdate;



引用 5 楼 sunchenglin8888 的回复:
很多人都说不需要赋值 但我一创建的时候就出个提示框让我赋值 而且赋什么都不对 提示“ORA-01036: 非法的变量名/编号”这是什么原因啊?我的Oracle有问题吗?

#9



create or replace trigger rowupdate
  before update on T_EOL_KEN
  for each row
begin
  if  :New.ken_state = 1 then
    update T_EOL_PRO
       set PRO_KENS = PRO_KENS - 1   --这里要保证减1后的值不能为负数。
     where PRO_ID = :Old.ken_id;
  end if;
end rowupdate;

#10


:NEW 和:OLD
要用行级触发器。
FOR EACH ROW

#11


哦 我貌似知道了 我以前一直用代码在SQL里直接创建 然后就提示我给:New and : Old赋值,
等我在触发器里直接创建的时候就没有提示了,不知道到底是不是这个原因,现在问题解决了 触发器也弄好了 
不过我现在只有20分啊 你们说应该给谁啊 你们的回答对我都有帮助啊,很为难 我刚刚注册的这样论坛 就给了我20分 怎么办呢?

#12


经过修改后的触发器:
  trigger rowupdate
  before update on T_EOL_KEN for each row
begin
  if  :New.ken_state = 1 then
    update T_EOL_PRO
       set PRO_KENS = PRO_KENS - 1
     where PRO_ID = :Old.pro_id;
  elsif :New.ken_state = 0 then
    update T_EOL_PRO
   set PRO_KENS = PRO_KENS + 1
  where PRO_ID = :Old.pro_id;
  end if;
end rowupdate;
/
这是直接在Oracle的Trigger里创建的代码,希望能给和我一样 刚刚接触Oracle触发器的朋友门一些帮助吧!!!

#1



--原来的if a=0 and a=1 then...是错误的,给改了下:

create or replace trigger rowupdate
  after update on T_EOL_KEN
begin
  if (:Old.ken_state = 0 or :New.ken_state = 1) and updating then
    update T_EOL_PRO
       set PRO_KENS = PRO_KENS - 1
     where PRO_ID = :Old.pro_id;
  end if;
end rowupdate;



引用楼主 sunchenglin8888 的帖子:
有2张表,分别是专业表t_eol_pro(pro_id,pro_name,pro_state,pro_kens----知识点数量,默认为0.表示可用,1为不可用); 
                            知识点变t_eol_ken(ken_id,ken_name,pro_id,ken_state) 
                  当我向知识点表t_eol_ken插入一条数据的时候,专业表t_eol_pro中的pro_kens数量+1,这个触发器已经写出来了 
            当改变知识点状态ken_state为1的时候表示这个知识点不可用,然后专业表t_e…

#2


按你的创建触发器的时候 提示我给:New and : Old赋值 应该赋什么呢?

#3


1.:New and : Old 均为本条update记录的,不需要赋值的。

2.LZ可以修改T_EOL_KEN表中的一条记录ken_state=0,然后查看:
select * from T_EOL_PRO where PRO_ID=...;



引用 2 楼 sunchenglin8888 的回复:
按你的创建触发器的时候 提示我给:New and : Old赋值 应该赋什么呢?

#4


很多人都说不需要赋值 但我一创建的时候就出个提示框让我赋值 而且赋什么都不对 提示“ORA-01036: 非法的变量名/编号”这是什么原因啊?我的Oracle有问题吗?

#5


很多人都说不需要赋值 但我一创建的时候就出个提示框让我赋值 而且赋什么都不对 提示“ORA-01036: 非法的变量名/编号”这是什么原因啊?我的Oracle有问题吗?

#6


:NEW, :OLD 要用在行级触发器。

#7


create or replace trigger rowupdate 
      after update on T_EOL_KEN
      for each row


#8



create or replace trigger rowupdate
  before update on T_EOL_KEN
begin
  if  :New.ken_state = 1 then
    update T_EOL_PRO
       set PRO_KENS = PRO_KENS - 1   --这里要保证减1后的值不能为负数。
     where PRO_ID = :Old.ken_id;
  end if;
end rowupdate;



引用 5 楼 sunchenglin8888 的回复:
很多人都说不需要赋值 但我一创建的时候就出个提示框让我赋值 而且赋什么都不对 提示“ORA-01036: 非法的变量名/编号”这是什么原因啊?我的Oracle有问题吗?

#9



create or replace trigger rowupdate
  before update on T_EOL_KEN
  for each row
begin
  if  :New.ken_state = 1 then
    update T_EOL_PRO
       set PRO_KENS = PRO_KENS - 1   --这里要保证减1后的值不能为负数。
     where PRO_ID = :Old.ken_id;
  end if;
end rowupdate;

#10


:NEW 和:OLD
要用行级触发器。
FOR EACH ROW

#11


哦 我貌似知道了 我以前一直用代码在SQL里直接创建 然后就提示我给:New and : Old赋值,
等我在触发器里直接创建的时候就没有提示了,不知道到底是不是这个原因,现在问题解决了 触发器也弄好了 
不过我现在只有20分啊 你们说应该给谁啊 你们的回答对我都有帮助啊,很为难 我刚刚注册的这样论坛 就给了我20分 怎么办呢?

#12


经过修改后的触发器:
  trigger rowupdate
  before update on T_EOL_KEN for each row
begin
  if  :New.ken_state = 1 then
    update T_EOL_PRO
       set PRO_KENS = PRO_KENS - 1
     where PRO_ID = :Old.pro_id;
  elsif :New.ken_state = 0 then
    update T_EOL_PRO
   set PRO_KENS = PRO_KENS + 1
  where PRO_ID = :Old.pro_id;
  end if;
end rowupdate;
/
这是直接在Oracle的Trigger里创建的代码,希望能给和我一样 刚刚接触Oracle触发器的朋友门一些帮助吧!!!