oracle中的事务是自动开始的


由于现在一个项目要转换到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 ;

你可能感兴趣的:(oracle/sql)