U kunt RAISE
niet bellen dynamisch (met EXECUTE
) in PL/pgSQL - dat werkt alleen voor SQL-statements, en RAISE
is een PL/pgSQL-commando.
Gebruik in plaats daarvan deze eenvoudige functie:
CREATE OR REPLACE FUNCTION f_raise(text)
RETURNS void
LANGUAGE plpgsql AS
$func$
BEGIN
RAISE EXCEPTION '%', $1;
END
$func$;
Bel:
SELECT f_raise('My message is empty!');
Gerelateerd:
Aanvullend antwoord op commentaar
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$;
Bel:
SELECT f_raise1('the','manual','educates');
-
VARIADIC
is geen gegevenstype, maar een argumentmodus . -
Elementen moeten worden behandeld als elk ander array-element.
-
Meerdere variabelen gebruiken in een
RAISE
statement, plaats meerdere%
in de berichttekst.
Het bovenstaande voorbeeld zal mislukken als er geen $3
. is wordt doorgegeven. Je zou een string moeten samenstellen uit het variabele aantal invoerelementen. Voorbeeld:
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$;
Bel:
SELECT f_raise2('the','manual','educates');
Ik betwijfel of je een VARIADIC
nodig hebt parameter hiervoor helemaal niet. Lees de handleiding hier .
Definieer in plaats daarvan alle parameters, voeg eventueel standaardwaarden toe:
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$;
Bel:
SELECT f_raise3('the','manual','educates');
Of:
SELECT f_raise3(); -- defaults kick in