বিষয়সূচী

01

কেন Stored Procedure?

১৫ মিনিট

ব্যাংক কর্মী প্রতিদিন একই কাজ করে:

Customer ID → Check Account → Check Balance → Withdraw → Update Balance → Create Transaction Record
জিজ্ঞেস

একই কাজের জন্য যদি ১০টা SQL statement লাগে — প্রতিদিন manually লিখতে হবে?

যদি পুরো কাজটা database-এর ভিতরে একটি নাম দিয়ে save করা যায়?

সেই reusable SQL program-ই Stored Procedure
Many SQL Statements → Stored Procedure → Name → CALL → Execute
02

Business Stories

১০ মিনিট

E-commerce

Create Order → Check Product → Reduce Stock → Calculate Amount → Update Order

HR

Employee ID → Find Salary → Bonus → Tax → Result

Banking

Deposit → Update Balance → Record Transaction

Hospital

Patient ID → Find → Appointment → Update Status
জিজ্ঞেস

এই repeated business logic বারবার লিখতে হবে?

Stored Procedure দিয়ে logic database-এ reusable করা যায়।
03

Procedure কী?

১০ মিনিট
Stored Procedure = database-এর ভিতরে save করা SQL statements-এর named block; পরে CALL করে execute করা যায়।
SQL Statements → BEGIN → Business Logic → END → Stored in DB → CALL procedure_name() → Execute
INPUT → Procedure → PROCESS → OUTPUT
Analogy: SQL-এর একটি ছোট reusable machine।
04

Normal SQL vs Procedure

১০ মিনিট
Normal SQLStored Procedure
Manually runName দিয়ে CALL
Logic বারবার লিখতে হয়একবার save
Complex workflow কঠিনMultiple statements
Parameters কম reusableIN/OUT/INOUT
Logic scatteredCentralized
Normal
SELECT * FROM employees WHERE department = 'IT';
Procedure
CALL get_it_employees();
05

Procedure vs View

১০ মিনিট
FeatureViewStored Procedure
Main purposeSaved query / interfaceReusable SQL program
CALL?NoYes
ParametersNormally not like procYes
Multiple statementsLimitedYes
IF/ELSENo proceduralYes
VariablesNoYes
Workflow / modify dataLimitedExcellent
VIEW → "Show me data" PROCEDURE → "Do this work"
06

First CREATE + DELIMITER

১৫ মিনিট
DELIMITER // CREATE PROCEDURE hello_sql() BEGIN SELECT 'Hello SQL Students!' AS message; END // DELIMITER ; CALL hello_sql();
message Hello SQL Students!
Normal SQL: ; = statement end Procedure body: // = procedure definition end
DELIMITER MySQL client command — procedure logic-এর অংশ নয়।
07

BEGIN / END

৫ মিনিট
BEGIN ├── SQL statement 1; ├── SQL statement 2; └── SQL statement 3; END BEGIN = দরজা খোলা · END = দরজা বন্ধ
08

CALL

৫ মিনিট
CALL hello_sql();
CALL → Procedure Name → () → Execute
SELECT ... = query · CALL ... = procedure চালানো
09

IN Parameter

১৫ মিনিট

HR employee ID দিলে Procedure তথ্য return করবে।

DELIMITER // CREATE PROCEDURE get_employee( IN p_employee_id INT ) BEGIN SELECT employee_id, employee_name, department, salary FROM employees WHERE employee_id = p_employee_id; END // DELIMITER ; CALL get_employee(101);
101 → p_employee_id → Procedure → Find Employee → Result
IN = বাইরে থেকে Procedure-এর ভিতরে value পাঠানো।
10

Parameter Naming

৫ মিনিট
Good: p_employee_id · p_department · p_salary · p_customer_id · p_order_id Bad: id · x · temp · a1
p_ prefix দেখলেই বোঝা যায় এটি parameter।
11

Multiple IN Parameters

