Способ подавления PostgreSQL-ошибки с помощью пользовательской ошибки

#sql #database #postgresql

#sql #База данных #postgresql

Вопрос:

В течение последних часов я застрял на проблеме, что я хочу пользовательскую ошибку («Неправильный airline_id. Пожалуйста, проверьте свой ввод еще раз «) поверх обычного кода ошибки (вставка или обновление в таблице «flightplan» нарушает ограничение внешнего ключа «fk_flightplan_airline»).

Но что бы я ни пробовал, я всегда получаю стандартную ошибку. Пожалуйста, помогите.

 CREATE OR REPLACE FUNCTION add_flight(
  PLAN_ID INT,
  AIRLINE_ID INT,
  STATUS_ID INT)
  RETURNS void AS $BODY$
  BEGIN
  INSERT INTO flight.flightgplan VALUES(
    PLAN_ID,
    AIRLINE_ID,
    STATUS_ID);
  IF airline_id > 8 THEN RAISE EXCEPTION USING errcode = 99881;
  ELSE IF status_id > 10 THEN RAISE EXCEPTION USING errcode = 99882;
  END IF;
 EXCEPTION
  WHEN SQLSTATE '99881' THEN raise EXCEPTION 'Wrong airline_id. Please check your input again';
  WHEN SQLSTATE '99882' THEN raise EXCEPTION 'Wrong status_id. Please check your input again';
  END;
$BODY$ LANGUAGE plpgsql;
 

Ответ №1:

Пользовательские исключения должны быть сгенерированы перед выполнением вставки, чтобы вставка не выполнялась:

 IF airline_id > 8 THEN RAISE EXCEPTION USING errcode = 99881;
ELSE IF status_id > 10 THEN RAISE EXCEPTION USING errcode = 99882;
END IF;
INSERT INTO flight.flightgplan VALUES(
    PLAN_ID,
    AIRLINE_ID,
    STATUS_ID);