028. Funksiyalar va PL/pgSQL
Bu mavzuda SQL va PL/pgSQL funksiyalari, protseduralar bo'yicha 30 ta masala bor. Har bir masala oldida qavs ichida sxema nomi va qiyinlik darajasi ko'rsatilgan. Sxemalar Sxemalar va tayyorlov sahifasida berilgan.
Masalani o'zingiz yechib, natijani Kutilgan natija bilan solishtiring. O'zgartiruvchi masalalarda (INSERT, UPDATE, DELETE, DDL) natija shartda aytilgan tekshiruv so'rovidan olingan. Natija 10 qatordan ko'p bo'lsa, birinchi 10 qator ko'rsatilgan.
1. (dokon, oson) Funksiya: kvadrat(x int) qaytaradi x*x; kvadrat(7) ni chaqiring.
2. (dokon, oson) Funksiya qqs(narx numeric) -> narx*1.12; qqs(1000).
3. (dokon, oson) PL/pgSQL funksiya: salom(ism text) 'Salom,
4. (dokon, oson) Funksiya: mijoz_soni() — mijozlar soni (SQL funksiya).
5. (dokon, o'rta) IF/ELSE: toifa(narx numeric) 'arzon' (<100000), 'qimmat' (>=100000) qaytarsin; toifa(50000), toifa(200000).
6. (dokon, o'rta) Funksiya faktorial(n int) (tsikl bilan, PL/pgSQL); faktorial(6).
7. (dokon, o'rta) RETURNS TABLE: kategoriya_mahsulotlar(k int) — shu kategoriya mahsulotlari (id, nom). kategoriya 1, birinchi 3.
8. (dokon, o'rta) DEFAULT parametr: chegirma(narx numeric, foiz numeric DEFAULT 10) -> narx*(1-foiz/100); chegirma(1000) va chegirma(1000,20).
9. (dokon, o'rta) OUT parametrlar: min_maks(OUT mn numeric, OUT mx numeric) mahsulot narxlari min va maks.
10. (dokon, o'rta) PL/pgSQL: buyurtma_summa(b int) — buyurtma jami summasini SELECT INTO bilan hisoblasin; buyurtma 1.
11. (dokon, qiyin) RAISE EXCEPTION: manfiy narx bilan chaqirilganda xato beradigan tekshiruv funksiyasi 'musbat(x)'; musbat(5) natijasi va tekshiruv uchun EXCEPTION blokli o'ram 'xavfsiz_musbat(-1)' 'xato' qaytarsin.
12. (dokon, qiyin) Qaytaradigan SETOF: RETURN QUERY bilan shahar_mijozlari(sh text); shahar 'Buxoro', soni.
13. (dokon, qiyin) Dinamik SQL: EXECUTE format bilan jadval_soni(t text) — jadvaldagi qatorlar soni; 'mijoz'.
14. (dokon, qiyin) Protsedura: CREATE PROCEDURE narx_oshir(foiz numeric) barcha narxni oshiradi; CALL qiling va yig'indini ko'rsating.
15. (maktab, oson) Funksiya baho_soz(b int): 5 'a''lo', 4 'yaxshi', 3 'qoniqarli', else 'yomon'; baho_soz(4).
16. (maktab, o'rta) Funksiya ortacha(o int): o'quvchining o'rtacha bali; 1-o'quvchi (2 xona).
17. (maktab, o'rta) FOR tsikl bilan qatorlar: RETURNS TABLE yordamida sinf_royxati(s int) o'quvchi ismlari; sinf 1 soni.
18. (maktab, qiyin) Funksiya yosh(t date, d date): to'liq yoshni hisoblasin; yosh(DATE '2008-06-15', DATE '2025-01-01').
19. (maktab, qiyin) Protsedura: oqituvchi_maosh_oshir(foiz) va OUT natija emas: CALL qilib maosh yig'indisi.
20. (bank, oson) Funksiya oylik_tolov(summa numeric, oy int): foizsiz bo'lib to'lashda oylik to'lov (summa/oy). oylik_tolov(1200000, 6).
21. (bank, o'rta) Funksiya balans(h int): hisobdagi tranzaksiyalardan qoldiq (kirim +, boshqasi -). balans(1).
22. (bank, o'rta) Pul o'tkazish PL/pgSQL funksiyasi otkaz(a int, b int, s numeric) — yetarli bo'lmasa xato; 1->2 ga 1000 o'tkazing, ikki balansni ko'rsating.
23. (bank, qiyin) Funksiya qolgan_qarz(summa numeric, oy int, tolangan int): foizsiz qarzning qolgan qismi (summa - summa/oy*tolangan); qolgan_qarz(12000000,12,5).
24. (bank, qiyin) Funksiya xavf(mijoz int) — mijozning kechikkan qarzlari soniga qarab 'yuqori' (>=1) yoki 'past'; mijoz 1..10 dan yuqorilar soni.
25. (kutubxona, oson) Funksiya jarima(kun int): kechikkan kun*500; jarima(7).
26. (kutubxona, o'rta) Funksiya kitob_nusxa(k int): nusxa ni qaytaradi (1-kitob).
27. (kutubxona, o'rta) PL/pgSQL: ijaraga_ber(k, a) — nusxa >0 bo'lsa ijara qo'shib nusxani kamaytirsin; 1-kitobni a'zo 1 ga bering; ijaralar soni va kitob nusxasi.
28. (kutubxona, qiyin) Rekursiv funksiya: fib(n) (n<=2 uchun 1); fib(15).
29. (kutubxona, qiyin) Agregat funksiya: o'rta_geometrik emas, oddiy: SQL funksiya bilan ushlab turish kunlari (qaytarilgan - olingan) hisoblab, 14 kundan ortiq ijaralar soni (funksiyadan foydalaning).
30. (dokon, qiyin) Window ichida funksiya: kategoriya_narx_ortacha(k) funksiyasi va uni o'z kategoriyasidan qimmat mahsulotlar soni uchun ishlating.