১০ মিনিট
DELIMITER // CREATE PROCEDURE get_employees_by_department( IN p_department VARCHAR(50) ) BEGIN SELECT employee_id, employee_name, department FROM employees WHERE department = p_department; END // DELIMITER ; CALL get_employees_by_department('IT');
CREATE PROCEDURE employee_salary_range( IN p_department VARCHAR(50), IN p_min_salary DECIMAL(10,2) ) BEGIN SELECT employee_id, employee_name, salary FROM employees WHERE department = p_department AND salary >= p_min_salary; END;
12

Local Variables

১০ মিনিট
DELIMITER // CREATE PROCEDURE employee_count() BEGIN DECLARE total_employees INT; SELECT COUNT(*) INTO total_employees FROM employees; SELECT total_employees AS total_employees; END // DELIMITER ;
DECLARE → Create variable → SELECT INTO → Put value → Use
13

DECLARE

৫ মিনিট
DECLARE total_salary DECIMAL(12,2);
সাধারণত DECLARE BEGIN-এর শুরুতে — অন্য procedural statements-এর আগে।
14

SET

৫ মিনিট
SET total_salary = 100000;
Variable → SET → Value
15

SELECT INTO

১০ মিনিট
SELECT salary INTO employee_salary FROM employees WHERE employee_id = p_employee_id;
Database → SELECT → Value → Variable
একাধিক row হলে simple scalar SELECT INTO সমস্যা হতে পারে — expected result বুঝে ব্যবহার করো।
16

OUT Parameter

১৫ মিনিট
OUT = Procedure থেকে বাইরে result পাঠানো।
DELIMITER // CREATE PROCEDURE get_employee_count( OUT p_total INT ) BEGIN SELECT COUNT(*) INTO p_total FROM employees; END // DELIMITER ; CALL get_employee_count(@total); SELECT @total;
@total 5
Procedure → Calculate → OUT → Outside Variable (@total)
17

INOUT Parameter

১০ মিনিট
INOUT = বাইরে থেকে ভিতরে যায় + পরিবর্তিত হয়ে বাইরে ফিরে আসে।
DELIMITER // CREATE PROCEDURE add_bonus( INOUT p_salary DECIMAL(10,2) ) BEGIN SET p_salary = p_salary + 5000; END // DELIMITER ; SET @salary = 50000; CALL add_bonus(@salary); SELECT @salary;
55000
Outside → INOUT → Procedure → Changed → Outside
18

IN vs OUT vs INOUT

৮ মিনিট
ParameterDirectionExample
INOutside → Procedureemployee_id
OUTProcedure → Outsidetotal_count
INOUTOutside → Proc → Outsidesalary
IN = Input · OUT = Output · INOUT = Input + Output
19

IF / ELSE

১৫ মিনিট

Salary ≥ 50000 হলে High, না হলে Standard।

DELIMITER // CREATE PROCEDURE salary_category( IN p_salary DECIMAL(10,2) ) BEGIN IF p_salary >= 50000 THEN SELECT 'High Salary' AS category; ELSE SELECT 'Standard Salary' AS category; END IF; END // DELIMITER ; CALL salary_category(60000);
category: High Salary
Input → IF → TRUE High / FALSE Standard
20

ELSEIF

৮ মিনিট
IF p_salary >= 80000 THEN SELECT 'A' AS grade; ELSEIF p_salary >= 50000 THEN SELECT 'B' AS grade; ELSE SELECT 'C' AS grade; END IF;
≥80000 → A · ≥50000 → B · else → C
21

CASE

১০ মিনিট
CASE WHEN p_salary >= 80000 THEN SELECT 'Senior' AS level; WHEN p_salary >= 50000 THEN SELECT 'Mid Level' AS level; ELSE SELECT 'Junior' AS level; END CASE;
IF = if/else chain · CASE = multi-condition classification (procedural CASE)।
22

LOOP Concept

১০ মিনিট
START → Check Condition → Run Statement → Repeat → Condition False → END MySQL: LOOP · WHILE · REPEAT
Loop শেখার জন্য brief — বেশিরভাগ কাজ set-based SQL-এই ভালো (Part 36)।
23

Transactions

১৫ মিনিট
Transfer ৳10,000 → Deduct A → Add B → Both OK? → COMMIT Fail → ROLLBACK
START TRANSACTION; -- operation 1 -- operation 2 COMMIT;
BEGIN → START TRANSACTION → Op A → Op B → Success? Yes COMMIT / No ROLLBACK
Banking/e-commerce-এ আংশিক update এড়ানোর জন্য জরুরি।
24

