сгенерировать по условию ошибку, затем обработать её (rollback выполнить) и пробросить ошибку дальше.
                  
                  
                  Сейчас написал вот так, но естественно не работает :)
                  
                  
                  
                  
                  
                  create or replace procedure test( i_int integer )
                  
                  
                  as $$
                  
                  
                  declare
                  
                  
                    v_err_message text;
                  
                  
                  begin
                  
                  
                    -- Проверяем входные параметры
                  
                  
                    if ( i_int is not null ) then
                  
                  
                      raise 'Order ID is null!';
                  
                  
                    end if;
                  
                  
                    
                  
                  
                  exception
                  
                  
                    when others then
                  
                  
                      rollback;
                  
                  
                     
                  
                  
                      get stacked diagnostics v_err_message = MESSAGE_TEXT;
                  
                  
                      raise v_err_message;
                  
                  
                  end;
                  
                  
                  $$ language plpgsql;
                  
                  
                
Если я правильно помню, в случае исключения транзакция фейлится и закоммитить её нельзя. Выкидывайте исключение и всего делов. И из опыта: управлять транзакциями внутри многоуровнего стека вызовов - плохая идея. Замучаетесь отлаживать в случае чего.
А зачем Вы вообще используете процедуры (не вижу никакой необходимости в примере... как и почти всегда)? По "пробросить ошибку дальше" — просто "RAISE;", нет?
Обсуждают сегодня