sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo ejecutar dinámicamente el comando RAISE de PostgreSQL

No puedes llamar a RAISE dinámicamente (con EXECUTE ) en PL/pgSQL, que solo funciona para instrucciones SQL y RAISE es un comando PL/pgSQL.

Utilice esta función simple en su lugar:

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

Llamar:

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

Relacionado:

Respuesta adicional a comentario

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

Llamar:

SELECT f_raise1('the','manual','educates');
  • VARIADIC no es un tipo de datos, sino un modo argumento .

  • Los elementos deben manejarse como cualquier otro elemento de matriz.

  • Para usar múltiples variables en un RAISE declaración, poner múltiples % en el texto del mensaje.

El ejemplo anterior fallará si no $3 esta pasado. Tendría que ensamblar una cadena a partir del número variable de elementos de entrada. Ejemplo:

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

Llamar:

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

Dudo que necesites un VARIADIC parámetro para esto en absoluto. Lea el manual aquí .
En su lugar, defina todos los parámetros, tal vez agregue valores predeterminados:

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

Llamar:

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

O:

SELECT f_raise3();  -- defaults kick in