Error Handler Basics

১০ মিনিট
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; END;
Unexpected error হলে কী করবে — beginner level; deep exception course নয়।
25

E-commerce Order Procedure

১২ মিনিট
Customer ID → Product ID → Check Product → Check Stock → Create Order → Reduce Stock → COMMIT
DELIMITER // CREATE PROCEDURE place_order( IN p_customer_id INT, IN p_product_id INT, IN p_qty INT ) BEGIN DECLARE v_stock INT; DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; END; START TRANSACTION; SELECT stock INTO v_stock FROM products WHERE product_id = p_product_id; IF v_stock < p_qty THEN ROLLBACK; SELECT 'Insufficient stock' AS status; ELSE INSERT INTO orders(customer_id, product_id, quantity) VALUES(p_customer_id, p_product_id, p_qty); UPDATE products SET stock = stock - p_qty WHERE product_id = p_product_id; COMMIT; SELECT 'Order placed' AS status; END IF; END // DELIMITER ;
26

Bank Transfer Procedure

১২ মিনিট
Validate amount → Check source balance → Deduct → Add → Record transaction → COMMIT (else ROLLBACK)
DELIMITER // CREATE PROCEDURE transfer_money( IN p_from INT, IN p_to INT, IN p_amount DECIMAL(12,2) ) BEGIN DECLARE v_bal DECIMAL(12,2); DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; END; START TRANSACTION; SELECT balance INTO v_bal FROM accounts WHERE account_id = p_from; IF p_amount <= 0 OR v_bal < p_amount THEN ROLLBACK; SELECT 'Transfer failed' AS status; ELSE UPDATE accounts SET balance = balance - p_amount WHERE account_id = p_from; UPDATE accounts SET balance = balance + p_amount WHERE account_id = p_to; INSERT INTO transfers(from_id, to_id, amount) VALUES(p_from, p_to, p_amount); COMMIT; SELECT 'Transfer OK' AS status; END IF; END // DELIMITER ;
27

Procedure vs Function

৬ মিনিট
Stored ProcedureFunction
CALLOften inside expressions
Result sets OKReturns a value
IN/OUT/INOUTTypically inputs
WorkflowsCalculations
এখানে শুধু পরিচয় — পূর্ণ Functions class নয়।
28

Table / View / Procedure

৮ মিনিট
ObjectMain Purpose
TABLEStore data
VIEWReusable data query/interface
STORED PROCEDUREExecute reusable business logic
TABLE → STORE · VIEW → SHOW · PROCEDURE → DO
29

Create / Inspect / Drop

১০ মিনিট
CREATE PROCEDURE ... CALL procedure_name(); SHOW CREATE PROCEDURE procedure_name; DROP PROCEDURE procedure_name; DROP PROCEDURE IF EXISTS procedure_name;
CREATE → CALL → TEST → MODIFY/RECREATE → USE → DROP
30

Modifying Procedures

৬ মিনিট
MySQL: simple CREATE OR REPLACE PROCEDURE নেই (View-এর মতো নয়) DROP PROCEDURE → CREATE PROCEDURE → Test
Production deploy-এ careful — callers break হতে পারে।
31

Common Mistakes (১৫)

১২ মিনিট
  1. DELIMITER ভুলে যাওয়া
  2. BEGIN ভুলে যাওয়া
  3. END ভুলে যাওয়া
  4. CALL ভুলে যাওয়া / SELECT দিয়ে চালানো
  5. Wrong parameter mode (IN/OUT)
  6. Confusing parameter names
  7. DECLARE পরে SQL লেখা (order ভুল)
  8. SELECT INTO multi-row
  9. IN/OUT/INOUT omit
  10. Transaction failure না handle
  11. Huge god-procedure
  12. Test না করা
  13. Unnecessary hardcode
  14. Unclear names (proc1)
  15. Procedure = auto-fast ধরে নেওয়া
32

Naming Best Practices

