CodeGym /Kurslar /SQL SELF /Funksiyaların icrasına nəzarət: PERFORM

Funksiyaların icrasına nəzarət: PERFORM

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

PERFORM PostgreSQL dünyasında belə səssiz, ciddi qəhrəmandır: gəlir, işini görür və heç bir qaytarılan məlumat izi qoymadan yoxa çıxır. Bu əmrdən istifadə edirsən, əgər PL/pgSQL funksiyası daxilində SQL-sorğunu icra etmək istəyirsənsə, amma nəticəni emal etmək və ya saxlamaq lazım deyil. PERFORM-un əsas işi — sorğunu çağırmaqdır ki, nəsə baş versin, məsələn, məlumat dəyişsin və ya başqa bir funksiya çağırılsın, amma nəticə almaq üçün deyil.

PERFORM o hallarda istifadə olunur ki, sorğunun nəticəsi bizə lazım deyil. Adi SELECT-dən fərqli olaraq, hansı ki, nəticə ilə nəsə etməyini gözləyir, PERFORM sadəcə sorğunu işə salır və səssizcə davam edir. Bu xüsusilə rahatdır, əgər funksiyanı yalnız onun təsiri üçün çağırırsansa, qaytardığı nəticəyə görə yox. Məsələn, loga nəsə yazmaq üçün. Belə yanaşma kodu daha sadə və başadüşülən edir: az artıq şey, çox məna.

PERFORM-un istifadə nümunələri

Funksiyaların çağırılması

Gəlin real nümunəyə baxaq. Təsəvvür elə ki, bizdə log_action funksiyası var, hansı ki, istifadəçinin hərəkətləri barədə məlumatı loglara yazır. Bu funksiya heç nə qaytarmır və biz sadəcə onun işləməsini istəyirik. PERFORM ilə belə olur:

CREATE OR REPLACE FUNCTION log_action(user_id INT, action TEXT) RETURNS VOID AS $$
BEGIN
    INSERT INTO logs (user_id, action, log_time)
    VALUES (user_id, action, NOW());
END;
$$ LANGUAGE plpgsql;

-- Sonra bu funksiyanı çağırmaq üçün PERFORM istifadə edirik:
PERFORM log_action(5, 'İstifadəçi daxil oldu');

Burda nə baş verir? PERFORM əmri log_action funksiyasını çağırır, hansı ki, logs cədvəlinə yazı əlavə edir. Yaxşı başa düş ki: funksiyanın qaytardığı nəticə heç kimə maraqlı deyil. Biz onu sırf təsiri üçün çağırırıq, qaytardığı dəyərə görə yox.

Məlumatların yenilənməsi

Bəzən PERFORM faydalıdır, əgər nəticəsi maraqlı olmayan bir sorğunu icra etmək lazımdır. Məsələn, orders cədvəlində sifarişin statusunu yeniləyək.

CREATE OR REPLACE FUNCTION update_order_status(order_id INT, new_status TEXT) RETURNS VOID AS $$
BEGIN
    UPDATE orders
    SET status = new_status
    WHERE id = order_id;
END;
$$ LANGUAGE plpgsql;

-- Bu funksiyanı çağırmaq üçün PERFORM istifadə edirik:
PERFORM update_order_status(101, 'Çatdırıldı');

Burda update_order_status funksiyası 101 identifikatorlu sifarişin statusunu yeniləyir. Funksiya daxilindəki SQL-sorğunun nəticəsi bizi maraqlandırmır, ona görə də PERFORM — ideal seçimdir.

Köməkçi əməliyyatların işə salınması

Bəzən funksiyalarda "köməkçi" məntiq olur, hansı ki, mürəkkəb prosesi tamamlamağa kömək edir. Tutaq ki, cədvəl yeniləndikdən sonra cache-i sıfırlamaq istəyirik:

CREATE OR REPLACE FUNCTION clear_cache() RETURNS VOID AS $$
BEGIN
    DELETE FROM cache_table;
END;
$$ LANGUAGE plpgsql;

-- Başqa funksiyada onu çağırırıq:
CREATE OR REPLACE FUNCTION update_product(product_id INT, new_price NUMERIC) RETURNS VOID AS $$
BEGIN
    UPDATE products
    SET price = new_price
    WHERE id = product_id;

    -- Məlumat dəyişəndən sonra cache-i sıfırlayırıq:
    PERFORM clear_cache();
END;
$$ LANGUAGE plpgsql;

