Du kan inte ringa RAISE
dynamiskt (med EXECUTE
) i PL/pgSQL - som bara fungerar för SQL-satser, och RAISE
är ett PL/pgSQL-kommando.
Använd den här enkla funktionen istället:
CREATE OR REPLACE FUNCTION f_raise(text)
RETURNS void
LANGUAGE plpgsql AS
$func$
BEGIN
RAISE EXCEPTION '%', $1;
END
$func$;
Ring:
SELECT f_raise('My message is empty!');
Relaterat:
Ytterligare svar på argumentläge .
Element måste hanteras som alla andra arrayelement.
Att använda flera variabler i en RAISE
sats, sätt flera %
i meddelandetexten.
Ovanstående exempel kommer att misslyckas om ingen $3
är godkänd. Du måste sätta ihop en sträng från det variabla antalet inmatningselement. Exempel:
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$;
Ring:
SELECT f_raise2('the','manual','educates');
Jag tvivlar på att du behöver en VARIADIC
parameter för detta överhuvudtaget. Läs handboken här .
Definiera istället alla parametrar, kanske lägg till standardvärden:
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$;
Ring:
SELECT f_raise3('the','manual','educates');
Eller:
SELECT f_raise3(); -- defaults kick in