W tym wykładzie zobaczymy, jakie typy danych są wspierane w PL/pgSQL i nauczymy się efektywnie z nich korzystać. Skupimy się na czterech typach danych:
INTEGERdo pracy z liczbami.TEXTdo obsługi tekstów.BOOLEANdo pracy z wartościami logicznymi.RECORDdo pracy z dynamicznymi strukturami danych.
Każdy typ danych pokażemy na przykładach, żebyś mógł zobaczyć ich użycie w praktyce.
Obsługiwane typy danych w PL/pgSQL
PL/pgSQL obsługuje wszystkie typy danych, które znasz z PostgreSQL. Od prostych numerycznych (INTEGER, NUMERIC) po bardziej złożone, jak tablice i JSONB. Przejdźmy przez najważniejsze.
Typy prymitywne:
INTEGER,BIGINT,FLOAT,NUMERIC— typy liczbowe.TEXT,CHAR,VARCHAR— tekstowe.BOOLEAN— typ logiczny.
Typy złożone:
RECORD— do pracy z dynamicznymi zestawami danych.ROWTYPE— do pracy z typami wierszy tabeli.- Tablice i JSON — będą omówione później na kursie.
Praca z typem INTEGER
INTEGER to jeden z najczęściej używanych typów danych. Służy do przechowywania liczb całkowitych. W PL/pgSQL możesz go używać do obliczeń, pracy z identyfikatorami rekordów i sprawdzania warunków.
Przykład: liczenie liczby rekordów
Załóżmy, że mamy tabelę students i chcemy się dowiedzieć, ilu studentów jest zapisanych w bazie.
DO $$
DECLARE
total_students INTEGER; -- Zmienna do przechowywania liczby studentów
BEGIN
SELECT COUNT(*) INTO total_students FROM students; -- Zapisujemy wynik zapytania do zmiennej
RAISE NOTICE 'Liczba studentów: %', total_students; -- Wyświetlamy komunikat
END;
$$;
Ważne rzeczy przy pracy z INTEGER:
- W PL/pgSQL przypisanie wartości do zmiennej robi się przez słowo kluczowe
INTO. - Jeśli spróbujesz zapisać do
INTEGERwartość zmiennoprzecinkową, dostaniesz błąd. W takich przypadkach użyjNUMERICalboFLOAT.
Praca z typem TEXT
TEXT służy do przechowywania danych tekstowych. Przyda się, gdy trzeba pracować z imionami, opisami albo innymi tekstami.
Przykład: wyświetlanie imion studentów
W tym przykładzie wyświetlimy imiona wszystkich studentów z tabeli students.
DO $$
DECLARE
student_name TEXT; -- Zmienna na imię studenta
BEGIN
FOR student_name IN SELECT name FROM students LOOP
RAISE NOTICE 'Imię studenta: %', student_name; -- Wyświetlamy każde imię
END LOOP;
END;
$$;
Przydatne funkcje do pracy z TEXT:
UPPER()iLOWER()— zamiana na wielkie/małe litery.CONCAT()— łączenie tekstów.LENGTH()— długość tekstu.
Na przykład:
DO $$
DECLARE
full_name TEXT;
BEGIN
full_name := CONCAT('Aleks', ' Min'); -- Łączymy teksty
RAISE NOTICE 'Pełne imię: %', UPPER(full_name); -- Drukujemy imię wielkimi literami
END;
$$;
Praca z typem BOOLEAN
BOOLEAN odpowiada za przechowywanie wartości logicznych: TRUE, FALSE i NULL. Ten typ danych jest szczególnie przydatny przy sprawdzaniu warunków i filtrowaniu danych.
Przykład: sprawdzanie aktywności studenta
Załóżmy, że masz tabelę students z kolumną is_active, która pokazuje, czy student jest aktywny.
DO $$
DECLARE
is_active BOOLEAN; -- Zmienna do przechowywania aktywności
BEGIN
SELECT is_active INTO is_active FROM students WHERE id = 1; -- Pobieramy wartość z tabeli
IF is_active THEN
RAISE NOTICE 'Student jest aktywny!';
ELSE
RAISE NOTICE 'Student NIE jest aktywny.';
END IF;
END;
$$;
Ważne rzeczy przy pracy z BOOLEAN:
- Wartości logiczne możesz używać bezpośrednio w warunkach
IFiWHILE. - Wartość
NULLw logice jest "nieokreślona", więc trzeba to brać pod uwagę przy sprawdzaniu.
Praca z typem RECORD
RECORD to mocny typ danych, który służy do przechowywania wierszy danych bez z góry określonej struktury. Jest szczególnie przydatny, gdy pracujesz z wynikami zapytań SQL, które zwracają kilka kolumn.
Przykład: przechodzenie przez wszystkie rekordy tabeli
W następnym przykładzie przechodzimy przez wszystkie rekordy tabeli students i wyświetlamy imię oraz ID każdego studenta.
DO $$
DECLARE
student RECORD; -- Dynamiczny typ do przechowywania wiersza danych
BEGIN
FOR student IN SELECT id, name FROM students LOOP
RAISE NOTICE 'ID: %, Imię: %', student.id, student.name; -- Odwołujemy się do kolumn rekordu
END LOOP;
END;
$$;
Ważne rzeczy przy pracy z RECORD:
- Zmienna typu
RECORDjest wypełniana tylko wewnątrz pętli lub przy użyciu zapytaniaSELECT INTO. - Do kolumn odwołujesz się przez
record.nazwa_kolumny.
Typy danych ROWTYPE do pracy z tabelami
Jeśli chcesz zapisać cały rekord z tabeli (i mieć przy tym jasną typizację), możesz użyć typu ROWTYPE. On automatycznie dziedziczy strukturę wiersza tabeli.
Przykład: praca z typem ROWTYPE
DO $$
DECLARE
student students%ROWTYPE; -- Zmienna ze strukturą wiersza tabeli students
BEGIN
SELECT * INTO student FROM students WHERE id = 1; -- Ładujemy dane wiersza do zmiennej
RAISE NOTICE 'Imię studenta: %, Kurs: %', student.name, student.course;
END;
$$;
Różnice między RECORD a ROWTYPE
| Charakterystyka | RECORD | ROWTYPE |
|---|---|---|
| Struktura kolumn | Nie jest określona z góry | Zależy od tabeli lub zapytania |
| Użycie | Elastyczność dla dowolnego wyniku | Sztywne powiązanie ze strukturą |
Praktyczny przykład
Napiszmy funkcję, która zwraca liczbę aktywnych studentów i ich imiona.
CREATE FUNCTION active_students_report() RETURNS TABLE(id INT, name TEXT) AS $$
BEGIN
RETURN QUERY
SELECT id, name FROM students WHERE is_active = TRUE;
END;
$$ LANGUAGE plpgsql;
Wywołanie funkcji:
SELECT * FROM active_students_report();
Błędy przy pracy z typami danych
Czasem praca z danymi prowadzi do błędów. Oto kilka typowych sytuacji:
- Błąd typu: próba zapisania tekstu do zmiennej
INTEGER(np.my_var := 'abc';). - Użycie
NULLtam, gdzie oczekiwane jestTRUEalboFALSE. - Nieprawidłowe użycie
RECORDbez inicjalizacji.
Jak unikać błędów:
- Zawsze jawnie określaj typ zmiennych.
- Sprawdzaj typy danych kolumn w tabelach przed zapisem.
- Używaj poleceń debugujących, takich jak
RAISE NOTICE.
Teraz już wiesz, jak pracować z typami danych INTEGER, TEXT, BOOLEAN i RECORD w PL/pgSQL. Ta wiedza pozwoli Ci pisać bardziej złożone i mocniejsze programy w proceduralnym języku PostgreSQL.
GO TO FULL VERSION