Bax, burda magiya budur: sən ardıcıl əməliyyatlar edə bilərsən, PERFORM ilə nəticəsi lazım olmayan funksiyaları çağırmaqla.

Praktiki tapşırıqlar

Gəlin bir neçə nümunəyə baxaq ki, PERFORM developerin həyatını necə asanlaşdırır.

Nümunə 1: prosedurun mərhələlərinin loglanması

Tutaq ki, bizdə mürəkkəb ödəniş emalı proseduru var və hər mərhələni izləmək, loga yazmaq lazımdır. log_stage funksiyasını müəyyən edirik və sonra PERFORM istifadə edirik:

CREATE OR REPLACE FUNCTION log_stage(stage_name TEXT) RETURNS VOID AS $$
BEGIN
    INSERT INTO process_logs(stage, log_time)
    VALUES (stage_name, NOW());
END;
$$ LANGUAGE plpgsql;

-- Prosedur nümunəsi:
CREATE OR REPLACE FUNCTION process_payment(payment_id INT) RETURNS VOID AS $$
BEGIN
    -- Başlanğıcı loglayırıq
    PERFORM log_stage('Ödəniş emalına başlanıldı');

    -- Birinci mərhələni icra edirik
    UPDATE payments
    SET status = 'Emal olunur'
    WHERE id = payment_id;

    PERFORM log_stage('Ödəniş statusu yeniləndi');

    -- Son mərhələni icra edirik
    UPDATE payments
    SET status = 'Tamamlandı'
    WHERE id = payment_id;

    PERFORM log_stage('Ödəniş tamamlandı');
END;
$$ LANGUAGE plpgsql;

Burda log_stage hər mərhələdə PERFORM ilə çağırılır və icra vəziyyəti loga yazılır. Bu, kodumuzu debug üçün daha rahat edir.

Nümunə 2: bildirişlərin aktivləşdirilməsi

Təsəvvür elə ki, bildiriş sistemi var və hər vacib əməliyyatdan sonra bildiriş göndərmək lazımdır. PERFORM bunu edən funksiyanı çağırmaq üçün istifadə oluna bilər:

CREATE OR REPLACE FUNCTION send_notification(user_id INT, message TEXT) RETURNS VOID AS $$
BEGIN
    INSERT INTO notifications (user_id, message, created_at)
    VALUES (user_id, message, NOW());
END;
$$ LANGUAGE plpgsql;

-- Prosedurda istifadə edirik:
CREATE OR REPLACE FUNCTION complete_task(task_id INT) RETURNS VOID AS $$
DECLARE
    user_id INT;
BEGIN
    -- Tapşırığın müəllifini alırıq
    SELECT assigned_to INTO user_id
    FROM tasks
    WHERE id = task_id;

    -- Tapşırığı tamamlayırıq
    UPDATE tasks
    SET status = 'Tamamlandı'
    WHERE id = task_id;

    -- Bildiriş göndəririk
    PERFORM send_notification(user_id, 'Sənin tapşırığın tamamlandı');
END;
$$ LANGUAGE plpgsql;

Burda PERFORM diqqəti yalnız yan təsirə — bildiriş göndərilməsinə yönəldir, funksiyanın nəticəsini isə heç kim nəzərə almır.

Faydalı məsləhətlər və tipik səhvlər

PERFORM istifadə edəndə bəzi məqamları unutma. Məsələn, PERFORM sorğunun nəticə qaytarıb-qaytarmadığını yoxlamır. Yəni, əgər funksiyanın və ya SQL-sorğunun nəticəsi icra məntiqi üçün vacibdirsə, SELECT INTO istifadə etmək daha yaxşıdır. Nümunəyə baxaq:

-- Potensial səhv
PERFORM some_function_that_must_return_value();

-- Düzgün variant
SELECT some_function_that_must_return_value() INTO some_variable;

Daha bir tipik səhv — PERFORM istifadə etmək orda ki, sorğunun nəticəsini almaq məntiqi baxımından vacibdir, məsələn, məlumatların yoxlanması üçün. Belə hallarda, əlbəttə, nəticəni almaq və yoxlamaq lazımdır.

Real layihələrdə PERFORM komandası funksiyaları və prosedurları daha sadə, oxunaqlı və debug üçün rahat edir. Loglama (RAISE NOTICE) və PostgreSQL-in daxili diaqnostik funksiyaları (current_query()) ilə birlikdə, bu, etibarlı, idarəolunan və başadüşülən sistemlər yaratmaq üçün vacib alətdir.

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