৫ মিনিট
Good: get_employee_by_id · create_customer_order · transfer_money Bad: proc1 · test · abc · myprocedure
33

Industry Use Cases

৮ মিনিট

Banking

Fund transfer · Interest · Account ops

E-commerce

Order · Inventory · Payment

HR / Healthcare

Payroll · Appointments · Billing

DE / BI

ETL batch · Reusable report logic

34

Security

৮ মিনিট
User → CALL procedure → Procedure accesses tables (instead of direct table write for everyone)
Procedure ≠ complete security — permissions, auth, audit এখনও দরকার।
35

Performance

৮ মিনিট
Benefits: reuse · centralize · fewer app round-trips (sometimes) Limits: hard to maintain · bad SQL still slow · not auto-faster · row loops costly · dependencies
Good SQL inside matter করে — শুধু Procedure ব্যবহার করলেই দ্রুত হয় না।
36

Set-based vs Row Loop

৮ মিনিট
1M rows → Loop one-by-one → Often expensive 1 SQL statement → Set-based → Often better
Procedure-এ loop আছে মানেই loop ব্যবহার করা উচিত নয়।
37

Professional Workflow

৮ মিনিট
Application → CALL procedure → Validation / Calc / SQL / Txn / Handler → Database Tables → Result
38

Mini Project — E-com Orders

১৫ মিনিট

Tables: customers · products · orders · order_items

  1. get_customer_orders()
  2. get_product_stock()
  3. create_order()
  4. update_stock()
  5. calculate_order_total()
  6. customer_order_summary()
  7. cancel_order()
Input → Validation → Check stock → Create order → Update stock → Transaction → Commit/Rollback
39

Live Lab (১৮ steps)

১৫ মিনিট
  1. CREATE DATABASE
  2. Create tables
  3. Insert sample data
  4. Create first Procedure
  5. CALL
  6. Add IN
  7. Multiple IN
  8. Local variable
  9. SELECT INTO
  10. OUT
  11. INOUT
  12. IF/ELSE
  13. Transaction
  14. Error handler
  15. SHOW CREATE PROCEDURE
  16. DROP PROCEDURE
  17. Recreate
  18. Test mini project
প্রতিটি ধাপে: SQL · expected output · common error · business meaning।
40

Activities (১৫)

১০ মিনিট
Act 1 — Predict CALL output
Result set from procedure body
Act 2 — Identify IN/OUT/INOUT
Direction of data flow
Act 3 — Fix broken Procedure
DELIMITER / BEGIN / END / CALL
Act 4 — Missing DELIMITER
Client ends at first ;
Act 5 — Missing BEGIN/END
Block incomplete
Act 6 — Choose parameter type
IN input · OUT output · INOUT both
Act 7 — Business → Procedure
Name action + params
Act 8 — Repeated SQL → Proc
CREATE PROCEDURE + CALL
Act 9 — Debug transaction
COMMIT only if all OK
Act 10 — Predict @variable
After OUT/INOUT CALL
Act 11 — Design bank transfer
Validate · deduct · add · COMMIT
Act 12 — Design e-com order
Stock check · insert · update
Act 13 — Procedure vs View
DO work vs SHOW data
Act 14 — Perf smell
Row loop on huge set
Act 15 — Mini project
7 order procedures
41

Predict (১৫)

১০ মিনিট
Predict: CALL salary_category(70000)
High Salary
Predict: SET @s=50000; CALL add_bonus(@s); SELECT @s
55000
Predict: Why OUT?
Return value to caller variable
Predict: CALL hello_sql()
Hello SQL Students!
Predict: CALL get_employee(101)
Row for id 101
Predict: Missing () on CALL get_employee
Syntax error
Predict: DROP PROCEDURE — tables?
Tables stay
Predict: INOUT changes outside?
Yes after CALL
Predict: Stock < qty in place_order
Rollback + fail message
Predict: SHOW CREATE PROCEDURE shows?
Definition text
Predict: View needs CALL?
No — SELECT FROM view
Predict: DECLARE after SELECT?
Often error — order matters
Predict: SELECT INTO 2 rows
Error / unexpected
Predict: Transfer amount 0
Should fail validation
Predict: Procedure always faster?
No
42

