CodeGym /Kurslar /SQL SELF /Funksiya və prosedurların fərqləri

Funksiya və prosedurların fərqləri

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

Bir çox proqramlaşdırma dillərində funksiyalar və prosedurlar arasında demək olar ki, fərq yoxdur. SQL-də isə fərq var. PostgreSQL-də funksiyalar və prosedurlar — sadəcə kodu işə salmağın iki fərqli yolu deyil. Bunlar fərqli düşüncə tərzləridir.

SQL-də funksiya bazadakı məlumatları dəyişə bilmir. O, yalnız ötürülən məlumatlarla işləməli və onların əsasında nəticə qaytarmalıdır. Funksiya əsasən SELECT sorğularında istifadə üçün yaradılır.

SQL-də prosedur isə bazanı dəyişmək üçün yaradılıb. Ona görə də o, tranzaksiyalarla işləyə bilər (funksiyalardan fərqli olaraq), bazaya nəsə yaza bilər. Amma SELECT sorğularında istifadə oluna bilmir.

Qısa müqayisə belədir:

Xüsusiyyət Funksiya (FUNCTION) Prosedur (PROCEDURE)
Məlumat qaytarır ✅ Bəli (RETURNS ...) ❌ Xeyr (yalnız əməliyyatlar yerinə yetirə bilər)
Necə çağırılır SELECT, PERFORM CALL
Sorğularda istifadə oluna bilər ✅ Bəli ❌ Xeyr
DO içində ola bilər ✅ Bəli ❌ Xeyr
COMMIT, ROLLBACK dəstəkləyir ❌ Xeyr ✅ Bəli
PostgreSQL-ə əlavə olunub Əvvəldən 11 versiyadan

SQL-də fərqlər

Adi SQL-də funksiya ifadəyə bənzəyir: o, hesablayır və qaytarır dəyəri. Prosedur isə instruksiyadır: o, nəsə edir, amma ifadələrdə iştirak etmir.

SQL-də funksiya

SELECT calculate_discount(200);
  • WHERE, ORDER BY, INSERT, UPDATE və s. içində istifadə oluna bilər
  • Təmiz olmalıdır: bazanın vəziyyətini dəyişməməlidir (əgər IMMUTABLE/STABLE-dursa)

SQL-də prosedur

CALL process_order(123);
  • Nəticə qaytarmır.
  • COMMIT, ROLLBACK edə bilər, RAISE çağırmaq, dövrələr işlətmək olar.

PL/pgSQL-də fərqlər

PostgreSQL-də funksiyaları hesablamalar qrupu kimi təsəvvür etmək olar. Çox çevikdir: parametrlər ötürmək, şərt operatorları, dövrələr, kursors, subquery-lər, sətirlər, skalyarlar, cədvəllər qaytarmaq olar.

PL/pgSQL-də funksiyalar

CREATE FUNCTION square(x INT) RETURNS INT AS $$
BEGIN
    RETURN x * x;
END;
$$ LANGUAGE plpgsql;

Xüsusiyyətlər:

  • RETURNS mütləqdir
  • DECLARE, BEGIN, END, LOOP, IF, CASE istifadə oluna bilər
  • COMMIT/ROLLBACK etmək olmaz
  • SELECT, UPDATE, CHECK, WHERE, RETURNING içində çağırmaq olar

Çağırış:

SELECT square(5);  -- 25 qaytaracaq

PL/pgSQL-də prosedurlar

Prosedurlar — əməliyyatların idarə olunması mexanizmidir. Onlar idealdır, əgər sənə lazımdırsa:

  • çox addım olan məntiqi yerinə yetirmək;
  • böyük həcmdə məlumatı yeniləmək və əlavə etmək;
  • tranzaksiya idarəetməsi istifadə etmək: COMMIT, ROLLBACK, SAVEPOINT.
CREATE PROCEDURE log_event(msg TEXT) AS $$
BEGIN
    INSERT INTO logs(message) VALUES (msg);
    COMMIT;
END;
$$ LANGUAGE plpgsql;

Xüsusiyyətlər:

  • RETURNS yoxdur
  • Yalnız CALL ilə çağırılır
  • COMMIT, ROLLBACK, SAVEPOINT istifadə etmək olar
  • batch processing, migration, ETL üçün uyğundur

Çağırış:

CALL log_event('Emal bitdi');

Niyə funksiyalar və prosedurlar ayrıdır

Çünki onların SQL-də məqsədləri fərqlidir:

Funksiyalar Prosedurlar
"Nəsə hesabla və qaytar" "Nəsə et və nəticə qaytarma"
SQL-dən çağırış Komanda kimi çağırış
Tranzaksiyaları idarə edə bilmir Tranzaksiyaları idarə edə bilir
SELECT, JOIN, WHERE içində istifadə olunur CALL, skriptlərdə istifadə olunur

Prosedurun əsas üstünlüyü — COMMIT

Prosedurlar öz içində tranzaksiyaları idarə edə bilir. Yəni birbaşa prosedurun içində belə etmək olar:

BEGIN;
-- məntiq
SAVEPOINT point1;
-- yeniləmə cəhdi
ROLLBACK TO point1;
COMMIT;

Amma funksiyada COMMITROLLBACK qadağandır. Əgər cəhd etsən — belə bir mesaj alacaqsan: ERROR: invalid transaction termination in function

Bu o deməkdir ki, funksiya deterministik və təhlükəsiz olmalıdır, prosedur isə "çirkli iş" görə bilər — təmizləmək, loglamaq, əlavə etmək.

Müqayisəli cədvəl

Xüsusiyyət FUNCTION PROCEDURE
Dəyər qaytarır RETURNS
SELECT-də istifadə olunur
Çağırış SELECT, PERFORM, DO Yalnız CALL
Trigger-də istifadə oluna bilər ❌ (yalnız funksiyalar)
Daxildə tranzaksiya (COMMIT) ❌ Qadağandır ✅ İcazə verilir
OUT-parametrlərdən istifadə RETURNS TABLE, RECORD ilə Birbaşa OUT-parametrlərlə
Hesablamalar üçün uyğundur 🚫 nəzərdə tutulmayıb
ETL, yükləmə üçün uyğundur 🚫 məhdud ✅ ideal
Kursorlardan istifadə etmək olar ✅ Bəli ✅ Bəli

Harada nə istifadə etməli?

Funksiya istifadə et, əgər:

  • qaytarılan dəyər istəyirsənsə;
  • SELECT-də çağırırsansa, məlumatı filtr edirsənsə;
  • sadə hesablama, yoxlama və ya SQL üçün wrapper lazımdırsa.

Prosedur istifadə et, əgər:

  • çətin əməliyyatlar yerinə yetirmək istəyirsənsə;
  • tranzaksiya idarəetməsi lazımdırsa;
  • batch-ləri işləyirsənsə, məlumat köçürürsənsə, arxivləşdirirsənsə, loglama aparırsansa.
1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
İdarəetmə konstruksiyaları
İdarəetmə konstruksiyaları
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION