CodeGym /Kurslar /SQL SELF /PL/pgSQL-də funksiyalardan dəyərləri necə qaytarmaq olar

PL/pgSQL-də funksiyalardan dəyərləri necə qaytarmaq olar

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

PostgreSQL-də funksiya yazanda ilk suallardan biri — nəticəni necə qaytarmaq lazımdır. Bəzən sadəcə bir ədəd qaytarmaq lazımdır. Bəzən isə bütöv bir cədvəl. Hətta bəzən bir neçə dataset də qaytarmaq lazım olur. Bu bölmədə bütün əsas variantlara baxacağıq: ən sadə RETURN-dan tutmuş RETURN QUERY, RETURNS TABLESETOF-a qədər.

Bir nəticə: RETURN

Əgər funksiyan bircə dəyər qaytarmalıdırsa — məsələn, cəmi və ya sətrlərin sayını — adi RETURN istifadə et.

CREATE FUNCTION count_students() RETURNS INT AS $$
DECLARE
    total INT;
BEGIN
    SELECT COUNT(*) INTO total FROM students;
    RETURN total;
END;
$$ LANGUAGE plpgsql;

PL/pgSQL-də funksiya yaradanda, mütləq göstərməlisən ki, o nə qaytarır. Bu RETURNS açar sözü ilə bağlıdır, hansı ki, funksiyanın qaytardığı nəticənin "formatını" müəyyən edir. Yəni, bir ədəd, mətn və ya cədvəl qaytarmaq istəyirsənsə — bunların hamısını RETURNS sətrində yazmalısan.

Sadə nümunə:

CREATE FUNCTION add_numbers(a INT, b INT) RETURNS INT AS $$
BEGIN
    RETURN a + b;
END;
$$ LANGUAGE plpgsql;

Burada RETURNS INT açar sözü göstərir ki, funksiya ədəd qaytarır.

Bir dəyərin qaytarılması

Gəlin ən sadəsindən başlayaq — bir dəyər qaytaran funksiya. Məsələn, students cədvəlində tələbələrin sayını hesablayan funksiya:

CREATE FUNCTION count_students() RETURNS INT AS $$
DECLARE
    total INT;
BEGIN
    SELECT COUNT(*) INTO total FROM students; -- Sorğunun nəticəsini total dəyişənində saxlayırıq
    RETURN total; -- Nəticəni qaytarırıq
END;
$$ LANGUAGE plpgsql;

İndi bu funksiyanı çağırmaq olar:

SELECT count_students(); -- Tələbələrin sayını qaytaracaq

RETURNS TABLE ilə bir neçə dəyərin qaytarılması

Bəzən bir dəyər yox, bütöv bir yazılar toplusu qaytarmaq lazım olur. Məsələn, bütün tələbələrin ad və id-lərinin siyahısı. Bunun üçün RETURNS TABLE konstruksiyasından istifadə olunur.

CREATE FUNCTION get_students() RETURNS TABLE(id INT, name TEXT) AS $$
BEGIN
    RETURN QUERY SELECT id, name FROM students; -- Sorğunun nəticəsini cədvəl kimi qaytarırıq
END;
$$ LANGUAGE plpgsql;

İndi bu funksiyanı çağırmaq olar:

SELECT * FROM get_students(); -- Bütün tələbələrlə cədvəl qaytaracaq

RETURNS TABLE açar sözlərinə fikir ver. Onlar göstərir ki, funksiya müəyyən olunmuş sütunlarla (bu halda idname) cədvəl qaytarır.

RETURN QUERY istifadəsi

Yuxarıdakı nümunəmiz artıq xoşuna gəlmiş olmalıdır. Amma bir detal da var: RETURN QUERY — PL/pgSQL-də bir növ sehrli çubuqdur, hansı ki, sorğudan birbaşa məlumat qaytarmağa imkan verir. Onun köməyi ilə bütöv sorğunun nəticəsini və ya onun bir hissəsini qaytara bilərsən.

Tutaq ki, bizə yalnız aktiv oxuyan tələbələri qaytarmaq lazımdır (bazada onların statusu active = TRUE kimi qeyd olunub):

