Procedury składowane w PostgreSQL/Typy danych
Wygląd
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)