CodeGym /Kursy /SQL SELF /Typy danych i ich użycie w PL/pgSQL: INTEGER, TEXT, BOOLE...

Typy danych i ich użycie w PL/pgSQL: INTEGER, TEXT, BOOLEAN, RECORD

SQL SELF
Poziom 49 , Lekcja 4
Dostępny

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:

  • INTEGER do pracy z liczbami.
  • TEXT do obsługi tekstów.
  • BOOLEAN do pracy z wartościami logicznymi.
  • RECORD do 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.

  1. Typy prymitywne:

    • INTEGER, BIGINT, FLOAT, NUMERIC — typy liczbowe.
    • TEXT, CHAR, VARCHAR — tekstowe.
    • BOOLEAN — typ logiczny.
  2. 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 INTEGER wartość zmiennoprzecinkową, dostaniesz błąd. W takich przypadkach użyj NUMERIC albo FLOAT.

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() i LOWER() — 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 IF i WHILE.
  • Wartość NULL w 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 RECORD jest wypełniana tylko wewnątrz pętli lub przy użyciu zapytania SELECT 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 NULL tam, gdzie oczekiwane jest TRUE albo FALSE.
  • Nieprawidłowe użycie RECORD bez 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.

1
Ankieta/quiz
Wprowadzenie do PL/pgSQL, poziom 49, lekcja 4
Niedostępny
Wprowadzenie do PL/pgSQL
Wprowadzenie do PL/pgSQL
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION