请先前辈帮忙先大致看看以下两个简单的过程:
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; 第一个过程中,在num=1时已说明记录存在,更新就不会因不存在记录而无法进行了,那为什么还需要判断SQL%COUNT的情况
呢?不是多余吗,这时记录肯定存在的呀。而且就算会出现SQL%COUNT=0的情况,那也没必要rollback嘛,因为更新都没成
功?
第二个过程中,有可能出现异常吗,数据类型不会错啊,我觉得异常段是多余的,请各位前辈举例教教我,谢谢!
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; 第一个过程中,在num=1时已说明记录存在,更新就不会因不存在记录而无法进行了,那为什么还需要判断SQL%COUNT的情况
呢?不是多余吗,这时记录肯定存在的呀。而且就算会出现SQL%COUNT=0的情况,那也没必要rollback嘛,因为更新都没成
功?
第二个过程中,有可能出现异常吗,数据类型不会错啊,我觉得异常段是多余的,请各位前辈举例教教我,谢谢!
你count得出的结果是有1个记录符合条件,不排除这个记录随即被删除的可能,如果这个记录被删掉了,那么你的update就会出问题。第二个过程看起来有点没有必要,但有异常处理还是比较稳妥一些,毕竟在一个大系统中,什么地方会出问题是不能完全预知的。btw SQL语句中对字段名称使用upper函数处理之后再和相关变量对比,如果没有使用函数索引的话,会导致全表遍历的。
就第一个过程,每个数据库会话读取一个数据库快照,而且存储过程是个一个
事务,既然在快照里检索出记录数为一,那么update就不会出现SQL%COUNT<>1的情况,
倘若事务提交时,已经有其他事务删除了那条符合的记录并且提交了,那么对于原事务,
是会返回给应用程序一个错误嘛,这个错误是无法捕捉到的,而且事务好象会自动回滚的。
是不是这样的?
要使用函数索引,我得去补充下知识,不过也有点奇怪的是,oracle里除数据字典外其他数据
是不区分大小写的,是不是没必要使用upper了?
谢谢!
session a 做删除记录操作,但还没有COMMIT; SESSION B执行你的存储过程,由读一致性,SELECT 的数据是UNDO SEGMENT中的副本,NUM正常为1,此时会话A提交,然后你的UPDATE就会出错。