sql >> Databáze >  >> RDS >> PostgreSQL

Jak napsat funkci, která vrací textové nebo celočíselné hodnoty?

Co pravděpodobně potřebujete

Pravděpodobně budete potřebovat jednu funkci, která vrátí text a další pro návrat integer nebo funkce, která vrací boolean naznačit úspěch. To vše je triviální a já vás odkážu na vynikající příručku o CREATE FUNCTION nebo příklady kódu v podobných otázkách na SO.

Na co jste se vlastně ptal

Jak napsat funkci, která vrací textové nebo celočíselné hodnoty?

... v tom smyslu, že máme jeden návratový typ je buď text nebo integer . Ne tak triviální, ale také ne nemožné, jak bylo naznačeno. Klíčové slovo je:polymorfní typy .

Na základě tohoto jednoduchého stolu:

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

Tato funkce vrací buď celé číslo nebo text (nebo jakýkoli jiný typ, pokud to povolíte), v závislosti na typu vstupu.

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;

Volejte:

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

Jednoduchý případ

Jedna funkce, která vrací TRUE / FALSE pro označení, zda byl vložen řádek, pouze jeden vstupní parametr různého typu:

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;

Typ vstupu lze nahradit text parametr pro většinu účelů, který lze přetypovat do az jakéhokoli jiného typu.



  1. Nasazení multicloudového clusteru PostgreSQL

  2. Plně rozumím PDO ATTR_PERSISTENT

  3. Porovnání datových úložišť pro PostgreSQL - MVCC vs InnoDB

  4. Byla zadána neplatná adresa URL Oracle:OracleDataSource.makeURL