Funksiyalar, protseduralar, triggerlar
259 daq
SQL faqat so‘rov emas — baza ichida dastur ham yozsa bo‘ladi. Funksiyalar, protseduralar va triggerlar mantiqni bazaning o‘ziga joylaydi. Bu yerda PostgreSQL va MySQL eng ko‘p farq qiladi — kursni almashtirib, ikkalasini ham ko‘ring.
Funksiya
Qiymat qaytaradi va so‘rov ichida ishlatiladi.
CREATE FUNCTION mark(score int) RETURNS int
LANGUAGE sql IMMUTABLE AS $$
SELECT CASE WHEN score >= 86 THEN 5 WHEN score >= 71 THEN 4 WHEN score >= 56 THEN 3 ELSE 2 END
$$;
SELECT student_id, score, mark(score) FROM grades;$$ … $$ — funksiya tanasi (ichida qo‘shtirnoqlarni ikkilash shart emas). Murakkab mantiq uchun LANGUAGE plpgsql ishlatiladi: o‘zgaruvchilar, IF, sikllar.
Protsedura
Qiymat qaytarishi shart emas, bir nechta amalni bajaradi va CALL bilan chaqiriladi.
CREATE PROCEDURE raise_salary(dept int, pct numeric)
LANGUAGE plpgsql AS $$
BEGIN
UPDATE employees SET salary = salary * (1 + pct / 100) WHERE department_id = dept;
END $$;
CALL raise_salary(1, 10);Trigger
Jadvalda biror voqea (INSERT, UPDATE, DELETE) bo‘lganda o‘zi ishga tushadi. Misol: dori sotilganda ombordagi qoldiqni kamaytirish.
CREATE FUNCTION decrease_stock() RETURNS trigger
LANGUAGE plpgsql AS $$
BEGIN
UPDATE dori SET qoldiq = qoldiq - NEW.miqdor WHERE dori_id = NEW.dori_id;
RETURN NEW;
END $$;
CREATE TRIGGER sotuv_after_insert
AFTER INSERT ON sotuv
FOR EACH ROW EXECUTE FUNCTION decrease_stock();PostgreSQL’da trigger ikki qismdan iborat: avval funksiya, keyin uni chaqiradigan trigger.
NEW — qo‘shilayotgan (yoki yangilangan) qator, OLD — o‘chirilayotgan (yoki eski) qator.
Qachon ishlatish kerak?
Foydali: bazaning yaxlitligini saqlash (qoldiq hech qachon manfiy bo‘lmasin), o‘zgarishlar tarixini yozish, og‘ir hisobni ma’lumot yonida bajarish.
Ehtiyot bo‘ling: mantiq «ko‘rinmas» bo‘lib qoladi — dasturchi INSERT yozadi, lekin trigger yana nimalar qilayotganini bilmaydi. Triggerlarni hujjatlashtiring va kam ishlating.
Mashq
Erkin rejimda tayyor dorixona bazasini yuklang, dori jadvaliga qoldiq int DEFAULT 100 ustunini qo‘shing (ALTER TABLE), yuqoridagi triggerni yarating va sotuv qo‘shib ko‘ring — qoldiq kamayishi kerak.
Esda qoldiring
- Funksiya qiymat qaytaradi, protsedura amal bajaradi (
CALL), trigger voqeaga javob beradi. - PostgreSQL:
$$ … $$vaplpgsql; MySQL:DELIMITERvaBEGIN … END. - Trigger kuchli, lekin ko‘rinmas — ehtiyotkorlik bilan.