sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man kör PostgreSQL RAISE-kommandot dynamiskt

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
    



    1. MySQL - Att kombinera INSERT, VALUES och SELECT?

    2. Bästa metoder för att hålla lösenord i shell / Perl-skript?

    3. MySQL:fylla tomma fält med nollor när du använder GROUP BY

    4. Hur ställer jag in sql_mode i my.cnf i MySQL 8?