sql >> Database >  >> RDS >> PostgreSQL

Hoe de PostgreSQL RAISE-opdracht dynamisch uit te voeren?

U kunt RAISE niet bellen dynamisch (met EXECUTE ) in PL/pgSQL - dat werkt alleen voor SQL-statements, en RAISE is een PL/pgSQL-commando.

Gebruik in plaats daarvan deze eenvoudige functie:

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

Bel:

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

Gerelateerd:

Aanvullend antwoord op commentaar

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

Bel:

SELECT f_raise1('the','manual','educates');
  • VARIADIC is geen gegevenstype, maar een argumentmodus .

  • Elementen moeten worden behandeld als elk ander array-element.

  • Meerdere variabelen gebruiken in een RAISE statement, plaats meerdere % in de berichttekst.

Het bovenstaande voorbeeld zal mislukken als er geen $3 . is wordt doorgegeven. Je zou een string moeten samenstellen uit het variabele aantal invoerelementen. Voorbeeld:

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

Bel:

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

Ik betwijfel of je een VARIADIC nodig hebt parameter hiervoor helemaal niet. Lees de handleiding hier .
Definieer in plaats daarvan alle parameters, voeg eventueel standaardwaarden toe:

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

Bel:

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

Of:

SELECT f_raise3();  -- defaults kick in



  1. Panda's:bestanden lezen en schrijven

  2. Waarom verbetert STRAIGHT_JOIN deze zoekopdracht zo drastisch, en wat betekent het als het achter het SELECT-sleutelwoord wordt geschreven?

  3. 12c IDENTITEIT kolommen

  4. PostgreSQL:op afstand verbinding maken met Postgres-instantie met behulp van de opdracht psql