Bosh sahifa Wiki Procedure

Procedure

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:

bajarishi mumkin.

Aniq farq va imkoniyatlar database implementationiga bog‘liq.

Business logic

Procedure database’ga yaqin business qoidalarni markazlashtirishi mumkin.

Masalan:

  • balans transferi;
  • inventory rezervi;
  • oy yakuni;
  • hisob-kitob;
  • batch cleanup.

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:

  1. payment row yaratish;
  2. order statusini yangilash;
  3. ledger yozuvi;
  4. outbox event yaratish.

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:

  • dynamic table;
  • optional filter;
  • administrative operation

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:

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:

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