PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie schreibe ich eine Funktion, die Text oder Ganzzahlwerte zurückgibt?

Was Sie wahrscheinlich brauchen

Höchstwahrscheinlich benötigen Sie eine Funktion, um text zurückzugeben und eine andere, um integer zurückzugeben oder eine Funktion, die boolean zurückgibt Erfolg anzeigen. All dies ist trivial und ich verweise Sie auf das ausgezeichnete Handbuch zu CREATE FUNCTION oder Codebeispiele in ähnlichen Fragen zu SO.

Was Sie eigentlich gefragt haben

Wie schreibe ich eine Funktion, die Text- oder Ganzzahlwerte zurückgibt?

... in dem Sinne, dass wir einen haben Rückgabetyp ist entweder text oder integer . Nicht so trivial, aber auch nicht unmöglich, wie suggeriert wurde. Das Stichwort lautet:polymorphe Typen .

Aufbauend auf dieser einfachen Tabelle:

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

Diese Funktion gibt abhängig vom Eingabetyp entweder Integer oder Text (oder jeden anderen Typ, wenn Sie dies zulassen) zurück.

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;

Aufruf:

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

Einfacher Fall

Einer Funktion, die TRUE zurückgibt / FALSE um anzuzeigen, ob eine Zeile eingefügt wurde, nur ein Eingabeparameter unterschiedlichen Typs:

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;

Der Eingabetyp kann durch einen text ersetzt werden Parameter für die meisten Zwecke, der in und aus jedem anderen Typ umgewandelt werden kann.