Təsəvvür elə, bir funksiya yazırsan ki, tələbənin orta balını hesablayır. Bəs nə olacaq, əgər sıfıra bölmək istəsən (məsələn, əgər qiymətlər yoxdursa)? Belə kodu real həyata buraxsan — və gözlənilməz qonaq kimi error dərhal gələcək. PL/pgSQL belə error-ları işləmək üçün güclü alətlər verir, kodunu dayanıqlı, təhlükəsiz və işləmək üçün rahat edir.
PL/pgSQL-də error handling imkan verir:
- Nə baş verdiyini izah edən mesajlar yaratmağa.
- Kritik error olduqda kodun icrasını dayandırmağa.
- Problemləri sonradan analiz üçün log-lamağa.
PL/pgSQL-də əsas mesaj səviyyələri
PL/pgSQL bir neçə mesaj səviyyəsini dəstəkləyir, bu da developer-lərə problemləri effektiv tapıb düzəltməyə kömək edir. Bax bunlardır:
- NOTICE: informasiya mesajı çıxarır. Debug üçün istifadə olunur.
- WARNING: potensial problem barədə xəbərdarlıq, amma proqramın icrasını dayandırmır.
- EXCEPTION: kritik error, proqramın icrasını dayandırır (və idarəni çağıran koda qaytarır).
PL/pgSQL-də mesaj səviyyələri
| Mesaj səviyyəsi | Təsvir |
|---|---|
NOTICE |
İnformasiya və ya debug mesajları. İcraya təsir etmir |
WARNING |
Mümkün problemlər barədə xəbərdarlıq. İpucu kimi işləyir |
EXCEPTION |
Ciddi error, proqramın icrasını dayandırır |
RAISE komandasının sintaksisi
Mesaj yaratmaq və error-ları işləmək üçün RAISE operatorundan istifadə olunur. Onun əsas sintaksisi belədir:
RAISE <mesaj səviyyəsi> 'mesaj mətni' [, dəyişənlər...];
<mesaj səviyyəsi>—NOTICE,WARNING,EXCEPTION.'mesaj mətni'— problemin təsviri.[dəyişənlər...]— mesaja əlavə dəyərlər ötürmək üçün.
Nümunə 1: RAISE NOTICE istifadəsi
Bəzən funksiyanın içində nə baş verdiyini bilmək vacibdir. Məsələn, dövrü debug etmək üçün:
DO $$
BEGIN
FOR i IN 1..5 LOOP
RAISE NOTICE 'Hazırki i dəyəri: %', i;
END LOOP;
END
$$;
Nəticə: Konsolda Hazırki i dəyəri: 1, Hazırki i dəyəri: 2 və s. 5-ə qədər çıxacaq.
Nümunə 2: RAISE EXCEPTION istifadəsi
İndi təsəvvür elə, bir funksiya yazırsan ki, müəyyən şərtlərdə error ilə bitməlidir:
DO $$
BEGIN
IF 1 = 1 THEN
RAISE EXCEPTION 'Nəsə düz getmədi!';
END IF;
END
$$;
Nəticə: icra dayandırılır və error mesajı konsola çıxır.
RAISE-də parametrlərlə işləmək
Parametrlərdən istifadə edərək mesaj mətnini fərdiləşdirə bilərsən. Bunun üçün % placeholder-larından istifadə olunur:
Nümunə 3: RAISE-də dəyişənlərin əlavə olunması
DO $$
DECLARE
student_name TEXT := 'İvan';
average_score NUMERIC := NULL;
BEGIN
IF average_score IS NULL THEN
RAISE EXCEPTION 'Tələbənin % orta balı yoxdur!', student_name;
END IF;
END
$$;
Nəticə: Tələbənin İvan orta balı yoxdur! mesajı çıxır.
Gördüyün kimi, % dəyişən student_name ilə əvəz olunur və mesaj daha mənalı olur.
İstifadəçi error-larının yaradılması
Error-lar həmişə fors-major deyil! Bəzən onları qəsdən yaratmaq lazımdır ki, kodu səhv datalardan qoruya biləsən.
Nümunə 4: giriş dəyərlərinin yoxlanması
Bir funksiya yazaq ki, daxil olan ədədin dəyərini yoxlayır və əgər mənfidirsə, error atır:
CREATE OR REPLACE FUNCTION check_positive(value NUMERIC)
RETURNS TEXT AS $$
BEGIN
IF value < 0 THEN
RAISE EXCEPTION 'Ədəd % mənfidir!', value;
END IF;
RETURN 'Ədəd düzgündür.';
END;
$$ LANGUAGE plpgsql;
İndi funksiyanı test edək:
SELECT check_positive(-5);
Nəticə: Ədəd -5 mənfidir! error mesajı çıxır.
Əgər müsbət dəyər versən:
SELECT check_positive(10);
Nəticə: Ədəd düzgündür.
Kontekstdə error handling
Error yaratmağı bacarırsansa, daha yaxşısı — onları vəziyyətdən asılı olaraq işləməkdir. Bunun üçün BEGIN ... EXCEPTION bloku istifadə olunur.
Error handling strukturu
BEGIN
-- Sənin əsas kodun
EXCEPTION
WHEN XƏTA_TİPİ THEN
-- Error zamanı nə etmək lazımdır
WHEN BAŞQA_XƏTA THEN
-- Başqa error zamanı nə etmək lazımdır
WHEN OTHERS THEN
-- Qalan bütün error-ların işlənməsi
END;
Komponentləri izah edək:
EXCEPTION— error handling blokunun başlanğıcını göstərən açar söz.WHEN— konkret error tipini göstərməyə imkan verir, məsələn,unique_violationvə yadivision_by_zero.OTHERS—WHENbloklarında açıq göstərilməyən bütün error-ları işləmək üçün istifadə olunur.
Nümunə 5: sıfıra bölmənin işlənməsi
Sadə bölmə funksiyası ilə error handling-i göstərək:
CREATE OR REPLACE FUNCTION safe_divide(a NUMERIC, b NUMERIC)
RETURNS NUMERIC AS $$
BEGIN
-- Bölməyə cəhd edirik
RETURN a / b;
EXCEPTION
WHEN division_by_zero THEN
RAISE WARNING 'Sıfıra bölmə cəhdi. NULL qaytarıram.';
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
Funksiyanı yoxlayaq:
SELECT safe_divide(10, 2); -- Gözlənilən nəticə: 5
SELECT safe_divide(10, 0); -- Gözlənilən nəticə: NULL və konsolda xəbərdarlıq
RAISE istifadə edərkən tipik səhvlər
Mesaj səviyyəsinin unudulması. Əgər səviyyəni göstərməyi unutsan, PostgreSQL error verəcək.
Səhv:
RAISE 'Səviyyəsiz mesaj';
Düzgün:
RAISE NOTICE 'NOTICE səviyyəli mesaj';
Yanlış parametrlər. Əgər % istifadə edirsənsə, lazım olan qədər dəyişən ötürdüyünə əmin ol.
Səhv:
RAISE NOTICE 'Parametr ilə nümunə %';
Düzgün:
RAISE NOTICE 'Parametr ilə nümunə %', 'dəyər';
Həddindən artıq istifadə. RAISE EXCEPTION-dan çox istifadə vacib əməliyyatların icrasını dayandıra bilər. Onu ağılla istifadə et.
Faydalı məsləhətlər
WHEN OTHERSblokuna diqqətli ol. Mümkün qədər konkret error-ları göstər, əks halda başqa cür işlənməli olan error-ları da tutmuş olarsan.RAISE-ı debug üçün istifadə et. Heç vaxt error-ları işlənmədən buraxma.- Performansı unutma. Error handling böyük prosedurlarda baha başa gələ bilər.
Əgər hər şeyi düzgün etsən, prosedurların dayanıqlı olacaq və hətta gözlənilməz crash-lara da tab gətirəcək. PM səninlə fəxr edə bilər!
GO TO FULL VERSION