Oracle
 sql >> Base de données >  >> RDS >> Oracle

Relever la déclaration

Non. Le bloc dans son ensemble sera annulé en cas d'échec, mais la raise l'instruction seule n'effectue pas de restauration.

Par exemple, ce bloc échoue et est implicitement annulé (exactement comme s'il s'agissait d'un insert SQL etc.):

begin
    insert into demo(id) values(1);
    dbms_output.put_line(sql%rowcount || ' row inserted');
    raise program_error;
exception
    when program_error then raise;
end;

ERROR at line 1:
ORA-06501: PL/SQL: program error
ORA-06512: at line 6

SQL> select * from demo;

no rows selected

Mais ce bloc n'est pas annulé, même s'il y a une raise à l'intérieur :

begin
    begin
        insert into demo(id) values(1);
        dbms_output.put_line(sql%rowcount || ' row inserted');
        raise program_error;
    exception
        when program_error then
            dbms_output.put_line('Raising exception');
            raise;
    end;
exception
    when program_error then null;
end;

1 row inserted
Raising exception

PL/SQL procedure successfully completed.

SQL> select * from demo;

        ID
----------
         1

1 row selected.