您的位置:首页 > 数据库 > Oracle

oracle中的事务是自动开始的

2005-03-09 09:00 483 查看
由于现在一个项目要转换到oracle上,新接触oracle,以前的sybase库中这样的存储过程都要改动到oracle上,下边这个该怎么写??谢谢:
BEGIN
IF @@TRANCOUNT>0
SAVE TRAN TRAN_SEQ
ELSE
BEGIN
BEGIN TRANSACTION TRAN_SEQ
UPDATE table_1 SET number2 =number2+1 WHERE key='key'
IF (@@ROWCOUNT=0) //关键这一个在oracle中是不是no_data_found?
insert into table_1 ....//省略了一下,就是如果update没有数据,就insert一条
IF @@ERROR <> 0 //出错
BEGIN
ROLLBACK TRANSACTION TRAN_SEQ
--SELECT 0
RETURN 101
END
SELECT @ID =number FROM table_1 WHERE key = 'key'
COMMIT TRANSACTION TRAN_SEQ
RETURN 100
END
END

我写对应的oracle如下:
//下边这两句好像是错的,在oracle中该怎么对应?
IF @@TRANCOUNT>0
SAVE TRAN TRAN_1
//下边的调试通过,但是不能触发no_data_found,该怎么修改?
BEGIN TRANSACTION TRAN_1;
UPDATE table_1 SET number2 = number2+1 WHERE key = 'key';
EXCEPTION
WHEN NO_DATA_FOUN THEN
BEGIN;
INSERT INTO table_1(number2,key) VALUES(1,'key');
EXCEPTION
WHEN OTHERS THEN
ROLLBACK TRANSACTION TRAN_1;
RETURN 1111;
END;

END;
SELECT number2 INTO ID FROM table_1 WHERE key= 'key';
COMMIT TRANSACTION TRAN_1;
reTURN 100;
END;

oracle中的事务是自动开始的,
执行一个sql时,就开始了一个事务,
直到commit或rollback语句执行,所有语句都属于一个事务,
commit或rollback语句执行后,如果还有sql执行,就又开始了一个
事务。对于你那个存储过程,这么改应该就行了。

BEGIN
SAVEPoint TRAN_SEQ;
//设定一个事务点,一定要这个,这样就不会影响以前的事务了。
// 相当于sybase中那个事务判断
UPDATE table_1 SET number2 =number2+1 WHERE key='key'
if SQL%ROWCOUNT = 0 then --用这个来判断是否更新了记录。
INSERT INTO table_1(number2,key) VALUES(1,'key');
end if;
EXCEPTION //出错
BEGIN
ROLLBACK to TRAN_SEQ;
RETURN 101;
Exit;
END;
SELECT @ID =number FROM table_1 WHERE key = 'key'
COMMIT work;
RETURN 100 ;
END ;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: