Procedure — ma’lumotlar bazasida saqlanadigan va server ichida bajariladigan nomlangan buyruqlar to‘plami. U SQL statementlar, shartlar, sikllar, transaction boshqaruvi va database’ga xos procedural konstruksiyalarni birlashtirishi mumkin.
Procedure ko‘pincha stored procedure deb ataladi. U applicationdan parameterlar bilan chaqiriladi va bir nechta natija, status yoki cursor qaytarishi mumkin.
Procedure yaratish
Soddalashtirilgan misol:
CREATE PROCEDURE close_order(order_id BIGINT)
BEGIN
UPDATE orders
SET status = 'closed'
WHERE id = order_id;
END;
Application:
CALL close_order(150);
orqali procedure’ni ishga tushiradi.
Aniq syntax database mahsulotiga qarab farq qiladi.
Parameter
Procedure input, output yoki input-output parameterlarga ega bo‘lishi mumkin.
Input parameter
Caller qiymat yuboradi.
Output parameter
Procedure natijani parameter orqali qaytaradi.
Input-output parameter
Boshlang‘ich qiymat olinadi va o‘zgartirilgan qiymat qaytariladi.
Type va null qoidalari procedure signature’ida belgilanadi.
Result set
Procedure query natijasini result set sifatida qaytarishi mumkin.
Masalan:
- order ma’lumoti;
- status tarixi;
- hisoblangan summary.
Bir procedure bir nechta result set qaytarishi mumkin, ammo barcha database driverlari buni bir xil qulaylikda boshqarmaydi.
Function bilan farqi
Database function odatda qiymat qaytaradi va query ichida ishlatilishi mumkin.
Procedure esa command sifatida chaqiriladi va:
- transaction;
- bir nechta statement;
- output parameter;
- result set;
- administrative amal
bajarishi mumkin.
Aniq farq va imkoniyatlar database implementationiga bog‘liq.
Business logic
Procedure database’ga yaqin business qoidalarni markazlashtirishi mumkin.
Masalan:
Bir nechta application bir database’dan foydalansa, procedure umumiy qoidani bir joyda saqlaydi.
Kamchiligi — business logic application code va database orasida bo‘linadi.
Transaction
Procedure ichidagi statementlar transactionda bajarilishi mumkin.
Ba’zi database’larda procedure transactionni:
mumkin.
Boshqalarida caller transactioni ichida ishlaydi.
Procedure transaction semantikasi aniq hujjatlashtiriladi.
Atomic operation
Bir nechta table o‘zgarishi procedure ichida bitta transactionga birlashtiriladi.
Masalan, payment:
Xato bo‘lsa barcha database amallari rollback qilinadi.
Exception handling
Procedure xatoni ushlab:
bajarishi mumkin.
Xatoni jim yutish callerga noto‘g‘ri muvaffaqiyat ko‘rsatadi.
Business xato va system xato alohida qaytariladi.
Dynamic SQL
Procedure ichida query matni runtime’da yaratilishi mumkin.
Dynamic SQL:
uchun ishlatiladi.
Parameterlar string concatenation bilan qo‘shilsa SQL injection yuz beradi.
Identifier va value uchun xavfsiz quoting hamda bind parameter ishlatiladi.
Cursor
Procedure katta yoki murakkab natijani cursor orqali bosqichma-bosqich qayta ishlashi mumkin.
Row-by-row sikl oddiy set-based SQLga qaraganda sekinroq bo‘lishi mumkin.
Avval bitta UPDATE, INSERT SELECT yoki aggregation orqali butun to‘plam bilan ishlash imkoniyati tekshiriladi.
Temporary table
Murakkab procedure oraliq natijani temporary table’da saqlashi mumkin.
Bu:
- bir nechta bosqich;
- qayta ishlatiladigan subset;
- index;
- katta transform
uchun qulay.
Temporary table transaction, session va cleanup semantikasiga ega.
Permission
Userga base table huquqi bermasdan faqat procedure bajarish huquqi berilishi mumkin.
Bu nazoratli APIga o‘xshash boundary yaratadi.
Procedure owner huquqi bilan ishlasa:
- dynamic SQL;
- search path;
- input validation;
- minimal privilege
juda muhim.
Versionlash
Procedure schema migration bilan versionlanadi.
Signature o‘zgarsa barcha clientlar bir vaqtda yangilanmasligi mumkin.
Backward-compatible yondashuv:
- yangi optional parameter;
- yangi procedure nomi;
- eski signature’ni vaqtincha saqlash;
- wrapper procedure.
Database obyektini UI orqali qo‘lda o‘zgartirish drift yaratadi.
Performance
Procedure serverga ko‘p network round-tripni kamaytirishi mumkin.
Masalan, application o‘nta alohida query yuborish o‘rniga bitta procedure chaqiradi.
Ammo procedure ichidagi yomon query ham sekin ishlaydi.
Execution plan, index, parameter qiymati va locklar tahlil qilinadi.
Parameter sniffing
Ayrim database’larda procedure uchun execution plan dastlabki parameter qiymatiga ko‘ra cache qilinadi.
Data distribution boshqa parameterlarda keskin farq qilsa shu plan yomon bo‘lishi mumkin.
Statistics, recompile, plan variantlari yoki queryni qayta tuzish kerak bo‘lishi mumkin.
Logging va audit
Procedure chaqiruvi:
- caller;
- parameterlarning xavfsiz qismi;
- davomiylik;
- affected rows;
- error;
- transaction ID
bilan kuzatiladi.
Parol, token va personal data logga yozilmaydi.
Test
Procedure testlari:
- valid input;
- invalid input;
- null;
- duplicate;
- parallel chaqiriq;
- rollback;
- permission;
- katta dataset;
- transaction ichida chaqirish
holatlarini qamrab oladi.
Faqat procedure muvaffaqiyatli compile bo‘lishi correctnessni isbotlamaydi.
Procedure cache va recompile
Database procedure execution planini cache qilishi mumkin.
Schema, statistics yoki parameter taqsimoti o‘zgarganda eski plan samarasiz bo‘lib qolishi ehtimoli bor.
Recompile, plan invalidation yoki queryni qayta yozish orqali muammo tuzatiladi.
Dependency
Procedure table, view, type va boshqa procedure’larga bog‘liq.
Dependent obyekt o‘zgarsa compile xatosi yoki runtime failure yuz berishi mumkin.
Migration pipeline procedure’larni yangi schema bilan birga test qiladi.
Bog‘liq tushunchalar
Stored procedure, Function, Parameter, Transaction, Cursor, Dynamic SQL, Temporary table, Exception handling, Database API, Query plan