Некоторые отличия в обработке исключений на примере пользовательской функции:
Код: Выделить всё
CREATE OR REPLACE FUNCTION hr.getlastname (p_name text) RETURNS varchar AS $function$
DECLARE
v_lastname TEXT;
BEGIN
SELECT last_name INTO STRICT v_lastname FROM employees WHERE UPPER(first_name) = UPPER(p_name);
RETURN v_lastname;
EXCEPTION
WHEN no_data_found THEN
RAISE NOTICE 'Не нашлось строк для %', p_name;
RETURN 'Неизвестно';
WHEN too_many_rows THEN
RAISE NOTICE 'Неоднозначный набор строк для %', p_name;
RETURN 'Неизвестно';
WHEN OTHERS THEN
RAISE NOTICE 'Непредвиденная ошибка';
RAISE;
END;
$function$
LANGUAGE PLPGSQL
STABLE;
Код: Выделить всё
demo=# SELECT getlastname('Jack');
getlastname
-------------
Livingston
(1 row)
demo=# SELECT getlastname('Bob');
NOTICE: Не найден сотрудник Bob
getlastname
-------------
Неизвестно
(1 row)
demo=# SELECT getlastname('Peter');
NOTICE: Найдено более одного сотрудника Peter
getlastname
-------------
Неизвестно
(1 row)
Код: Выделить всё
demo=# SELECT getlastname2('Bob');
getlastname2
--------------
(1 row)
demo=# SELECT getlastname2('Peter');
getlastname2
--------------
Vargas
(1 row)