PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come scrivere una funzione che restituisce testo o valori interi?

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.