触发器if else写法 oracle触发器

故事是这样的,这边有个项目是我们的项目经理写的项目,但是有些功能还是需要外包去做,然后外包做好了,却对项目经理的数据库不了解,然后就想了下,让我去做触发器来适配他们,让外包插入数据到他们的表的时候触发事件到我项目经理的表里去,这里的触发是如果项目经理的表有数据,就修改数据,如果没有就插入数据,效果类似merge,也不晓得究竟能用不.唉不管了,简单的写了一下 。
关键还是if else的写法,开始的时候写,老报错,苦恼了一段时间,我就纳闷,我写个触发器连if else都不会,以后还搞什么,然后各种百度,无奈还是没解决,就拼运气上群里问问,结果还真解决了…

oracle 的if else 嵌套语法
先建一个变量,注意,是在declare 和 begin 之间写

declare
		result number;
	begin
		if  1>2  then
		    result = 2;
		else
		    result = 2;
		end if;
	end;	

----------------结果编译出错了…请看下面,编译是正确的!!-------------------------------------------------------------

declare
		result number;
	begin
		if  1>2  then
		    result := 2;
		else
		    result := 2;
		end if;
	end;	

–发现了什么?对,在等号前加了个冒号,就行了。解释是 直接等于是比较关系 :=才是赋值…

在 if 判断语句 then 的后面加一个 begin 关键字 ,语句中就可以写多行语句了!但是要在语句后面加一个end;
例:

declare
	result number;
	begin
		if  1>2  then begin
		   	select ....
			insert ...
			update...
		  end;
		else begin
			delete....
			insert...
			select...
		 end;
		end if;
	end;	

//下面是项目实战的触发器

declare
 HISID varchar(64);
 DRUGID number(6);
 DRUGNAME VARCHAR(32);
 dataCount number;
 dataCount2 number;
 tankNo number;--柜号
 tankNoString varchar2(255);
 
begin
   tankNo:=  ((to_number(:new.mccode)-1)*195+(:new.mccol-1)*13+:new.mcrow);
   SELECT r.DRUGID2 into HISID FROM DRUGNAME r where r.DRUGNAME = :new.GRANULENAME ; 
	 SELECT r.DRUGID  into DRUGID FROM DRUGNAME r where r.DRUGNAME = :new.GRANULENAME ; 
  -- SELECT count(*) into dataCount from Drawer r where r.WCLASS =:new.MCCODE AND r.WROW =:new.MCROW AND r.WCOL = :new.MCCOL;
   SELECT count(*) into dataCount from Drawer r where r.WCLASS =:new.MCCODE AND  r.DRAWERID= tankNo;

	if dataCount>0 then begin 
				update drawer dr set 
        dr.drugid = DRUGID,
			  dr.DRID=:new.granulecode,
				dr.drugid2=HISID 
				where dr.DRAWERID = tankNo AND dr.WROW =:new.MCROW and dr.WCOL = :new.MCCOL ;
       end;
    else begin  -- 
      if tankNo <10 then begin
					tankNoString:='S00'||tankNo;
					INSERT INTO DRAWER(DRAWERID,WCLASS,WCOL,WROW,DRUGID,DRID,DRUGID2) 
					VALUES(tankNo,:new.mccode,:new.mccol,:new.mcrow,DRUGID,tankNoString,HISID);
				end;
			end if;
			if  (tankNo <100 and tankNo >10 ) then begin
					tankNoString:='S0'||tankNo;
				  INSERT INTO DRAWER(DRAWERID,WCLASS,WCOL,WROW,DRUGID,DRID,DRUGID2) 
					VALUES(tankNo,:new.mccode,:new.mccol,:new.mcrow,DRUGID,tankNoString,HISID);
				end;
			end if;
			if  (tankNo <1000 and tankNo >100 ) then begin
					tankNoString:='S'||tankNo;
				  INSERT INTO DRAWER(DRAWERID,WCLASS,WCOL,WROW,DRUGID,DRID,DRUGID2) 
					VALUES(tankNo,:new.mccode,:new.mccol,:new.mcrow,DRUGID,tankNoString,HISID);
				end;
			end if;	
       end;
    end if;
end;

如果你认真看了,你就会发现,下面我有3个if判断语句都没有用 else if,不是我不用,是用了会报错,如果哪位兄弟知道了怎么使用,请给我留言.谢谢

你可能感兴趣的