Procedury składowane w PostgreSQL/Typy danych

Procedury składowane operują na typach danych istniejących w bazie danych, zarówno wbudowanych jak i zdefiniowanych przez użytkownika.

Proste typy danych:

  • liczby całkowite (m.in. integer),
  • liczby rzeczywiste (m.in. real, numeric),
  • wartości logiczne (boolean),
  • napisy (m.in. char, varchar, text),
  • data i czas (date, time, timestamp),
  • void - typ pusty, używany do oznaczenia, że procedura nic nie zwraca, analogicznie jak w C, czy C++.

Złożone typy danych:

  • tablice (array),
  • rekordy (utworzone przez CREATE TYPE lub CREATE TABLE, czyli wprost związany z tabelą),
  • typy wyliczeniowe (enum).

Typy zdefiniowane w PL/pgSQL:

  • RECORD - rekord o nieustalonej strukturze, mogący przechowywać dowolne rekordy (patrz niżej); używany między innymi w wyzwalaczach.
  • REFCURSOR - reprezentuje kursory, zarówno o ograniczonym, jak i niezdefiniowanym typie.
  • TRIGGER - psedotyp podawany jako wartość zwracana w procedurach wyzwalaczy.

Dostępne są również typy abstrakcyjne, pozwalające definiować procedury generyczne:

  • anyelement - dowolny typ;
  • anyarray - dowolna tablica;
  • anynonarray - dowolny typ, za wyjątkiem tablicowego.

Typ RECORD

edytuj

Pseudotyp record reprezentuje rekord dowolnego typu. Dopóki nie zostanie wykonane przypisanie, jego struktura jest nieokreślona. Można wielokrotnie przypisywać do niego rekordy różnych typów.

Po przypisaniu odwołania do pól wykonuje się w tradycyjny sposób.

CREATE TABLE osoby (imie text, nazwisko text, wiek integer);
CREATE TABLE zwierzatka (gatunek text, imie text, kolor text);

CREATE FUNCTION test_record() RETURNS void AS $$
	DECLARE
		r	record;
	BEGIN
		-- r jest nieokreślony, próba odczytu zakończyłaby się błędem

		SELECT INTO r * FROM osoby;
		-- r udostępnia teraz pola imie, nazwisko, wiek
		RAISE NOTICE 'imię=%, nazwisko=%, wiek=%', r.imie, r.nazwisko, r.wiek;

		SELECT INTO r * FROM zwierzatka;
		-- r udostępnia teraz gatunek, imie, kolor
		RAISE NOTICE 'gatunek=%, imie=%, kolor=%', r.gatunek, r.imie, r.kolor;
	END;
$$ LANGUAGE 'plpgsql';

Funkcja pg_typeof

edytuj

Wbudowana funkcja pg_typeof(...) pozwala odczytać typ wyrażenia, np.

SELECT pg_typeof(1);
SELECT pg_typeof(ARRAY[1, 2, 3]);
SELECT pg_typeof(now());
 pg_typeof 
-----------
 integer
(1 row)

 pg_typeof 
-----------
 integer[]
(1 row)

        pg_typeof         
--------------------------
 timestamp with time zone
(1 row)