Procedury składowane w PostgreSQL/Typy danych

Z Wikibooks, biblioteki wolnych podręczników.

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)