PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So führen Sie den PostgreSQL RAISE-Befehl dynamisch aus

Sie können RAISE nicht anrufen dynamisch (mit EXECUTE ) in PL/pgSQL - das funktioniert nur für SQL-Anweisungen und RAISE ist ein PL/pgSQL-Befehl.

Verwenden Sie stattdessen diese einfache Funktion:

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

Aufruf:

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

Verwandte:

Zusätzliche Antwort auf Kommentar

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

Aufruf:

SELECT f_raise1('the','manual','educates');
  • VARIADIC ist kein Datentyp, sondern ein Argumentmodus .

  • Elemente müssen wie alle anderen Array-Elemente behandelt werden.

  • Um mehrere Variablen in einem RAISE zu verwenden Anweisung, setzen Sie mehrere % in den Nachrichtentext.

Das obige Beispiel schlägt fehl, wenn $3 nicht vorhanden ist ist bestanden. Sie müssten aus der variablen Anzahl von Eingabeelementen einen String zusammensetzen. Beispiel:

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

Aufruf:

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

Ich bezweifle, dass Sie ein VARIADIC benötigen Parameter dafür überhaupt. Lesen Sie das Handbuch hier .
Definiere stattdessen alle Parameter, füge vielleicht Standardwerte hinzu:

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

Aufruf:

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

Oder:

SELECT f_raise3();  -- defaults kick in