Oracle
 sql >> Database >  >> RDS >> Oracle

Alza la dichiarazione

No. Il blocco nel suo insieme verrà annullato in caso di errore, ma il raise di per sé non esegue un rollback.

Ad esempio, questo blocco ha esito negativo e viene eseguito il rollback implicito (esattamente come se fosse un insert SQL ecc):

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

Ma questo blocco non viene ripristinato, anche se c'è un raise al suo interno:

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.