Debug (১০)

১০ মিনিট
Bug: CREATE PROCEDURE test() SELECT 'Hello';
Need BEGIN/END (+ DELIMITER)
Bug: CREATE PROCEDURE get_emp(p_id INT) …
Add IN (mode)
Bug: CALL get_employee;
Need CALL get_employee();
Bug: Forget DELIMITER
Body truncated at ;
Bug: Forget END
Syntax incomplete
Bug: OUT without @var
Pass user variable
Bug: Think DROP PROCEDURE deletes tables
Only drops procedure
Bug: CREATE OR REPLACE PROCEDURE
Use DROP then CREATE
Bug: No handler + failed mid-transfer
Partial update risk
Bug: DECLARE after statements
Move DECLARE to top of BEGIN
43

Quick Revision

৫ মিনিট
ConceptMeaning
ProcedureSaved reusable SQL program
CREATE / CALLCreate / Execute
IN / OUT / INOUTInput / Output / Both
BEGIN / ENDBlock
DECLARE / SET / SELECT INTOVar create / assign / fill
IF / CASEConditional
START / COMMIT / ROLLBACKTransaction
DROP / SHOW CREATEDelete / Inspect
44

Memory Map

৫ মিনিট
STORED PROCEDURE │ ┌────────────┼────────────┐ ↓ ↓ ↓ INPUT PROCESS OUTPUT │ │ │ IN IF/CASE/VARS OUT │ INOUT SQL Statements │ TRANSACTION │ COMMIT / ROLLBACK
45

Final Mental Model

৫ মিনিট
TABLE → Stores Data VIEW → Shows Data STORED PROCEDURE → Does Work CREATE → CALL → PROCESS → RESULT
Stored Procedure = database-এর ভিতরে save করা reusable SQL program; CALL করে চালানো যায়।
46

Interview (৩০)

১২ মিনিট
IV 1. Stored Procedure কী?
Saved reusable SQL program · CALL · উদা: hello_sql
IV 2. কেন?
Reuse · centralize · workflow · params
IV 3. vs Query?
Named CALL vs manual SQL
IV 4. vs View?
DO work vs SHOW data
IV 5. Create?
CREATE PROCEDURE … BEGIN … END
IV 6. DELIMITER?
Client command for multi-statement body
IV 7. BEGIN/END?
Procedure block
IV 8. Execute?
CALL name()
IV 9. CALL?
Run procedure
IV 10. IN?
Outside → procedure
IV 11. OUT?
Procedure → outside
IV 12. INOUT?
Both directions
IV 13. IN vs OUT?
Input vs output
IV 14. Local variable?
DECLARE inside BEGIN
IV 15. DECLARE?
Create local var
IV 16. SELECT INTO?
Query result → variable
IV 17. IF?
Conditional inside proc
IV 18. CASE?
Multi-condition procedural
IV 19. Multiple statements?
Yes inside BEGIN/END
IV 20. Modify data?
Yes (INSERT/UPDATE/DELETE)
IV 21. Transactions?
Yes START/COMMIT/ROLLBACK
IV 22. COMMIT?
Save changes
IV 23. ROLLBACK?
Undo
IV 24. Error handling?
HANDLER FOR SQLEXCEPTION
IV 25. Inspect?
SHOW CREATE PROCEDURE
IV 26. Delete?
DROP PROCEDURE / IF EXISTS
IV 27. Always faster?
No
IV 28. Disadvantages?
Maintainability · deps · bad SQL
IV 29. Avoid when?
Simple one-off queries · over-complex god procs
IV 30. Real use?
Bank transfer / place order
47

MCQ (২৫)

