İndi biz sanki gizli agentik — funksiyalarımız və prosedurlarımız missiyaları yerinə yetirir: dataları emal edir, hesablamalar aparır və ya sadəcə bazanın içində bir az sehr edir. Bəs nəsə düz getməsə, necə bilək? "Data üçün massaj vannası" hansı mərhələdə sıradan çıxıb, necə anlayaq? Burada köməyə loglama və error handling gəlir.
Yadındadırsa, artıq başlamışdıq baxmağa ki, PostgreSQL və PL/pgSQL-də necə "ünsiyyət qurmaq" və log aparmaq olar:
RAISE NOTICE: rahat, dost ton — "Ay, burda hər şey qaydasındadır, amma bəlkə baxmaq istərsən".RAISE WARNING: bir az yüksək ton — "Aha, burda nəsə qəribədir, bəlkə baxasan".RAISE EXCEPTION: panik siqnalı — "STOP! Alqoritm bəlada! İcranı dayandırdıq ki, hər şey dağılmasın".
Bunların hər birinin öz məqsədi var və düzgün seçmək vacibdir, hansını istifadə edəcəksən.
Mesajlar kodda belə görünür:
DO $$
BEGIN
-- NOTICE səviyyəsi (hər şey normaldır, sadəcə bildiriş)
RAISE NOTICE 'Sadəcə bildiriş: dataların emalı başladı';
-- WARNING səviyyəsi (nəsə şübhəli)
RAISE WARNING 'Xəbərdarlıq: sütundakı data formatı düzgün olmaya bilər';
-- EXCEPTION səviyyəsi (kritik xəta)
RAISE EXCEPTION 'Xəta: daxil olan dəyər düzgün deyil!';
END $$;
Nə vaxt istifadə etməli:
RAISE NOTICE— debug və rahat info çıxışı üçün.RAISE WARNING— potensial səhv datalar barədə xəbərdarlıq üçün.RAISE EXCEPTION— kritik xətalar baş verəndə, funksiyanın icrası dayandırılmalıdır.
RAISE EXCEPTION ilə error handling
RAISE EXCEPTION — sənin stop-kranın. Nəsə düz getmirsə, funksiyanın icrasını dayandırıb, xəta barədə xəbər verə bilərsən.
Xatırladaq, əsas istifadə belədir:
RAISE EXCEPTION 'Sənin xəta mesajın';
Amma mesajları daha informativ etmək üçün dəyişənlərdən istifadə edə bilərsən:
DECLARE
input_value INTEGER;
BEGIN
input_value := NULL;
IF input_value IS NULL THEN
RAISE EXCEPTION 'Xəta: daxil olan dəyər NULL-dur. INTEGER dəyəri gözlənilirdi';
END IF;
END;
Mesajların formatlanması
Dəyişənləri birbaşa mesajın içinə əlavə edə bilərsən:
DECLARE
var1 TEXT := 'Data';
var2 INTEGER := 42;
BEGIN
RAISE EXCEPTION 'Emal zamanı xəta % ID % ilə', var1, var2;
END;
Çıxış: Emal zamanı xəta Data ID 42 ilə.
Nümunə: datanın validasiyası
Təsəvvür elə, səndə bir prosedur var, insanın yaşını qəbul edir. Əgər yaş mənfi olarsa, məntiqlə xəta atmaq lazımdır:
CREATE OR REPLACE FUNCTION validate_age(age INTEGER)
RETURNS VOID AS $$
BEGIN
IF age < 0 THEN
RAISE EXCEPTION 'Yaş mənfi ola bilməz: %', age;
END IF;
END;
$$ LANGUAGE plpgsql;
-- Funksiyanın çağırılması
SELECT validate_age(-5); -- Xəta atacaq
RAISE NOTICE ilə məlumatlandırma
Əgər RAISE EXCEPTION — siqnalizasiyadırsa, RAISE NOTICE — dostcasına çiyninə toxunmaqdır. Bu səviyyə ilə funksiyanın içində nə baş verdiyini anlamaq üçün şərhlər əlavə edə bilərsən.
RAISE NOTICE nə vaxt istifadə etməli:
- Debug üçün info çıxışı (məsələn, dəyişənlərin cari vəziyyəti).
- İcra mərhələsinin başlanğıcı və ya nəticəsi barədə mesaj.
Nümunə: info mesajları
CREATE OR REPLACE FUNCTION calculate_discount(price NUMERIC, discount_rate NUMERIC)
RETURNS NUMERIC AS $$
DECLARE
final_price NUMERIC;
BEGIN
RAISE NOTICE 'Endirimdən əvvəl qiymət: %', price;
RAISE NOTICE 'Endirim faizi: %', discount_rate;
final_price := price - (price * discount_rate);
RAISE NOTICE 'Son qiymət: %', final_price;
RETURN final_price;
END;
$$ LANGUAGE plpgsql;
-- Funksiyanın çağırılması
SELECT calculate_discount(100, 0.2);
-- Çıxış:
-- NOTICE: Endirimdən əvvəl qiymət: 100
-- NOTICE: Endirim faizi: 0.2
-- NOTICE: Son qiymət: 80
Praktik tətbiq: planlaşdırma və loglama
Tutaq ki, səndə mürəkkəb data emalı proseduru var və bilmək istəyirsən, indi hansı mərhələdəsən:
CREATE OR REPLACE FUNCTION process_data_step_by_step()
RETURNS VOID AS $$
BEGIN
RAISE NOTICE 'Addım 1: Datanın hazırlanması';
-- Birinci mərhələ üçün sənin məntiqin
RAISE NOTICE 'Addım 2: Datanın validasiyası';
-- İkinci mərhələ üçün sənin məntiqin
RAISE NOTICE 'Addım 3: Datanın saxlanması';
-- Üçüncü mərhələ üçün sənin məntiqin
END;
$$ LANGUAGE plpgsql;
-- Funksiyanın çağırılması
SELECT process_data_step_by_step();
-- Loglarda mərhələ-mərhələ icra görünəcək
Başqa bir nümunə də verək. Təsəvvür elə bir mağaza var, endirim yalnız müəyyən məbləğdən yuxarı sifarişlərə tətbiq olunur:
CREATE OR REPLACE FUNCTION apply_discount(order_amount NUMERIC)
RETURNS NUMERIC AS $$
BEGIN
IF order_amount < 50 THEN
RAISE EXCEPTION 'Xəta: sifariş məbləği ən azı 50 olmalıdır, cari məbləğ: %', order_amount;
END IF;
RETURN order_amount * 0.9; -- 10% endirim tətbiq olunur
END;
$$ LANGUAGE plpgsql;
-- Funksiyanın çağırılması
SELECT apply_discount(30); -- Xəta: sifariş məbləği ən azı 50 olmalıdır
Tipik səhvlər
Səhv 1: parametrlərsiz mesajların loglanması.
Böyük prosedurlarda informativ olmur:
RAISE NOTICE 'Xəta baş verdi'; -- Niyə? Harada? Necə?
Tövsiyə: həmişə kontekst əlavə et:
RAISE NOTICE 'process_data() funksiyasında xəta: daxil olan dəyər: %', input_value;
Səhv 2: RAISE EXCEPTION istifadə etmək, halbuki RAISE WARNING kifayətdir.
Əgər hər şeyə exception atsan, kod hər xırda şeyə görə dayanacaq və data emalı çətinləşəcək.
Məsləhət: log səviyyələrini şüurlu seç. Debug üçün NOTICE, kritik hallar üçün — EXCEPTION.
Səhv 3: ümumiyyətlə loglama olmaması.
Bu, qaranlıq otaqda açar axtarmaq kimidir. Logsuz mürəkkəb prosesləri debug etmək demək olar ki, mümkün deyil.
Məsləhət: xüsusilə böyük və mürəkkəb funksiyalarda əsas mərhələlərdə RAISE NOTICE əlavə et.
GO TO FULL VERSION