CREATE FUNCTION get_active_students() RETURNS TABLE(id INT, name TEXT) AS $$
BEGIN
    RETURN QUERY
    SELECT id, name
    FROM students
    WHERE active = TRUE; -- Yalnız aktiv tələbələri qaytarırıq
END;
$$ LANGUAGE plpgsql;

İndi funksiyanı çağırıb aktiv tələbələr barədə məlumat ala bilərsən:

SELECT * FROM get_active_students();

RETURNS TABLE olmadan bir neçə sətrin qaytarılması

Bəzi hallarda RETURNS TABLE istifadə etmədən də məlumat sətrləri qaytarmaq istəyə bilərsən. Bunun üçün SETOF tipindən istifadə etmək olar. Bu, eyni struktura malik məlumat sətrlərini qaytarmağa imkan verir. Məsələn:

CREATE FUNCTION get_student_names() RETURNS SETOF TEXT AS $$
BEGIN
    RETURN QUERY
    SELECT name
    FROM students;
END;
$$ LANGUAGE plpgsql;

Bu funksiya yalnız tələbələrin adlarının siyahısını qaytarır:

SELECT * FROM get_student_names();

Giriş məlumatlarından asılı olaraq dəyərlərin qaytarılması

Funksiyalar həmişə statik nəticə qaytarmır. Onlar parametrlərdən istifadə edib nəticəni dinamik dəyişə bilərlər.

Budur, tələbənin id-si üzrə məlumat qaytaran nümunə:

CREATE FUNCTION get_student_by_id(student_id INT) RETURNS TABLE(id INT, name TEXT) AS $$
BEGIN
    RETURN QUERY
    SELECT id, name
    FROM students
    WHERE id = student_id; -- student_id parametrindən istifadə edirik
END;
$$ LANGUAGE plpgsql;

İndi konkret tələbə barədə məlumatı soruşa bilərsən:

SELECT * FROM get_student_by_id(3); -- ID = 3 olan tələbənin məlumatını qaytaracaq

Mürəkkəb məlumatların qaytarılması (bir neçə dataset)

Bəzən məlumatlar o qədər mürəkkəb olur ki, onları bir neçə dataset kimi qaytarmaq lazımdır. Bunun üçün kursordan istifadə edə bilərsən. Məsələn, funksiyadan iki dataset — aktiv tələbələrin və qeyri-aktiv tələbələrin siyahısını vermək istəyirsən.

CREATE FUNCTION get_students_status() RETURNS SETOF RECORD AS $$
BEGIN
    RETURN QUERY
    SELECT id, name, 'aktiv' AS status
    FROM students
    WHERE active = TRUE;

    RETURN QUERY
    SELECT id, name, 'qeyri-aktiv' AS status
    FROM students
    WHERE active = FALSE;
END;
$$ LANGUAGE plpgsql;

İndi hər iki dataset-i ala bilərsən:

SELECT * FROM get_students_status();

RETURNS ilə işləyərkən tipik səhvlər

Qaytarma tipini göstərməmək: Əgər funksiya nə qaytardığını göstərməsən, PostgreSQL səhv verəcək. Məsələn:

CREATE FUNCTION no_return_type() AS $$ -- Səhv, RETURNS göstərilməyib
BEGIN
    RETURN 1;
END;
$$ LANGUAGE plpgsql;

Data tipləri uyğun gəlmir: Qaytardığın dəyərlərin elan olunmuş tiplərə uyğun olduğuna əmin ol. Məsələn, INT qaytaracağını göstərmisənsə, sətir qaytarmağa çalışma.

RETURN QUERY istifadəsini unutmaq: Əgər mürəkkəb sorğu üçün RETURN QUERY istifadə etməyi unutsan, funksiya heç nə qaytarmayacaq.

Bir neçə dəyərin səhv qaytarılması: Əgər data sətri qaytarırsan, amma SETOF və ya TABLE istifadə etməyi unutmusan, PostgreSQL səhv verəcək.

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