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

Como escrever uma função que retorna valores de texto ou inteiros?

O que você provavelmente precisa


Provavelmente você precisa de uma função para retornar text e outro para retornar integer ou uma função que retorna boolean para indicar sucesso. Tudo isso é trivial e vou encaminhá-lo para o excelente manual sobre CREATE FUNCTION ou exemplos de código em perguntas semelhantes sobre SO.

O que você realmente perguntou


Como escrever uma função que retorna valores de texto ou inteiros?

... no sentido de que temos um tipo de retorno sendo text ou integer . Não tão trivial, mas também não impossível como foi sugerido. A palavra-chave é:tipos polimórficos .

Com base nesta tabela simples:
CREATE TABLE tbl(
  tbl_id int,
  txt    text,
  nr     int
);

Esta função retorna um inteiro ou texto (ou qualquer outro tipo, se você permitir), dependendo do tipo de entrada.
CREATE FUNCTION f_insert_data(_id int, _data anyelement, OUT _result anyelement)
  RETURNS anyelement AS
$func$
BEGIN

CASE pg_typeof(_data) 
WHEN 'text'::regtype THEN
    INSERT INTO tbl(tbl_id, txt) VALUES(_id, _data)
    RETURNING txt
    INTO _result;

WHEN 'integer'::regtype THEN
    INSERT INTO tbl(tbl_id, nr) VALUES(_id, _data)
    RETURNING nr
    INTO _result;

ELSE
    RAISE EXCEPTION 'Unexpected data type: %', pg_typeof(_data)::text;
END CASE;

END
$func$
LANGUAGE plpgsql;

Ligar:
SELECT f_insert_data(1, 'foo'::text);  -- explicit cast needed.
SELECT f_insert_data(1, 7);

Caso simples


Um função que retorna TRUE / FALSE para indicar se uma linha foi inserida, apenas um parâmetro de entrada de tipo variável:
CREATE FUNCTION f_insert_data2(_id int, _data anyelement)
  RETURNS boolean AS
$func$
BEGIN

CASE pg_typeof(_data)
WHEN 'text'::regtype THEN
   INSERT INTO tbl(tbl_id, txt) VALUES(_id, _data);

WHEN 'integer'::regtype THEN
   INSERT INTO tbl(tbl_id, nr) VALUES(_id, _data);

ELSE
   RAISE EXCEPTION 'Unexpected data type: >>%<<', pg_typeof(_data)::text;
END CASE;

IF FOUND THEN RETURN TRUE;
ELSE RETURN FALSE;
END IF;

END
$func$
LANGUAGE plpgsql;

O tipo de entrada pode ser substituído por um text parâmetro para a maioria dos propósitos, que pode ser convertido de e para qualquer outro tipo.