Не можете да извикате RAISE
динамично (с EXECUTE
) в PL/pgSQL - това работи само за SQL изрази и RAISE
е PL/pgSQL команда.
Вместо това използвайте тази проста функция:
CREATE OR REPLACE FUNCTION f_raise(text)
RETURNS void
LANGUAGE plpgsql AS
$func$
BEGIN
RAISE EXCEPTION '%', $1;
END
$func$;
Обаждане:
SELECT f_raise('My message is empty!');
Свързани:
Допълнителен отговор към коментар
CREATE OR REPLACE FUNCTION f_raise1(VARIADIC text[])
RETURNS void
LANGUAGE plpgsql AS
$func$
BEGIN
RAISE EXCEPTION 'Reading % % %!', $1[1], $1[2], $1[3];
END
$func$;
Обаждане:
SELECT f_raise1('the','manual','educates');
-
VARIADIC
не е тип данни, а режим на аргумент . -
Елементите трябва да се обработват като всеки друг елемент от масив.
-
За да използвате множество променливи в
RAISE
израз, поставете няколко%
в текста на съобщението.
Горният пример ще се провали, ако няма $3
се преминава. Ще трябва да сглобите низ от променливия брой входни елементи. Пример:
CREATE OR REPLACE FUNCTION f_raise2(VARIADIC _arr text[])
RETURNS void
LANGUAGE plpgsql AS
$func$
DECLARE
_msg text := array_to_string(_arr, ' and '); -- simple string construction
BEGIN
RAISE EXCEPTION 'Reading %!', _msg;
END
$func$;
Обаждане:
SELECT f_raise2('the','manual','educates');
Съмнявам се, че имате нужда от VARIADIC
параметър за това изобщо. Прочетете ръководството тук .
Вместо това дефинирайте всички параметри, може би добавете стойности по подразбиране:
CREATE OR REPLACE FUNCTION f_raise3(_param1 text = ''
, _param2 text = ''
, _param3 text = 'educates')
RETURNS void
LANGUAGE plpgsql AS
$func$
BEGIN
RAISE EXCEPTION 'Reading % % %!', $1, $2, $3;
END
$func$;
Обаждане:
SELECT f_raise3('the','manual','educates');
Или:
SELECT f_raise3(); -- defaults kick in