PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como executar o comando RAISE do PostgreSQL dinamicamente


Você não pode chamar RAISE dinamicamente (com EXECUTE ) em PL/pgSQL - que funciona apenas para instruções SQL e RAISE é um comando PL/pgSQL.

Use esta função simples em vez disso:
CREATE OR REPLACE FUNCTION f_raise(text)
  RETURNS void
  LANGUAGE plpgsql AS
$func$
BEGIN
   RAISE EXCEPTION '%', $1;
END
$func$;

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

Relacionado:

Resposta adicional para comentário

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

Ligar:
SELECT f_raise1('the','manual','educates');

  • VARIADIC não é um tipo de dados, mas um modo de argumento .

  • Os elementos devem ser tratados como qualquer outro elemento de matriz.

  • Para usar várias variáveis ​​em um RAISE declaração, coloque vários % no texto da mensagem.

O exemplo acima falhará se não houver $3 é passado. Você teria que montar uma string a partir do número variável de elementos de entrada. Exemplo:
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$;

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

Duvido que você precise de um VARIADIC parâmetro para isso. Leia o manual aqui .
Em vez disso, defina todos os parâmetros, talvez adicione padrões:
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$;

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

Ou:
SELECT f_raise3();  -- defaults kick in