sql >> データベース >  >> RDS >> Oracle

声明を上げる

    いいえ。ブロック全体が失敗するとロールバックされますが、raise ステートメント自体はロールバックを実行しません。

    たとえば、このブロックは失敗し、暗黙的にロールバックされます(SQLのinsertであるかのように) など):

    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
    

    ただし、raiseがある場合でも、このブロックはロールバックされません。 その中:

    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.
    



    1. PostgreSQLの計算/計算/仮想/派生列

    2. WHEREIN句を使用したSQLクエリ

    3. 最速のランダム選択WHERE列XはY(NULL)

    4. Dapper.NETおよび複数の結果セットを持つストアドプロシージャ