各位朋友好:
    现有一个SQL Server存储过程,其中有一小段部分是如下的形式:
    Begin
        Insert into 目标表名(字段值)
        If @@Error<>0 Return @@Error
    End;
  
    请问在将上述语句改为Oracle存储过程的时候,该如何处理?
    在PL/SQL里编写存储过程时,错误提示是Return不能返回表达式.
    再有一个问题:SQL Server里的@@Error是否对应于PL/SQL里的sqlcode? 就是返回错误号码的意思?
    SQL Server的存储过程相对来说比较简单,因为其本身提供了很多的系统变量,比如说@@Error,@@Identity等,而PL/SQL里的Oracle存储过程没有这些系统变量.相当于重写.
    在线急等将上述SQL Server存储过程片断转换为PL/SQL中Oracle存储过程对应的语句.

解决方案 »

  1.   


    --@@Error,这是Sqlserver里面的,
    --在Oracle中Error作为变量可直接使用。
    --如下为oracle 异常捕获的通用形式:
    ...
    Begin
    ...
    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Error ---' || SQLCODE || ': ' || SQLERRM);
        ROLLBACK;          --执行事务回滚。
    END;
      

  2.   

    可以改为oracle异常处理:when others exception 
        then 处理语句
     
      

  3.   

    详细参考下:
    http://blog.csdn.net/precipitant/archive/2007/10/31/1859403.aspx
      

  4.   

    那原来的SQL Server存储过程中的
      If @@Error<>0 Then Return @@Error
      会回滚事务吗?我感觉不会吧.只是停止程序的执行了.
      我这里只是Oracle存储过程的一个片断,是由SQL Server转换过来的,如果用Rollback它会将该插入的记录,及出现问题的记录全部回滚,我想要的结果是,该插入的插入,不该插入的提示,好像原来的SQL Server存储过程的这条语句也是这么个意思.
      

  5.   

    设置回滚点
    beginsavepoint p
    --......
    commit;
    exception 
       when others exception 
         rollback to p;
    end;
      

  6.   

    sql2K的时候,还没有加入begin try, end try, 如果在事务中没有set xabort on的话,就要用@@error来判断上个语句执行成功了没有。@@error返回0表示上个语句执行成功,否则即失败。
      

  7.   

       那比如说有很多记录,然后符合条件的记录与不符合条件的记录交替出现,按您这么讲的话,得设置好多的保存点吧。或者按您的意思是在存储过程的Insert语句之前写一个SavePoint,之后写一个Commit,然后每执行一次存储过程就先savepoint一下,然后Commit一下,如果sqlcode<>0就rollback到保存点P。然后再继续执行下面的其余程序。 
      貌似这样做也可以,但是好象比较繁琐,还有其他的处理方法吗?  另外,如果我就只想返回一个错误号码,比如说在2K里是@@Error,可以用Return @@Error,但在PL/SQL里Return后不可以有表达式,也就是说,不能用Return sqlcode这样的语句出现,(注:2K中的@@Error对应于PL/SQL里的sqlcode),请问该如何返回这个错误号码?
      

  8.   

    CREATE OR REPLACE PACKAGE Test_CUR
      AS
           TYPE Test_CURSOR IS REF CURSOR;
    END Test;create or replace procedure p_test(RC out Test_CUR) as
    begin
     insert into test_a valueS ('111'); insert into test_a VALUES('1111111111111111111111111111');---插入值过大会报异常
     EXCEPTION
     WHEN OTHERS THEN
     COMMIT;
     DBMS_OUTPUT.put_line('AAAA');
     open rc for
       select '错误信息' from dual;
    end;在异常处理代码段进行COMMIT处理  异常前面执行的语句都会进行数据 提交的 如果需要返回异常信息可以采用游标返回结果集的形式得到