sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man skriver en funktion som returnerar text eller heltalsvärden?

Vad du förmodligen behöver

Troligtvis behöver du en funktion för att returnera text och ytterligare en för att returnera integer eller en funktion som returnerar boolean för att indikera framgång. Allt detta är trivialt och jag hänvisar dig till den utmärkta manualen om CREATE FUNCTION eller kodexempel i liknande frågor om SO.

Vad du faktiskt frågade

Hur skriver man en funktion som returnerar text- eller heltalsvärden?

... i den meningen att vi har en returtyp är antingen text eller integer . Inte så trivialt, men inte heller omöjligt som har föreslagits. Nyckelordet är:polymorfa typer .

Bygger på detta enkla bord:

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

Den här funktionen returnerar antingen heltal eller text (eller någon annan typ om du tillåter det), beroende på inmatningstypen.

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:

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

Enkelt fall

En funktion som returnerar TRUE / FALSE för att indikera om en rad har infogats, endast en indataparameter av varierande typ:

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;

Inmatningstypen kan ersättas med en text parameter för de flesta ändamål, som kan castas till och från vilken annan typ som helst.



  1. Finns det något sätt att bädda in power bi-rapporter och instrumentpaneler i vb.net- eller C#-skrivbordsapplikationer med sql server 2008-databas?

  2. LEN() vs DATALENGTH() i SQL Server

  3. Behöver ordna anställdas namn enligt deras stad kolumnvis

  4. PostgreSQL Autoincrement