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

Hvordan skriver man en funktion, der returnerer tekst eller heltalsværdier?

Hvad du sandsynligvis har brug for

Mest sandsynligt har du brug for én funktion for at returnere text og en anden for at returnere integer eller en funktion, der returnerer boolean for at indikere succes. Alt dette er trivielt, og jeg vil henvise dig til den fremragende manual om CREATE FUNCTION eller kodeeksempler i lignende spørgsmål om SO.

Hvad du faktisk spurgte

Hvordan skriver man en funktion, der returnerer tekst eller heltalsværdier?

... i den forstand, at vi har en returtype er enten text eller integer . Ikke så trivielt, men heller ikke umuligt, som det er blevet foreslået. Nøgleordet er:polymorfe typer .

Bygger på denne enkle tabel:

CREATE TABLE tbl(
  tbl_id int,
  txt    text,
  nr     int
);

Denne funktion returnerer enten heltal eller tekst (eller enhver anden type, hvis du tillader det), afhængigt af inputtypen.

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;

Ring til:

SELECT f_insert_data(1, 'foo'::text);  -- explicit cast needed.
SELECT f_insert_data(1, 7);

Simpelt tilfælde

En funktion, der returnerer TRUE / FALSE for at angive om en række er blevet indsat, kun én inputparameter af varierende type:

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;

Indtastningstypen kan erstattes med en text parameter til de fleste formål, som kan castes til og fra enhver anden type.



  1. Sådan får du størrelsen på en tabel i MySQL

  2. Installer utf8-sortering i PostgreSQL

  3. SQLite aggregerede funktioner

  4. Hvordan Oracle Index klyngefaktor beregnes