create or replace procedure SP_DEL_USERGROUP
(
   iUserGroupID number
)
as
  del1 VARCHAR(20);
  del2 VARCHAR(20);
  del3 VARCHAR(20);
  errorNum number;
begin
     del1 := 'del1';
     del2 := 'del2';
     del3 := 'del3';
     errorNum := 0;
     
     
    --删除用户表中对应用户组的用户
    BEGIN TRAN @del1;
    delete  from bmps_baseinfo_usergroup c
    where c.usergroupid=iUserGroupID;
    
    IF @@error<>0
    BEGIN
     SELECT errorNum:=@@error;
     PRINT '出现系统错误,错误号为:'+char(@@error);
   END
   select @@error=0; --重置错误
   --车队用户组关联表
   BEGIN TRAN @del2
   delete from  BMPS_ASSIGN_MCUUSERGROUP b where b.usergroupid=iUserGroupID;
   IF @@error<>0
   BEGIN
     SELECT @errorNum:=@errorNum+@@error ;
     PRINT '出现系统错误,错误号为:'+char(@@error);
   END
   select @@error=0;
   --删除对应用户组
   BEGIN TRAN @del3
   delete  from  bmps_assign_usergroup a where  a.usergroupid=iUserGroupID;
   IF @@error<>0
   BEGIN
     SELECT @errorNum:=@errorNum+@@error ;
     PRINT '出现系统错误,错误号为:'+char(@@error);
   END   ---错误统一处理回滚
   IF @errorNum<>0
    BEGIN
         ROLLBACK TRAN @del1;
         ROLLBACK TRAN @del2;
         ROLLBACK TRAN @del3;
         PRINT '删除数据有误,已经回滚';
    END
   ELSE
     BEGIN
        COMMIT TRANSACTION @del1;
        COMMIT TRANSACTION @del2;
        COMMIT TRANSACTION @del3;
        PRINT '删除数据成功';
     END
end SP_DEL_USERGROUP;我这里删除三个表中指定数据,每一个删除一个事物,每次记录错误,发现三个中有一个错误都全部回滚,可是报了不少的错误。。(我这里将每次错误记录迭加最后与0比较)
莫见笑啊,各位怎么修改这段SQL,怎么优化。。

解决方案 »

  1.   

    先了解一下oracle与sql server的不同之处
    下面的代码自己测试一下
    CREATE OR REPLACE PROCEDURE SP_DEL_USERGROUP(iUserGroupID NUMBER) AS
      v_sqlcode PLS_INTEGER;
      v_sqlerrm VARCHAR2(2000);
    BEGIN
      --删除用户表中对应用户组的用户
      DELETE FROM bmps_baseinfo_usergroup c WHERE c.usergroupid = iUserGroupID;  --车队用户组关联表
      DELETE FROM BMPS_ASSIGN_MCUUSERGROUP b
       WHERE b.usergroupid = iUserGroupID;  --删除对应用户组
      DELETE FROM bmps_assign_usergroup a WHERE a.usergroupid = iUserGroupID;
      COMMIT;
      dbms_output.put_line('删除数据成功');
    EXCEPTION
      WHEN OTHERS THEN
        ROLLBACK;
        v_sqlcode := SQLCODE;
        v_sqlerrm := SQLERRM;
        dbms_output.put_line('删除数据有误,已经回滚');
        dbms_output.put_line('错误号:' || v_sqlcode || ',' || '错误信息:' ||
                             v_sqlerrm);
    END SP_DEL_USERGROUP;
      

  2.   

    这个根本就不是oracle的写法。