Bu mühazirədə biz PL/pgSQL-də hansı data tiplərinin dəstəkləndiyini və onlarla necə effektiv işləməyi öyrənəcəyik. Əsas diqqət dörd data tipinə yönələcək:
INTEGER— rəqəmlərlə işləmək üçün.TEXT— sətirlərlə işləmək üçün.BOOLEAN— məntiqi dəyərlərlə işləmək üçün.RECORD— dinamik data strukturları ilə işləmək üçün.
Hər bir data tipini nümunələrlə izah edəcəyik ki, real istifadəsini görə biləsən.
PL/pgSQL-də dəstəklənən data tipləri
PL/pgSQL-də sənə PostgreSQL-dən tanış olan bütün data tipləri işləyir. Sadə rəqəm tiplərindən (INTEGER, NUMERIC) tutmuş, daha mürəkkəb tiplərə, məsələn massivlər və JSONB-yə qədər. Gəlin əsaslarına baxaq.
Primitiv tiplər:
INTEGER,BIGINT,FLOAT,NUMERIC— rəqəm tipləri.TEXT,CHAR,VARCHAR— mətn tipləri.BOOLEAN— məntiqi data tipi.
Mürəkkəb tiplər:
RECORD— dinamik data setləri üçün.ROWTYPE— cədvəlin sətrinin tipi ilə işləmək üçün.- Massivlər və JSON — bunları kursun sonrakı hissələrində öyrənəcəyik.
INTEGER tipi ilə işləmək
INTEGER — ən çox istifadə olunan data tiplərindən biridir. Tam ədədləri saxlamaq üçündür. PL/pgSQL-də bu tipdən hesablamalar, qeyd identifikatorları və şərtlərin yoxlanması üçün istifadə edə bilərsən.
Nümunə: qeyd sayını hesablamaq
Tutaq ki, bizdə students adlı cədvəl var və neçə tələbə olduğunu bilmək istəyirik.
DO $$
DECLARE
total_students INTEGER; -- Tələbələrin sayını saxlamaq üçün dəyişən
BEGIN
SELECT COUNT(*) INTO total_students FROM students; -- Sorğunun nəticəsini dəyişənə yazırıq
RAISE NOTICE 'Tələbələrin sayı: %', total_students; -- Mesaj çıxarırıq
END;
$$;
INTEGER ilə işləyərkən vacib məqamlar:
- PL/pgSQL-də dəyişənə dəyər vermək üçün
INTOaçar sözündən istifadə olunur. - Əgər
INTEGERtipinə onluq dəyər yazmağa çalışsan, səhv alacaqsan. Belə hallardaNUMERICvə yaFLOATistifadə et.
TEXT tipi ilə işləmək
TEXT sətir tipli dataları saxlamaq üçündür. Adlar, təsvirlər və ya başqa mətnlərlə işləyəndə lazım olur.
Nümunə: tələbələrin adlarını çıxarmaq
Bu nümunədə biz students cədvəlindən bütün tələbələrin adlarını çıxaracağıq.
DO $$
DECLARE
student_name TEXT; -- Tələbənin adı üçün dəyişən
BEGIN
FOR student_name IN SELECT name FROM students LOOP
RAISE NOTICE 'Tələbənin adı: %', student_name; -- Hər adı çıxarırıq
END LOOP;
END;
$$;
TEXT ilə işləmək üçün faydalı funksiyalar:
UPPER()vəLOWER()— böyük/kiçik hərfə çevirmək üçün.CONCAT()— sətirləri birləşdirmək üçün.LENGTH()— sətirin uzunluğunu tapmaq üçün.
Məsələn:
DO $$
DECLARE
full_name TEXT;
BEGIN
full_name := CONCAT('Aleks', ' Min'); -- Sətirləri birləşdiririk
RAISE NOTICE 'Tam ad: %', UPPER(full_name); -- Adı böyük hərflə çıxarırıq
END;
$$;
BOOLEAN tipi ilə işləmək
BOOLEAN məntiqi dəyərləri saxlamaq üçündür: TRUE, FALSE və NULL. Bu tip xüsusilə şərtləri yoxlamaq və datanı filtrləmək üçün faydalıdır.
Nümunə: tələbənin aktivliyini yoxlamaq
Tutaq ki, səndə students cədvəli var və is_active sütunu göstərir ki, tələbə aktivdir ya yox.
DO $$
DECLARE
is_active BOOLEAN; -- Aktivlik dəyərini saxlamaq üçün dəyişən
BEGIN
SELECT is_active INTO is_active FROM students WHERE id = 1; -- Dəyəri cədvəldən alırıq
IF is_active THEN
RAISE NOTICE 'Tələbə aktivdir!';
ELSE
RAISE NOTICE 'Tələbə AKTİV DEYİL.';
END IF;
END;
$$;
BOOLEAN ilə işləyərkən vacib məqamlar:
- Məntiqi dəyərləri birbaşa
IFvəWHILEşərtlərində istifadə edə bilərsən. NULLməntiqdə "müəyyən olunmamış" sayılır, ona görə yoxlamalarda bunu nəzərə al.
RECORD tipi ilə işləmək
RECORD — əvvəlcədən strukturu bəlli olmayan data sətrini saxlamaq üçün güclü tipdir. Xüsusilə SQL sorğularının nəticəsində bir neçə sütun gələndə çox faydalıdır.
Nümunə: cədvəldəki bütün qeydləri gəzmək
Aşağıdakı nümunədə biz students cədvəlindəki bütün qeydləri gəzirik və hər tələbənin adını və ID-sini çıxarırıq.
DO $$
DECLARE
student RECORD; -- Data sətrini saxlamaq üçün dinamik tip
BEGIN
FOR student IN SELECT id, name FROM students LOOP
RAISE NOTICE 'ID: %, Ad: %', student.id, student.name; -- Sətrin sütunlarına müraciət edirik
END LOOP;
END;
$$;
RECORD ilə işləyərkən vacib məqamlar:
RECORDtipli dəyişənlər yalnız dövrədə və yaSELECT INTOilə doldurulur.- Sütunlara
record.column_nameilə müraciət edə bilərsən.
Cədvəllərlə işləmək üçün ROWTYPE data tipləri
Əgər cədvəldəki bir sətri tam saxlamaq və tipin dəqiq olmasını istəyirsənsə, ROWTYPE istifadə edə bilərsən. Bu tip avtomatik olaraq cədvəlin sətrinin strukturunu götürür.
Nümunə: ROWTYPE ilə işləmək
DO $$
DECLARE
student students%ROWTYPE; -- students cədvəlinin sətri strukturunda dəyişən
BEGIN
SELECT * INTO student FROM students WHERE id = 1; -- Sətrin datalarını dəyişənə yükləyirik
RAISE NOTICE 'Tələbənin adı: %, Kurs: %', student.name, student.course;
END;
$$;
RECORD və ROWTYPE arasındakı fərqlər
| Xüsusiyyət | RECORD | ROWTYPE |
|---|---|---|
| Sütunların strukturu | Əvvəlcədən bəlli deyil | Cədvəl və ya sorğudan asılıdır |
| İstifadə | İstənilən nəticə üçün çevik | Struktur sərt bağlıdır |
Praktik nümunə
Gəlin bir funksiya yazaq ki, aktiv tələbələrin sayını və adlarını qaytarsın.
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;
Funksiyanı çağırmaq:
SELECT * FROM active_students_report();
Data tipləri ilə işləyərkən səhvlər
Bəzən data ilə işləyəndə səhvlər olur. Budur ən çox rast gəlinən hallar:
- Tip səhvi: məsələn,
INTEGERtipli dəyişənə sətir yazmaq (my_var := 'abc';). TRUEvə yaFALSEgözlənilən yerdəNULListifadə etmək.RECORDtipini düzgün başlatmadan istifadə etmək.
Səhvlərdən necə qaçmaq olar:
- Dəyişənlərin tipini həmişə açıq göstər.
- Cədvəldəki sütunların data tiplərini yazmazdan əvvəl yoxla.
RAISE NOTICEkimi debug komandalarından istifadə et.
Artıq sən INTEGER, TEXT, BOOLEAN və RECORD data tipləri ilə PL/pgSQL-də necə işləməyi bilirsən. Bu biliklərlə PostgreSQL prosedur proqramlaşdırmasında daha mürəkkəb və güclü proqramlar yaza biləcəksən.
GO TO FULL VERSION