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,UPDATEvə 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,ROLLBACKedə 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:
RETURNSmütləqdirDECLARE,BEGIN,END,LOOP,IF,CASEistifadə oluna bilərCOMMIT/ROLLBACKetmək olmazSELECT,UPDATE,CHECK,WHERE,RETURNINGiç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:
RETURNSyoxdur- Yalnız
CALLilə çağırılır COMMIT,ROLLBACK,SAVEPOINTistifadə 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 COMMIT və ROLLBACK 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.
GO TO FULL VERSION