PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come eseguire il comando RAISE di PostgreSQL in modo dinamico

Non puoi chiamare RAISE dinamicamente (con EXECUTE ) in PL/pgSQL - che funziona solo per le istruzioni SQL e RAISE è un comando PL/pgSQL.

Usa invece questa semplice funzione:

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

Chiama:

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

Correlati:

Risposta aggiuntiva a commento

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

Chiama:

SELECT f_raise1('the','manual','educates');
  • VARIADIC non è un tipo di dati, ma una modalità argomento .

  • Gli elementi devono essere gestiti come qualsiasi altro elemento dell'array.

  • Per utilizzare più variabili in un RAISE istruzione, inserisci più % nel testo del messaggio.

L'esempio sopra avrà esito negativo se non $3 è passato. Dovresti assemblare una stringa dal numero variabile di elementi di input. Esempio:

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

Chiama:

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

Dubito che tu abbia bisogno di un VARIADIC parametro per questo affatto. Leggi il manuale qui .
Invece, definisci tutti i parametri, magari aggiungi dei default:

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

Chiama:

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

Oppure:

SELECT f_raise3();  -- defaults kick in