১০ মিনিট
MCQ 1. Procedure is? A) table B) saved SQL program C) index D) PK
B
MCQ 2. Execute with? A) SELECT only B) CALL C) DROP TABLE D) GRANT only
B
MCQ 3. DELIMITER is? A) procedure logic B) client command C) index D) JOIN
B
MCQ 4. BEGIN/END? A) block B) DROP C) VIEW D) PK
A
MCQ 5. IN means? A) output only B) input C) delete D) commit
B
MCQ 6. OUT means? A) input only B) output to caller C) table D) view
B
MCQ 7. INOUT? A) neither B) both directions C) only DROP D) only LIMIT
B
MCQ 8. Local var via? A) DECLARE B) DROP VIEW C) UNION D) LIMIT
A
MCQ 9. Assign with? A) SET B) DROP C) GRANT D) TRUNCATE
A
MCQ 10. Query→var? A) SELECT INTO B) DROP INTO C) CALL INTO D) VIEW INTO
A
MCQ 11. Conditional? A) IF … END IF B) only JOIN C) only LIKE D) only REGEXP
A
MCQ 12. Save txn? A) COMMIT B) ROLLBACK C) DROP D) CALL
A
MCQ 13. Undo txn? A) ROLLBACK B) COMMIT C) SHOW D) IN
A
MCQ 14. Inspect? A) SHOW CREATE PROCEDURE B) DROP ALL C) SELECT * FROM proc D) TRUNCATE
A
MCQ 15. Delete? A) DROP PROCEDURE B) DROP TABLE always C) DELETE VIEW D) ALTER INDEX
A
MCQ 16. View vs Proc?
SHOW vs DO
MCQ 17. Always faster? A) yes B) no C) only INOUT D) only CASE
B
MCQ 18. Security alone? A) enough B) not replacement for perms C) replaces auth D) replaces audit
B
MCQ 19. Modify via? A) DROP then CREATE B) CREATE OR REPLACE always C) only UPDATE D) only INSERT
A
MCQ 20. CALL hello_sql wrong? A) missing () sometimes B) always OK without () C) needs DROP D) needs VIEW
A
MCQ 21. Handler for? A) SQLEXCEPTION basics B) only fonts C) only CSS D) only HTML
A
MCQ 22. Bank transfer needs? A) transaction B) only LIMIT C) only DISTINCT D) only LIKE
A
MCQ 23. Focus of class? A) PROCEDURE B) Python C) REGEXP reteach D) NLP
A
MCQ 24. p_ prefix? A) parameter naming B) primary key C) partition D) privilege
A
MCQ 25. Mental model?
Saved program · CALL · DO work
48

Viva (২০)

৮ মিনিট
Viva 1. Procedure কী?
Saved reusable SQL program
Viva 2. কেন?
Reuse / workflow / centralize
Viva 3. Execute?
CALL name()
Viva 4. CALL?
Run procedure
Viva 5. IN?
Input
Viva 6. OUT?
Output
Viva 7. INOUT?
Both
Viva 8. DELIMITER কেন?
Multi-statement body
Viva 9. BEGIN/END?
Block
Viva 10. DECLARE?
Local variable
Viva 11. Data modify?
হ্যাঁ
Viva 12. Transaction?
হ্যাঁ
Viva 13. View vs Proc?
SHOW vs DO
Viva 14. Inspect?
SHOW CREATE PROCEDURE
Viva 15. Drop?
DROP PROCEDURE
Viva 16. Always faster?
না
Viva 17. SELECT INTO?
Result → variable
Viva 18. COMMIT?
Save
Viva 19. ROLLBACK?
Undo
Viva 20. One line?
CALL করে চালানো saved SQL program
49

Homework — Payroll System

৮ মিনিট

Employee Payroll Procedures:

  1. Find employee
  2. Salary category
  3. Calculate bonus
  4. Department summary
  5. Employee count (OUT)
  6. Update salary (transaction)
  7. Generate payroll result
Must use: IN · OUT · INOUT · DECLARE · IF · TRANSACTION · HANDLER · CALL · SHOW CREATE · DROP
50

Final Challenge

১০ মিনিট
Requirement

একজন customer একটি product কিনতে চায় — আগে নিজে design করো, পরে solution দেখো।

Customer ID → Product ID → Qty → Check Customer → Check Product → Check Stock → Calculate Total → Create Order → Reduce Stock → COMMIT Fail → ROLLBACK
Design first (params, vars, IF, START TRANSACTION, handler). Then implement like place_order (Part 25) + order total. STORED PROCEDURE = CALL করে চালানো saved SQL program. TABLE STORE · VIEW SHOW · PROCEDURE DO