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

Sådan udføres PostgreSQL RAISE kommando dynamisk

Du kan ikke kalde RAISE dynamisk (med EXECUTE ) i PL/pgSQL - der kun virker til SQL-sætninger, og RAISE er en PL/pgSQL-kommando.

Brug denne simple funktion i stedet:

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

Ring til:

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

Relateret:

Yderligere svar på argumenttilstand .

  • Elementer skal håndteres som ethvert andet array-element.

  • At bruge flere variable i en RAISE sætning, indsæt flere % ind i beskedteksten.

  • Ovenstående eksempel vil mislykkes, hvis ingen $3 er bestået. Du bliver nødt til at samle en streng fra det variable antal input-elementer. Eksempel:

    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 til:

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

    Jeg tvivler på, at du har brug for en VARIADIC parameter for dette overhovedet. Læs manualen her .
    Definer i stedet alle parametre, tilføj måske standardindstillinger:

    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 til:

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

    Eller:

    SELECT f_raise3();  -- defaults kick in
    



    1. Hvordan opbygger jeg en oversigt ved at slutte mig til en enkelt tabel med SQL Server?

    2. Tæller null-værdier som unik værdi

    3. Sammenligner Amazon RDS Point-in-Time Recovery med ClusterControl

    4. Brug af MariaDB med Entity Framework