日期:2014-05-17  浏览次数:20740 次

关于存储过程的小问题
请先前辈帮忙先大致看看以下两个简单的过程: 
  procedure savemsgs(var_msgid in varchar2,var_categoryid in varchar2,var_publicshdate in varchar2, 
  var_title in varchar2,var_result out integer) 
  as num integer default 0; 
  begin 
  select count(rownum) into num from msgs where upper(msgid)=upper(var_msgid); 
  if num=1 then  
  update msgs set categoryid=var_categoryid,author=var_author, 
  publishdate=to_date(var_publishdate, 'yyyy-mm-dd hh24:mi:ss '), 
  title=var_title where upper(msgid)=upper(var_msgid); 
  if SQL%rowcount >0 then 
  var_result:=1; commit; 
  else var_result:=0; rollback; 
  end if; 
  else var_result:=-1; return; 
  end savemsgs; 

  procedure GetOnlineUserNum(var_num out number,var_result out number) 
  as begin 
  select count(rownum) into var_num from users where upper(void)= 'N ' 
  and upper(loginin)= 'Y '; 
  var_result:=1; 
  exception when others then var_result:=0; var_num:=0; return; 
  end GetOnlineUserNum; 
  就第一个过程,每个数据库会话读取一个数据库快照,而且存储过程是个一个 
  事务,既然在快照里检索出记录数为一,那么update就不会出现SQL%COUNT < >1的情况, 
  倘若事务提交时,已经有其他事务删除了那条符合的记录并且提交了,那么对于原事务, 
  是会返回给应用程序一个错误嘛,这个错误是无法捕捉到的,而且事务好象会自动回滚的。 
  是不是这样的? 
  第二个过程中,有可能出现异常吗,数据类型不会错啊,我觉得异常段是多余的,
  而且除数据字典外大小写不是不区分的吗,使用upper函数会不会多余,
  请各位前辈举例教教我,谢谢!

------解决方案--------------------
去看看多版本一致性