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 ;
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 ;
相关文章推荐
- Oracle 事务的开始与结束
- ORA-02041: 客户数据库未开始一个事务处理 .NET 连接低版本ORACLE时需要注意的问题
- oracle_存储过程_没有参数_根据配置自动创建申请单以及写日志事务回滚
- C#.NET执行Oracle DBLink关于“ORA-02041: 客户数据库未开始一个事务处理”
- Oracle-事务处理开始与结束情况;事务的保存点
- ORACLE查询当前最早的事务的开始时间
- 最近碰到一个oracle“分布式事务处理已经开始”的问题
- Asp.net Oracle transaction事务出现奇怪的aotucommit自动提交现象及解决办法
- oracle事务处理 自动提交
- Asp.net Oracle 事务出现奇怪的自动提交现象及解决办法
- oracle分布式处理时报“ORA-02041: 客户数据库未开始一个事务处理”解决办法 - z
- Oracle 表创建序列-触发 实现表ID自动增长
- Oracle自动编号列的创建
- Oracle 9i & 10g编程艺术-深入数据库体系结构——第8章:事务
- 并发事务下各数据库外部表现实测之二(Oracle篇)
- 在地图页面,自动布局控件开始是隐藏或在屏幕外需要正常显示时再为正常的显示状态的,需要在显示之前加入
- oracle中的事务
- Oracle解决单表字符串日期自动更新问题
- WORD 开新章节 自动从新的一页开始
- oracle 储存过程 每天凌晨 更新sequence 从0 开始