Di cosa hai probabilmente bisogno
Molto probabilmente hai bisogno di una funzione per restituire text
e un altro per restituire integer
o una funzione che restituisce boolean
per indicare il successo. Tutto questo è banale e vi rimando all'ottimo manuale su CREATE FUNCTION
o esempi di codice in domande simili su SO.
Cosa hai effettivamente chiesto
Come scrivere una funzione che restituisce testo o valori interi?
... nel senso che ne abbiamo uno il tipo restituito è text
o integer
. Non così banale, ma nemmeno impossibile come è stato suggerito. La parola chiave è:tipi polimorfici .
Basandosi su questo semplice tavolo:
CREATE TABLE tbl(
tbl_id int,
txt text,
nr int
);
Questa funzione restituisce un numero intero o un testo (o qualsiasi altro tipo se consentito), a seconda del tipo di input.
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;
Chiama:
SELECT f_insert_data(1, 'foo'::text); -- explicit cast needed.
SELECT f_insert_data(1, 7);
Caso semplice
Uno funzione che restituisce TRUE
/ FALSE
per indicare se è stata inserita una riga, un solo parametro di input di tipo diverso:
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;
Il tipo di input può essere sostituito con un text
parametro per la maggior parte degli scopi, che può essere eseguito il cast da e verso qualsiasi altro tipo.