PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment exécuter dynamiquement la commande PostgreSQL RAISE

Vous ne pouvez pas appeler RAISE dynamiquement (avec EXECUTE ) dans PL/pgSQL - qui ne fonctionne que pour les instructions SQL, et RAISE est une commande PL/pgSQL.

Utilisez plutôt cette fonction simple :

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

Appel :

SELECT f_raise('My message is empty!');

Connexe :

Réponse supplémentaire à commentaire

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$;

Appel :

SELECT f_raise1('the','manual','educates');
  • VARIADIC n'est pas un type de données, mais un mode argument .

  • Les éléments doivent être traités comme n'importe quel autre élément de tableau.

  • Pour utiliser plusieurs variables dans un RAISE instruction, mettez plusieurs % dans le texte du message.

L'exemple ci-dessus échouera si aucun $3 est passé. Vous devez assembler une chaîne à partir du nombre variable d'éléments d'entrée. Exemple :

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$;

Appel :

SELECT f_raise2('the','manual','educates');

Je doute que vous ayez besoin d'un VARIADIC paramètre pour cela du tout. Lisez le manuel ici .
Définissez plutôt tous les paramètres, ajoutez peut-être des valeurs par défaut :

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$;

Appel :

SELECT f_raise3('the','manual','educates');

Ou :

SELECT f_raise3();  -- defaults kick in