PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak napisać funkcję, która zwraca tekst lub wartości całkowite?

Czego prawdopodobnie potrzebujesz

Najprawdopodobniej potrzebujesz jednej funkcji, aby zwrócić text a drugi zwraca integer lub funkcja zwracająca boolean aby wskazać sukces. Wszystko to jest trywialne i odsyłam cię do doskonałego podręcznika CREATE FUNCTION lub przykłady kodu w podobnych pytaniach na SO.

O co właściwie pytałeś

Jak napisać funkcję, która zwraca tekst lub wartości całkowite?

... w tym sensie, że mamy jeden zwracany typ to text lub integer . Nie tak trywialne, ale też nie niemożliwe, jak sugerowano. Kluczowym słowem jest:typy polimorficzne .

Opierając się na tej prostej tabeli:

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

Ta funkcja zwraca liczbę całkowitą lub tekst (lub dowolny inny typ, jeśli na to zezwolisz), w zależności od typu danych wejściowych.

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;

Zadzwoń:

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

Prosty przypadek

Jeden funkcja zwracająca TRUE / FALSE aby wskazać, czy wstawiono wiersz, tylko jeden parametr wejściowy różnego 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 wejścia można zastąpić text parametr dla większości celów, który może być rzutowany do iz dowolnego innego typu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przegląd parametrów połączenia libpq sslpassword w PostgreSQL 13

  2. Postgres:wybierz sumę wartości, a następnie zsumuj ją ponownie

  3. Dostrajanie operacji wejścia/wyjścia (I/O) dla PostgreSQL

  4. Porównanie opcji baz danych w chmurze dla PostgreSQL

  5. Dynamiczne przekazywanie nazw kolumn dla zmiennej rekordu w PostgreSQL