Você não pode chamar
RAISE
dinamicamente (com EXECUTE
) em PL/pgSQL - que funciona apenas para instruções SQL e RAISE
é um comando PL/pgSQL. Use esta função simples em vez disso:
CREATE OR REPLACE FUNCTION f_raise(text)
RETURNS void
LANGUAGE plpgsql AS
$func$
BEGIN
RAISE EXCEPTION '%', $1;
END
$func$;
Ligar:
SELECT f_raise('My message is empty!');
Relacionado:
Resposta adicional para comentário
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$;
Ligar:
SELECT f_raise1('the','manual','educates');
-
VARIADIC
não é um tipo de dados, mas um modo de argumento .
-
Os elementos devem ser tratados como qualquer outro elemento de matriz.
-
Para usar várias variáveis em umRAISE
declaração, coloque vários%
no texto da mensagem.
O exemplo acima falhará se não houver
$3
é passado. Você teria que montar uma string a partir do número variável de elementos de entrada. Exemplo: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$;
Ligar:
SELECT f_raise2('the','manual','educates');
Duvido que você precise de um
VARIADIC
parâmetro para isso. Leia o manual aqui .Em vez disso, defina todos os parâmetros, talvez adicione padrões:
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$;
Ligar:
SELECT f_raise3('the','manual','educates');
Ou:
SELECT f_raise3(); -- defaults kick in