Free tutorials & notes in Hindi & English · Clean code examples · Mobile friendly learning
MySQL + SQL · Lesson 97

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 हैं।

Best fit: Small reusable scalar calculation या bounded lookup के लिए function। Workflows, multiple result sets, OUT parameters या multi-step operations के लिए procedure।

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;
1 | 1200.00 | 24.00 3 | 750.00 | 22.50 5 | 1500.00 | 30.00 7 | 2200.00 | 44.00 8 | 650.00 | 19.50

DETERMINISTIC NO SQL truthful है: calculation only input use करती और SQL data access नहीं। Invalid/NULL amount deliberately handled है।

Routine Characteristics Truthfully Declare करें

CharacteristicMeaning
DETERMINISTICSame input, same result
NOT DETERMINISTICSame input पर बदल सकता; default
NO SQLNo SQL statements
CONTAINS SQLSQL है, reads/writes claim नहीं; default
READS SQL DATAReads, modify नहीं
MODIFIES SQL DATAMay 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;
3350.00

Table data change हो सकता है इसलिए NOT DETERMINISTIC। INVOKER में caller को underlying access चाहिए; DEFINER में definer account से checks।

Performance trap: 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

NeedStarting choice
Small scalar calculationFunction या inline expression
Multiple statements/results/OUTProcedure
External-service workflowApplication service
Many grouped rowsSet-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;
101 | 3350.00 102 | 750.00 104 | 2200.00

Function SELECT में convenient है, लेकिन repeated work hide कर सकती है। Expanded workload measure करें।

Privileges, Security और Binary Logging

  • Create के लिए normally CREATE ROUTINE
  • Invoke के लिए EXECUTE
  • SQL SECURITY DEFINER default; 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 करें।

Replication integrity: Nondeterministic data-changing code source, replica या recovery में different data बना सकता है। Exact version/binlog format review करें।

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;
  1. Normal, boundary, NULL, negative, max values test करें।
  2. Return type, scale, charset/collation verify करें।
  3. Characteristics honestly declare करें।
  4. Simple calculations में NO SQL prefer करें।
  5. Table-reading predicates index करें।
  6. Large sets पर per-row table reads avoid करें।
  7. DEFINER/INVOKER और EXECUTE review करें।
  8. Binary logging में replication/restore test करें।
  9. Definitions migrations में रखें।
  10. Invoking queries measure करें।

stored procedures से compare, optimization review और triggers पढ़ें।

Official संदर्भ

Return syntax, characteristics, security, invocation और binary-log requirements official MySQL 8.4 manual से verify किए गए हैं।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

MySQL stored function क्या है?
यह named stored routine है जो one scalar value return करती और SELECT, WHERE या ORDER BY expression में invoke होती है, context और stored-program restrictions के भीतर।
क्या stored function में OUT या INOUT parameters होते हैं?
नहीं। Function parameters input होते हैं; IN, OUT, INOUT mode keywords केवल procedures पर लागू हैं। Function RETURNS declare और RETURN value execute करती है।
DETERMINISTIC का क्या अर्थ है?
Creator declare करता है कि same inputs पर same result आएगा। MySQL claim prove नहीं करता; UUID, random, current-time या changing-data logic को deterministic न कहें।
क्या stored function tables query कर सकती है?
हाँ, READS SQL DATA declare करके tables पढ़ सकती है, restrictions और privileges के भीतर। Per result row call repeated-query cost बहुत बढ़ा सकती है।
Binary logging पर CREATE FUNCTION fail क्यों हो सकती है?
Replication/recovery safety के लिए explicit DETERMINISTIC, NO SQL या READS SQL DATA और additional privileges/trust settings required हो सकते हैं। Blind bypass की जगह truthful declaration और policy ठीक करें।
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.