既然存储过程里有
commit
when exception
rollback;
那么没必要Delphi里再Adoconnection1.CommitTrnas;
RollBackTrans了,虽然Oracle支持嵌套事务处理,但你也没
必要这样做,要头脑清醒!我爱Delphi!
commit
when exception
rollback;
那么没必要Delphi里再Adoconnection1.CommitTrnas;
RollBackTrans了,虽然Oracle支持嵌套事务处理,但你也没
必要这样做,要头脑清醒!我爱Delphi!
Adoconnection.begintrans
....
....做相关的操作
.... point A
调用oracle 中的存储过程生成流水号
point B
....
try
Adoconnection.comminttrans
except
Adoconnection.Rollback
但在执行后只回到 B 点而不是A 点
这样如果在调用oracle 中的存储过程生成流水号 后commit时只提交oracle 中的存储过程中内容就可以了,PROCEDURE Update_seq(m_TBLNAME in varchar,m_NewRecNo out number)
as
v_REC_NUM s_seq.REC_NUM%TYPE ;
begin
select count(*) into v_REC_NUM
from s_seq
where upper(TBLNAME) = upper(m_TBLNAME) ;
if v_REC_NUM >0 then
update s_seq set REC_NUM=REC_NUM+1 where upper(TBLNAME) = upper(m_TBLNAME) ;
select REC_NUM into m_NewRecNo
from s_seq
where upper(TBLNAME) = upper(m_TBLNAME);
else
insert into s_seq (TBLNAME,REC_NUM) values(m_TBLNAME,1) ;
m_NewRecNo:=1 ;
end if ;
COMMIT ;
end;
//point A
调用oracle 中的存储过程生成流水号
//point B
except
showmessage('error!');
exit;
end;----------------------------PROCEDURE Update_seq(m_TBLNAME in varchar,m_NewRecNo out number)
as
v_REC_NUM s_seq.REC_NUM%TYPE ;
begin
select count(*) into v_REC_NUM
from s_seq
where upper(TBLNAME) = upper(m_TBLNAME) ;
if v_REC_NUM >0 then
update s_seq set REC_NUM=REC_NUM+1 where upper(TBLNAME) = upper(m_TBLNAME) ;
select REC_NUM into m_NewRecNo
from s_seq
where upper(TBLNAME) = upper(m_TBLNAME);
else
insert into s_seq (TBLNAME,REC_NUM) values(m_TBLNAME,1) ;
m_NewRecNo:=1 ;
end if ; COMMIT ; exception --只用一层事务处理,Delphi里就不写事务处理语句了,让Oracle进行事务处理
when others then
Rollback;
END;
我爱Delphi!
存储过程中的那个commit 是不可少的可是如果把 外面的事务给不要的话那我的操作就和生成流水号的成了一个事务了还是实现不了我的功能。
我在delphi 中起用的是一个大的事务而生成流水号的那存储过程只是其中的一个小的功能可在oracle 中的存储过程中的那个commit 是必有的这样如果这个存储过程不是一个新地事务(和外面的分开)那在当中commit 后就把我delphi 中本来还不能提交的事务给提交了从而使我在delphi中起用的事务失效。
我现在要的是如何在存储过程中的commit 中提交存储过程本身的内容而不是我外面我还不想提交的内容一块给提交。