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 SQL | Stored Procedure |
|---|---|
| Manually run | Name দিয়ে CALL |
| Logic বারবার লিখতে হয় | একবার save |
| Complex workflow কঠিন | Multiple statements |
| Parameters কম reusable | IN/OUT/INOUT |
| Logic scattered | Centralized |
Normal
SELECT * FROM employees WHERE department = 'IT';
Procedure
CALL get_it_employees();
05
Procedure vs View
১০ মিনিট
| Feature | View | Stored Procedure |
|---|---|---|
| Main purpose | Saved query / interface | Reusable SQL program |
| CALL? | No | Yes |
| Parameters | Normally not like proc | Yes |
| Multiple statements | Limited | Yes |
| IF/ELSE | No procedural | Yes |
| Variables | No | Yes |
| Workflow / modify data | Limited | Excellent |
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
৮ মিনিট
| Parameter | Direction | Example |
|---|---|---|
| IN | Outside → Procedure | employee_id |
| OUT | Procedure → Outside | total_count |
| INOUT | Outside → Proc → Outside | salary |
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 Procedure | Function |
|---|---|
| CALL | Often inside expressions |
| Result sets OK | Returns a value |
| IN/OUT/INOUT | Typically inputs |
| Workflows | Calculations |
এখানে শুধু পরিচয় — পূর্ণ Functions class নয়।
28
Table / View / Procedure
৮ মিনিট
| Object | Main Purpose |
|---|---|
| TABLE | Store data |
| VIEW | Reusable data query/interface |
| STORED PROCEDURE | Execute 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 (১৫)
১২ মিনিট
- DELIMITER ভুলে যাওয়া
- BEGIN ভুলে যাওয়া
- END ভুলে যাওয়া
- CALL ভুলে যাওয়া / SELECT দিয়ে চালানো
- Wrong parameter mode (IN/OUT)
- Confusing parameter names
- DECLARE পরে SQL লেখা (order ভুল)
- SELECT INTO multi-row
- IN/OUT/INOUT omit
- Transaction failure না handle
- Huge god-procedure
- Test না করা
- Unnecessary hardcode
- Unclear names (proc1)
- 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
- get_customer_orders()
- get_product_stock()
- create_order()
- update_stock()
- calculate_order_total()
- customer_order_summary()
- cancel_order()
Input → Validation → Check stock → Create order
→ Update stock → Transaction → Commit/Rollback
39
Live Lab (১৮ steps)
১৫ মিনিট
- CREATE DATABASE
- Create tables
- Insert sample data
- Create first Procedure
- CALL
- Add IN
- Multiple IN
- Local variable
- SELECT INTO
- OUT
- INOUT
- IF/ELSE
- Transaction
- Error handler
- SHOW CREATE PROCEDURE
- DROP PROCEDURE
- Recreate
- 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
৫ মিনিট
| Concept | Meaning |
|---|---|
| Procedure | Saved reusable SQL program |
| CREATE / CALL | Create / Execute |
| IN / OUT / INOUT | Input / Output / Both |
| BEGIN / END | Block |
| DECLARE / SET / SELECT INTO | Var create / assign / fill |
| IF / CASE | Conditional |
| START / COMMIT / ROLLBACK | Transaction |
| DROP / SHOW CREATE | Delete / 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:
- Find employee
- Salary category
- Calculate bonus
- Department summary
- Employee count (OUT)
- Update salary (transaction)
- 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