sql >> Database >  >> RDS >> PostgreSQL

Hoe schrijf je een functie die tekst- of integerwaarden retourneert?

Wat u waarschijnlijk nodig heeft

Hoogstwaarschijnlijk heb je één functie nodig om text te retourneren en nog een om integer te retourneren of een functie die boolean teruggeeft succes aan te duiden. Dit is allemaal triviaal en ik verwijs je naar de uitstekende handleiding op CREATE FUNCTION of codevoorbeelden in soortgelijke vragen over SO.

Wat je eigenlijk hebt gevraagd

Hoe schrijf je een functie die tekst of gehele getallen retourneert?

... in de zin dat we één . hebben retourtype is ofwel text of integer . Niet zo triviaal, maar ook niet onmogelijk als is gesuggereerd. Het sleutelwoord is:polymorfe typen .

Voortbouwend op deze eenvoudige tafel:

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

Deze functie retourneert een geheel getal of tekst (of een ander type als u dit toestaat), afhankelijk van het invoertype.

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;

Bel:

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

Eenvoudig geval

Eén functie die TRUE teruggeeft / FALSE om aan te geven of een rij is ingevoegd, slechts één invoerparameter van verschillend 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;

Het invoertype kan worden vervangen door een text parameter voor de meeste doeleinden, die van en naar elk ander type kan worden gecast.



  1. Afbeeldingen toewijzen aan structuurweergaveknooppunten

  2. Entiteitsframework PostgreSQL

  3. Als GETDATE() op veel plaatsen wordt gebruikt, is het dan beter om een ​​variabele te gebruiken?

  4. Maakt het toevoegen van 'LIMIT 1' aan MySQL-query's ze sneller als u weet dat er maar één resultaat zal zijn?