CodeGym /Kurslar /SQL SELF /Dövrələrin dayandırılması və davam etdirilməsi: EXIT, CON...

Dövrələrin dayandırılması və davam etdirilməsi: EXIT, CONTINUE

SQL SELF
Səviyyə , Dərs
Mövcuddur

Bəzən dövrədə hər şey qaydasında gedir — ta ki, hansısa səbəbə görə əvvəlcə dayandırmaq lazım olana qədər. Xoşbəxtlikdən, PL/pgSQL bizə bu prosesi idarə etmək üçün rahat alətlər verir.

Dövrəni EXIT ilə dayandırmaq

Bəzən dövrənin icrasını sonuna çatmadan dayandırmaq lazımdır. Məsələn, lazım olan dəyəri tapanda, səhv aşkar edəndə və ya hansısa şərtə görə iterasiyaları bitirəndə. Belə hallarda EXIT istifadə edirik.

EXIT — dövrəyə "Bəsdi, işini gördün, indi dayanmaq vaxtıdır" deməyin yoludur.

EXIT sintaksisi super sadədir:

EXIT WHEN şərt;

Burada əsas məqam WHEN sözüdür, hansı şərtdə dövrənin dayandırılacağını göstərir. Əgər şərt yazılmasa, EXIT sadəcə dərhal cari dövrəni dayandırır.

Nümunə: verilmiş dəyər tapılanda dövrəni bitirmək

Tutaq ki, bizdə tələbələrin nömrələri olan bir sütun var və konkret ID-li tələbəni tapmaq istəyirik. Tələbə tapılan kimi dövrəni dayandırmaq lazımdır.

DO $$
DECLARE
    student_id INT;
BEGIN
    FOR student_id IN 1..100 LOOP
        RAISE NOTICE 'Tələbə ID yoxlanılır: %', student_id;

        -- Lazım olan tələbə tapılıbsa, dövrəni bitiririk
        IF student_id = 42 THEN
            RAISE NOTICE 'ID-si 42 olan tələbə tapıldı!';
            EXIT;
        END IF;
    END LOOP;
END $$;

Bu nümunədə dövrə 1-dən 100-ə qədər olan ədədləri yoxlayır, hər "tələbəni" yoxlayır. ID 42 tapılan kimi, dövrə mesaj çıxarır və icranı dayandırır.

CONTINUE ilə iterasiyanı ötürmək

Bəzən dövrənin içində müəyyən iterasiyaları ötürmək, amma növbəti iterasiyaya davam etmək lazımdır. Bu xüsusilə "lazımsız" məlumatları görməməzlikdən gəlmək və ya xüsusi şərtlər üçün addımları ötürmək istəyəndə faydalıdır.

CONTINUE deyir: "Ok, bu şərt bizə uyğun deyil, sadəcə növbəti iterasiyaya keçirik".

CONTINUE EXIT kimi işləyir, amma dövrəni dayandırmaq əvəzinə cari iterasiyanı ötürür:

CONTINUE WHEN şərt;

Əgər şərt ödənirsə, cari iterasiya bitir və icra növbəti iterasiyaya keçir.

Nümunə: cüt ədədləri ötürmək

Bu nümunədə 1-dən 10-a qədər olan ədədləri yoxlayacağıq, amma cüt ədədləri ötürəcəyik və yalnız tək ədədləri çıxaracağıq.

DO $$
DECLARE
    num INT;
BEGIN
    FOR num IN 1..10 LOOP
        -- Cüt ədədləri ötürürük
        IF num % 2 = 0 THEN
            CONTINUE;
        END IF;

        RAISE NOTICE 'Tək ədəd: %', num;
    END LOOP;
END $$;

Burada CONTINUE num % 2 = 0 (yəni ədəd cütdür) olan bütün iterasiyaları ötürür. Nəticədə log-da yalnız tək ədədlər çıxacaq.

EXITCONTINUE bir yerdə istifadə etmək

EXITCONTINUE-nu birlikdə istifadə edərək dövrəyə daha çevik nəzarət edə bilərsən. Məsələn, CONTINUE ilə lazımsız iterasiyaları ötürə, amma vacib bir şey tapanda bütün dövrəni EXIT ilə dayandıra bilərsən.

Burada bir nümunə var: 3-ə bölünən bütün ədədləri ötürürük, amma 15-ə çatanda dövrəni dayandırırıq.

DO $$
DECLARE
    num INT;
BEGIN
    FOR num IN 1..20 LOOP
        -- 3-ə bölünən ədədləri ötürürük
        IF num % 3 = 0 THEN
            CONTINUE;
        END IF;

        -- Ədəd 15-ə bərabərdirsə, dövrəni dayandırırıq
        IF num = 15 THEN
            RAISE NOTICE 'Dayandırılır: %', num;
            EXIT;
        END IF;

        RAISE NOTICE 'Cari ədəd: %', num;
    END LOOP;
END $$;

Burada dövrə belə işləyir:

  • 3-ə bölünən ədədlər ötürülür (CONTINUE).
  • Ədəd 15-ə bərabərdirsə, dövrə dayandırılır (EXIT).
  • Qalan bütün ədədlər çıxarılır.

Daha real nümunə: səhv məlumatları ötürmək və kritik səhvdə dayandırmaq

İndi isə daha real bir tapşırıq təsəvvür edək. Tələbələrin siyahısını işləmək istəyirik, onların məlumatlarını yoxlayırıq. Səhv olan qeydləri ötürəcəyik, "kritik səhv" olanda isə icranı dayandıracağıq.

DO $$
DECLARE
    student RECORD;
BEGIN
    FOR student IN
        SELECT * FROM students
    LOOP
        -- Səhv məlumatı olan qeydləri ötürürük
        IF student.name IS NULL THEN
            RAISE NOTICE 'ID-si % olan tələbə ötürülür: Ad yoxdur', student.id;
            CONTINUE;
        END IF;

        -- Kritik səhv olanda dövrəni dayandırırıq
        IF student.status = 'ERROR' THEN
            RAISE EXCEPTION 'Tələbə ID-si % üçün kritik səhv', student.id;
            EXIT; -- Bu sətr əslində artıqdır, çünki RAISE EXCEPTION icranı dayandırır.
        END IF;

        -- Qeydi işləyirik
        RAISE NOTICE 'Tələbə işlənir: %', student.name;
    END LOOP;
END $$;

Bu nümunədə CONTINUE adı olmayan tələbələri ötürməyə kömək edir, EXIT isə (RAISE EXCEPTION ilə birlikdə) ciddi səhv tapılanda dövrəni dayandırır.

Praktik məsləhətlər və tipik səhvlər

Şərtlərin məntiqini unutma. EXIT WHEN və ya CONTINUE WHEN içində şərtləri səhv yazsan, gözlənilməz nəticələr ala bilərsən. Məsələn, dövrə vaxtından əvvəl dayana və ya vacib məlumatları ötürə bilər.

CONTINUE-dan həddindən artıq istifadə. Əgər kodun CONTINUE ilə doludursa, yəqin ki, dövrənin məntiqini bir az sadələşdirmək lazımdır.

EXITRETURN-u qarışdırma. EXIT yalnız cari dövrəni dayandırır, RETURN isə funksiyanın icrasını tam bitirir.

Sonsuz dövrələrə diqqət et. Əgər LOOP dövrəsindən istifadə edirsənsə və bitmə şərtini unutmusansa, EXIT olmadan dövrən sonsuz işləyə bilər.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION