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

¿Cómo escribir una función que devuelva texto o valores enteros?

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.