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.