Эквивалентный или альтернативный метод для выражения RAISE EXCEPTION для функции в LANGUAGE sql?

Существует ли эквивалент (или обходной путь) для инструкции RAISE EXCEPTION для функции, написанной ниже в LANGUAGE sql?

CREATE OR REPLACE FUNCTION fn_interpolation (p_yearinteger integer, 
p_admin_id integer, p_crop_id integer, p_cropparameter integer)

RETURNS TABLE (value ****** precision, remark text)

AS $$

WITH

yearvalues AS (SELECT yearinteger, value FROM cropvalues WHERE crops_id = 
p_crop_id AND admin_id = p_admin_id AND parameter_id = p_cropparameter),

Мне нужна функция для отмены и RETURN сообщение об ошибке, если аргументы, введенные в функцию, не существуют. например, IF parameter_id != p_cropparameter THEN RAISE EXCEPTION 'invalid cropparameter END IF

1 ответ

Просто определите тривиальную функцию обертки.

CREATE OR REPLACE FUNCTION raise_exception(text) RETURNS text AS $$
BEGIN
 RAISE EXCEPTION '%',$1;
END;
$$ LANGUAGE plpgsql VOLATILE;

затем используйте CASE:

SELECT CASE 
 WHEN parameter_id != p_cropparameter 
 THEN raise_exception("blah") 
 ELSE parameter_id 
 END;

Это работает только в том случае, если CASE противном случае возвращает text, например, если parameter_id является целым числом:

regress=> SELECT CASE WHEN 1 = 2 THEN raise_exception('blah') ELSE 1 END;
ERROR: CASE types integer and text cannot be matched
LINE 1: SELECT CASE WHEN 1 = 2 THEN raise_exception('blah') ELSE 1 E...

Вы можете обойти это с помощью взлома с использованием полиморфных функций. Определение:

CREATE OR REPLACE FUNCTION raise_exception(anyelement, text) RETURNS anyelement AS $$
BEGIN
 RAISE EXCEPTION '%',$2;
 RETURN $1;
END;
$$ LANGUAGE plpgsql VOLATILE;

затем передать поддельное значение типа case, чтобы тип PostgreSQL соответствовал ему, например,

SELECT CASE WHEN 1 = 1 THEN raise_exception(0, 'blah') ELSE 1 END;

или

SELECT CASE WHEN 1 = 1 THEN raise_exception(NULL::integer, 'blah') ELSE 1 END;

Все кажутся слишком тяжелыми? Это потому, что на самом деле такого рода вещи обычно лучше всего делают в PL/PgSQL.

licensed under cc by-sa 3.0 with attribution.