MySQL Stored Functions
MySQL Stored Function क्या है?
Stored function named stored routine है जो input values लेकर one value return करती है। इसे SQL expression के part की तरह invoke करते हैं:
SELECT service_fee(1000.00);
SELECT order_id, service_fee(total_amount)
FROM orders_func_lab;Function RETURNS से return type declare और RETURN से value देती है। Parameters में IN, OUT या INOUT mode keywords नहीं; वे input parameters हैं।
Verified Orders Lab
DROP TABLE IF EXISTS orders_func_lab;
CREATE TABLE orders_func_lab (
order_id INT PRIMARY KEY,
customer_id INT NOT NULL,
status VARCHAR(20) NOT NULL,
order_date DATE NOT NULL,
total_amount DECIMAL(10,2) NOT NULL
) ENGINE = InnoDB;
INSERT INTO orders_func_lab VALUES
(1,101,'PAID','2026-08-01',1200.00),
(2,101,'PENDING','2026-08-05',500.00),
(3,102,'PAID','2026-08-03',750.00),
(4,103,'CANCELLED','2026-08-04',300.00),
(5,101,'PAID','2026-08-10',1500.00),
(6,102,'PENDING','2026-08-11',900.00),
(7,104,'PAID','2026-08-12',2200.00),
(8,101,'PAID','2026-08-14',650.00);First function pure arithmetic है। Later function table read करके different characteristics/performance consequences दिखाती है।
Scalar Function Create, RETURN और Use
DELIMITER //
CREATE FUNCTION service_fee(
p_amount DECIMAL(10,2)
)
RETURNS DECIMAL(10,2)
DETERMINISTIC
NO SQL
BEGIN
IF p_amount IS NULL OR p_amount < 0 THEN
RETURN NULL;
ELSEIF p_amount >= 1000 THEN
RETURN ROUND(p_amount * 0.02, 2);
ELSE
RETURN ROUND(p_amount * 0.03, 2);
END IF;
END //
DELIMITER ;
SELECT order_id, total_amount,
service_fee(total_amount) AS fee
FROM orders_func_lab
WHERE status = 'PAID'
ORDER BY order_id;DETERMINISTIC NO SQL truthful है: calculation only input use करती और SQL data access नहीं। Invalid/NULL amount deliberately handled है।
Routine Characteristics Truthfully Declare करें
| Characteristic | Meaning |
|---|---|
| DETERMINISTIC | Same input, same result |
| NOT DETERMINISTIC | Same input पर बदल सकता; default |
| NO SQL | No SQL statements |
| CONTAINS SQL | SQL है, reads/writes claim नहीं; default |
| READS SQL DATA | Reads, modify नहीं |
| MODIFIES SQL DATA | May modify data |
ये declarations हैं; MySQL proof नहीं करता कि deterministic claim true है।
RETURN UUID();
RETURN RAND();
RETURN NOW();इन्हें deterministic न कहें। Table-reading function में underlying data changing हो सकता है।
Table Data पढ़ने वाली Stored Function
DELIMITER //
CREATE FUNCTION customer_paid_total(
p_customer_id INT
)
RETURNS DECIMAL(12,2)
NOT DETERMINISTIC
READS SQL DATA
SQL SECURITY INVOKER
BEGIN
DECLARE v_total DECIMAL(12,2);
SELECT COALESCE(SUM(total_amount), 0)
INTO v_total
FROM orders_func_lab
WHERE customer_id = p_customer_id
AND status = 'PAID';
RETURN v_total;
END //
DELIMITER ;
SELECT customer_paid_total(101) AS paid_total;Table data change हो सकता है इसलिए NOT DETERMINISTIC। INVOKER में caller को underlying access चाहिए; DEFINER में definer account से checks।
SELECT customer_paid_total(customer_id) FROM customers inner aggregation हर outer row पर चला सकती है। Many customers के लिए one JOIN/GROUP BY query prefer करें।Function vs Procedure vs Expression
| Need | Starting choice |
|---|---|
| Small scalar calculation | Function या inline expression |
| Multiple statements/results/OUT | Procedure |
| External-service workflow | Application service |
| Many grouped rows | Set-based SQL |
CALL customer_paid_summary(101, @count, @total);
SELECT customer_paid_total(101);
SELECT customer_id, SUM(total_amount) AS paid_total
FROM orders_func_lab
WHERE status = 'PAID'
GROUP BY customer_id;Function SELECT में convenient है, लेकिन repeated work hide कर सकती है। Expanded workload measure करें।
Privileges, Security और Binary Logging
- Create के लिए normally
CREATE ROUTINE। - Invoke के लिए
EXECUTE। SQL SECURITY DEFINERdefault; INVOKER caller privileges।- Durable least-privileged definer और input validation।
- Binary logging में explicit safety characteristics और additional privilege/trust policy required हो सकती है।
Protection apply होने पर MySQL none of DETERMINISTIC, NO SQL, READS SQL DATA वाली function reject कर सकता है। False keyword add न करें; actual behavior declare और server replication policy follow करें।
Inspect, Test, Optimize और Drop
SHOW CREATE FUNCTION service_fee;
SHOW FUNCTION STATUS WHERE Db = DATABASE();
SELECT ROUTINE_NAME, IS_DETERMINISTIC,
SQL_DATA_ACCESS, SECURITY_TYPE, DATA_TYPE
FROM information_schema.ROUTINES
WHERE ROUTINE_SCHEMA = DATABASE()
AND ROUTINE_TYPE = 'FUNCTION';
DROP FUNCTION IF EXISTS customer_paid_total;- Normal, boundary, NULL, negative, max values test करें।
- Return type, scale, charset/collation verify करें।
- Characteristics honestly declare करें।
- Simple calculations में NO SQL prefer करें।
- Table-reading predicates index करें।
- Large sets पर per-row table reads avoid करें।
- DEFINER/INVOKER और EXECUTE review करें।
- Binary logging में replication/restore test करें।
- Definitions migrations में रखें।
- Invoking queries measure करें।
stored procedures से compare, optimization review और triggers पढ़ें।
Official संदर्भ
- MySQL 8.4: CREATE PROCEDURE and FUNCTION
- MySQL 8.4: Stored Program Binary Logging
- MySQL 8.4: Stored Program Restrictions
Return syntax, characteristics, security, invocation और binary-log requirements official MySQL 8.4 manual से verify किए गए हैं।