Lo que probablemente necesites
Lo más probable es que necesite una función para devolver text
y otro para devolver integer
o una función que devuelve boolean
para indicar el éxito. Todo esto es trivial y lo remitiré al excelente manual sobre CREATE FUNCTION
o ejemplos de código en preguntas similares en SO.
Lo que realmente preguntaste
¿Cómo escribir una función que devuelva texto o valores enteros?
... en el sentido de que tenemos uno el tipo de retorno es text
o integer
. No tan trivial, pero tampoco imposible como se ha sugerido. La palabra clave es:tipos polimórficos .
Sobre la base de esta sencilla tabla:
CREATE TABLE tbl(
tbl_id int,
txt text,
nr int
);
Esta función devuelve un número entero o texto (o cualquier otro tipo si lo permite), según el 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;
Llamar:
SELECT f_insert_data(1, 'foo'::text); -- explicit cast needed.
SELECT f_insert_data(1, 7);
Caso sencillo
Uno función que devuelve TRUE
/ FALSE
para indicar si se ha insertado una fila, solo un parámetro de entrada de tipo variable:
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;
El tipo de entrada se puede reemplazar con un text
parámetro para la mayoría de los propósitos, que se puede convertir a y desde cualquier otro tipo.