请先前辈帮忙先大致看看以下两个简单的过程: 
   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函数会不会多余,
    请各位前辈举例教教我,谢谢! 

解决方案 »

  1.   

    你那个存储过程估计都编译不了,给你改一下吧:
    create or replace procedure savemsgs(var_msgid in varchar2,var_categoryid in varchar2,
                                         var_publicshdate in varchar2,  
                                         var_title in varchar2,var_result out integer)  is  num integer:=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%notfound then 
                var_result:=0;
                return;
              end if;
              
              var_result:=1;
              commit;
           else    
             var_result:=-1;     
             return;  
           end if;
    end savemsgs;     
       
       
    procedure GetOnlineUserNum(var_num out number,var_result out number)  
       is
    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;