https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_b964594d3d957944241961017b9eb19bf02834de44cce93d8e67dd306852dbe346167181e455e33d5268ea01d973d77bb056848546f31794f31a4c31a9da5aa3.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_23f1ae74c634d7e5e0a067c22b7a8c2d79c3ffd9a3b9395fc82c1b3b99635552b994f1f72f532f28ceaff1ea054ea026cd488cd62fa03a4ad91d212b5f3c5a72.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_451c3884f51125f7687e5bb07cfab033c04cb7174c33f93213b2af4bad2af13cf48b92a7fa95fc86d7d436f355938a3ac50aa119cdb7c9b6d5a52815c3e6033e.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_bfff9e63e857e9ee612e292d4a6edf3ced64d6a756925c953a9d8f77845ff601eca64d73dfa48756b1a9f4a4d6de6127a273bcde16ddeb71a22383460f4e94b0.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_f4dd7e1d73ae5eda35ed5ad6aa965b612dbf483ece3ca50c1e8e30ad8dff1c66a160ed75e958e2db399661d229874783e0834ad813a479437035666b8e9e3386.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_4fce0769137d4cd096989b0349bc3c2bbfca79ac311fdf714c41ab24d87551c7b49b756c8a8de090b0714a0ad0560e49fa532ba5a88875ea4afd78efac464df6.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_85cec8b07d60426b11040e471babca0d2f9c8dc87a9b56e06cad39828f7f67179e29609100f282a574872c9a93fb635b25416300eb4c97bc5a653d00cf6f8dbf.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_6768e5a27d4d357347338621c0d20bd269b126d30eec796193390f2f530fbaea60af84130c46f9786114be65149e661e87d55c339219c90aa76396d7e5b734ef.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_2acd6bdff3b680341e8c727da5169a647123eb8fd0a90253161b4c3af272c15d293bf9bb217008bb13f84d1910b0e166798001f8603b6c026d5c20a76c41d47c.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_f2615b226171dfef591e5841493a63f867ea5fa6d4c52473604cc5a7e513c033af38229a352230030389c713591b0fd31d98b8802cc7c7aefcd1fcc049c402cb.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_268c9bba6ba649318f0da28c37b09a9bbfa371210f9b6b52faa7fd8ae94abf6b3c3bfeb5df5705c93495ce1152ca58aeabc435d6c6c1bd959025165c3f50e086.js
  • Skip to main content
  • Skip to primary sidebar
  • Skip to footer
  • Home
  • Featured
    • Advanced Python Topics
    • AWS Learning Roadmap
    • JWT Complete Guide
    • Git CheatSheet
  • Explore
    • Programming
    • Development
      • microservices
      • Front End
    • Database
    • DevOps
    • Productivity
    • Tutorial Series
      • C# LinQ Tutorials
      • PHP Tutorials
  • Dev Tools
    • JSON Formatter
    • Diff Checker
    • JWT Decoder
    • JWT Generator
    • Base64 Converter
    • Data Format Converter
    • QR Code Generator
    • Javascript Minifier
    • CSS Minifier
    • Text Analyzer
  • About
  • Contact
CodeSamplez.com

CodeSamplez.com

Programming And Development Resources

You are here: Home / Database / MySQL Stored Procedures: A Complete Guide for Beginners

MySQL Stored Procedures: A Complete Guide for Beginners

Updated May 16, 2025 by Rana Ahsan 4 Comments ⏰ 6 minutes

MySQL Stored Procedures For Beginners

Ever struggled with writing the same SQL queries over and over again in your code? I know I have! That’s where MySQL stored procedures come in to save the day. When I first discovered stored procedures after MySQL 5 was released, they completely transformed how I approach database programming.

In web development, especially with PHP, we’re used to writing raw SQL statements directly in our application code. While this works fine, it’s definitely not the most efficient approach. MySQL stored procedures offer a MUCH better alternative that will dramatically improve your database interactions.

What Are MySQL Stored Procedures?

A MySQL stored procedure is essentially a set of SQL statements stored within the database itself. Think of it as a function or method that lives in your database rather than your application code. You can call it whenever needed, passing parameters and getting results back.

Stored procedures offer several game-changing benefits:

  • Code reusability – Write once, use many times
  • Better security – Reduce SQL injection risks
  • Improved performance – Pre-compiled execution plans
  • Reduced network traffic – Send one call instead of multiple queries
  • Centralized business logic – Keep database operations in one place

Creating Your First MySQL Stored Procedure

Let’s dive right into creating a simple stored procedure in MySQL. I’ll show you how to do this using PHPMyAdmin, which most web developers are familiar with.

Using PHPMyAdmin

  1. Open PHPMyAdmin and select your database
  2. Click on the “SQL” tab
  3. Enter the following code:
DELIMITER //

CREATE PROCEDURE check_number_type
(IN number_id INTEGER) 
BEGIN
    DECLARE name VARCHAR(10);
    
    IF number_id % 2 = 0 THEN
        SET name = 'even';
    ELSE
        SET name = 'odd';
    END IF;
    
    INSERT INTO number_table VALUES (number_id, name);
END //

DELIMITER ;Code language: PHP (php)
  1. Click “Go” to execute

This simple procedure takes a number as input, checks if it’s even or odd, and inserts the result into a table.

Understanding the Code

Let’s break down what’s happening in this procedure:

  • DELIMITER // – This changes the statement delimiter temporarily from semicolon (;) to double slash (//) so MySQL doesn’t get confused by the semicolons inside our procedure.
  • CREATE PROCEDURE check_number_type – Names our procedure.
  • IN number_id INTEGER – Defines an input parameter.
  • DECLARE name VARCHAR(10) – Creates a local variable.
  • IF/ELSE – Standard conditional logic.
  • SET name = ‘even’ – Assigns a value to our variable.
  • INSERT INTO – Standard SQL statement.
  • DELIMITER ; – Changes the delimiter back to semicolon.

Parameters in MySQL Stored Procedures

MySQL stored procedures can have three types of parameters:

  1. IN parameters – Input values passed to the procedure (most common)
  2. OUT parameters – Output values returned from the procedure
  3. INOUT parameters – Both input and output values

Here’s an example with multiple parameter types:

DELIMITER //

CREATE PROCEDURE calculate_sum_and_difference
(
    IN num1 INT,
    IN num2 INT,
    OUT sum_result INT,
    OUT diff_result INT
)
BEGIN
    SET sum_result = num1 + num2;
    SET diff_result = num1 - num2;
END //

DELIMITER ;Code language: JavaScript (javascript)

To call this procedure and get the results:

CALL calculate_sum_and_difference(10, 5, @sum, @diff);
SELECT @sum, @diff;Code language: CSS (css)

Executing MySQL Stored Procedures from PHP

Calling stored procedures from PHP is straightforward. Here’s how to do it:

<?php
// Connect to database
$conn = mysqli_connect("localhost", "username", "password", "database");

// For a simple procedure with one input parameter
$id = 5;
$result = mysqli_query($conn, "CALL check_number_type($id)");

// For a procedure with output parameters
mysqli_query($conn, "CALL calculate_sum_and_difference(10, 5, @sum, @diff)");
$result = mysqli_query($conn, "SELECT @sum, @diff");
$row = mysqli_fetch_assoc($result);
echo "Sum: " . $row['@sum'] . ", Difference: " . $row['@diff'];

mysqli_close($conn);
?>Code language: HTML, XML (xml)

Advanced Features of MySQL Stored Procedures

Once you’ve mastered the basics, you can explore more advanced features:

Conditional Statements

Beyond simple IF/ELSE, MySQL supports CASE statements:

DELIMITER //

CREATE PROCEDURE grade_student
(IN score INT)
BEGIN
    DECLARE grade CHAR(1);
    
    CASE
        WHEN score >= 90 THEN SET grade = 'A';
        WHEN score >= 80 THEN SET grade = 'B';
        WHEN score >= 70 THEN SET grade = 'C';
        WHEN score >= 60 THEN SET grade = 'D';
        ELSE SET grade = 'F';
    END CASE;
    
    SELECT grade;
END //

DELIMITER ;Code language: PHP (php)

Loops

MySQL procedures support several types of loops:

-- WHILE loop
DELIMITER //
CREATE PROCEDURE count_up
(IN max_num INT)
BEGIN
    DECLARE counter INT DEFAULT 1;
    
    WHILE counter <= max_num DO
        SELECT counter;
        SET counter = counter + 1;
    END WHILE;
END //
DELIMITER ;

-- REPEAT loop (executes at least once)
DELIMITER //
CREATE PROCEDURE count_down
(IN start_num INT)
BEGIN
    REPEAT
        SELECT start_num;
        SET start_num = start_num - 1;
    UNTIL start_num <= 0
    END REPEAT;
END //
DELIMITER ;Code language: PHP (php)

Error Handling

MySQL provides DECLARE handlers for error conditions:

DELIMITER //
CREATE PROCEDURE safe_division
(IN numerator DECIMAL, IN denominator DECIMAL)
BEGIN
    DECLARE result DECIMAL DEFAULT 0;
    DECLARE div_error BOOLEAN DEFAULT FALSE;
    
    -- Define error handler
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
        SET div_error = TRUE;
    
    -- Attempt division
    IF denominator <> 0 THEN
        SET result = numerator / denominator;
    ELSE
        SET div_error = TRUE;
    END IF;
    
    -- Return appropriate message
    IF div_error THEN
        SELECT 'Error: Cannot divide by zero' AS message;
    ELSE
        SELECT result AS result;
    END IF;
END //
DELIMITER ;Code language: PHP (php)

Best Practices for MySQL Stored Procedures

Based on my experience, here are some tips for working effectively with stored procedures:

  1. Use meaningful names – Name your procedures so their purpose is immediately clear
  2. Comment your code – Especially for complex procedures
  3. Choose appropriate parameter types – Only use IN unless you need OUT/INOUT
  4. Handle errors properly – Always implement error handling for robustness
  5. Keep procedures focused – Each procedure should do one thing well
  6. Avoid excessive logic – Very complex business logic might be better in application code
  7. Test thoroughly – Stored procedures can be difficult to debug

Tip 💡: Explore more MySQL Best Practices!

Limitations and Considerations

While stored procedures are powerful, they do have some limitations:

  • Limited debugging capabilities – Debugging stored procedures can be challenging
  • Portability concerns – Different databases handle stored procedures differently
  • Version control issues – More difficult to track changes than application code
  • Language limitations – SQL is not as flexible as general-purpose programming languages

When to Use MySQL Stored Procedures

Stored procedures are particularly useful in these scenarios:

  • Repetitive database operations – Avoid duplicating the same queries
  • Complex multi-step transactions – Keep related operations together
  • Data validation – Enforce business rules at the database level
  • Security-sensitive operations – Limit direct table access
  • Performance-critical functions – Reduce network traffic and query parsing overhead

Conclusion

MySQL stored procedures are an essential tool in any database developer’s toolkit. They offer significant advantages in terms of code organization, security, and performance. While they might seem intimidating at first, the skills you develop working with stored procedures will absolutely pay off in the long run.

I encourage you to start incorporating stored procedures into your MySQL projects. Even if you begin with simple cases, you’ll quickly see how they can streamline your database interactions and make your applications more maintainable.

Have you tried using MySQL stored procedures in your projects? What benefits or challenges have you encountered? I’d love to hear about your experiences in the comments!

Additional Resources

  • Advanced Stored Procedure Techniques
  • MySQL Official Documentation
  • Best Practices

Share if liked!

  • Click to share on Facebook (Opens in new window) Facebook
  • Click to share on X (Opens in new window) X
  • Click to share on LinkedIn (Opens in new window) LinkedIn
  • Click to share on Pinterest (Opens in new window) Pinterest
  • Click to share on Reddit (Opens in new window) Reddit
  • Click to share on Tumblr (Opens in new window) Tumblr
  • Click to share on Pocket (Opens in new window) Pocket

You may also like


Discover more from CodeSamplez.com

Subscribe to get the latest posts sent to your email.

First Published On: December 13, 2010 Filed Under: Database Tagged With: mysql

About Rana Ahsan

Rana Ahsan is a seasoned software engineer and technology leader specialized in distributed systems and software architecture. With a Master’s in Software Engineering from Concordia University, his experience spans leading scalable architecture at Coursera and TopHat, contributing to open-source projects. This blog, CodeSamplez.com, showcases his passion for sharing practical insights on programming and distributed systems concepts and help educate others.
Github | X | LinkedIn

Reader Interactions

Comments

  1. programarivm says

    January 21, 2012 at 8:36 AM

    Hi, excellent article. I attach a post (the post is in Spanish, and the MySQL script’s in Catalan) that explains how to implement a virtual store with MySQL stored procedures. There’s a MySQL API there for typical CRUD operations. Greetings to all!

    http://programarivm.com/2012/01/comercio-electronico-de-la-uoc-base-de-datos-de-una-tienda-virtual-con-stored-procedures-y-stored-functions-de-mysql/

    Reply
  2. ankursharp says

    February 20, 2013 at 7:22 PM

    HI, wery helpful post. Also for extended clarification I got some reference from http://www.techflirt.com/mysql-stored-procedure-tutorial/ . It was great pleasure to see sp in mysql as well.

    Reply
  3. Abir Sur says

    April 6, 2015 at 3:40 AM

    Hi excellent post, I have a question, how do I get “out parameter” ‘s data of a Stored Procedure in PHP codeigniter. I use PDO and get success. but as I am basically a asp.net programmer So I cant understand ” Using PDO is good for Codeigniter Framework or Not ?? “. Please help.. Thanks in advance.

    Reply
  4. Luis says

    November 4, 2016 at 11:05 AM

    I’m Sorry, i cant use SP in php codeigniter, i’m using driver mysql and php 5.
    i can see error database then i call my SP, please help me!

    Reply

Leave a ReplyCancel reply

Primary Sidebar

  • Facebook
  • X
  • Pinterest
  • Tumblr

Subscribe via Email

Top Picks

python local environment setup

Python Local Development Environment: Complete Setup Guide

In-Depth JWT Tutorial Guide For Beginners

JSON Web Tokens (JWT): A Complete In-Depth Beginners Tutorial

The Ultimate Git Commands CheatSheet

Git Commands Cheatsheet: The Ultimate Git Reference

web development architecture case studies

Web Development Architecture Case Studies: Lessons From Titans

static website deployment s3 cloudfront

Host Static Website With AWS S3 And CloudFront – Step By Step

Featured Dev Tools

  • Diff Checker
  • JWT Decoder

Recently Published

advanced service worker features

Advanced Service Worker Features: Push Beyond the Basics

service worker framework integration

Service Workers in React: Framework Integration Guide

service worker caching strategies

Service Worker Caching Strategies: Performance & Offline Apps

service worker lifecycle

Service Worker Lifecycle: Complete Guide for FE Developers

what is service worker

What Is a Service Worker? A Beginner’s Guide

Footer

Subscribe via Email

Follow Us

  • Facebook
  • X
  • Pinterest
  • Tumblr

Explore By Topics

Python | AWS | PHP | C# | Javascript

Copyright © 2025

https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_af7634532f05be6d16a9a0ee8a839ac9020eebcd9012283abd716151876f176ab913f370be0bb7eac50998d506cbfc292f1d28d86a83fbb5f0f1a94dbfb987e5.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_c402e38f1879c18090377fb6b73b15ac158be453ecda3a54456494fe8aba42b990c293bae5424e5643d52515ffc2067e0819995be8d07d5bba9107a96780775c.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_ffc3511227531cc335353c54c3cbbaa11d0b80e5cb117478e144436c13cd05495b67af2e8950480ed54dbdabcdcef497c90fdb9814e88fe5978e1d56ce09f2cf.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_d57da9abfef16337e5bc44c4fc6488de258896ce8a4d42e1b53467f701a60ad499eb48d8ae790779e6b4b29bd016713138cd7ba352bce5724e2d3fe05d638b27.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_edc0e9ef106cc9ef7edd8033c5c6fcff6dc09ee901fd07f4b90a16d9345b35a06534f639e018a64baaf9384eee1df305570c1ecad747f41b787b89f53839962b.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_bc2182bb3de51847c8685df18692deda654dbf90fb01b503eb1bb0b68b879a051b91f30a9210ed0b2ba47c730db14b159cd9391ffdcd7117de397edd18366360.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_dccc492dbbfdac33d1411f9df909e849c7268fcf99b43007f278cde3a0adc0ae00e8cae5ec81cf255b9a6eae74e239ba1fa935572af77173219cb081f7d2327d.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_00bacf9e36181aac2b666d110cd9d82257f846766e7041b2d7b3c909b458982931ccc9b203e37098fbdfcf43ca359cf04e3824a724a6789fc204196d3a72ad29.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_f0e1965892740a5d2c85e6f061bbbe7d13d5e9f5fee478c1c4b76c50a01e23ebf5cad8e5eb52707ff44dbb74c43fef133d6199f16f3bc72c8f3065687f394559.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_aa5a5d229b421633f4247380e1e8c0a4854f82efb35d13a5b07b7b8fbe22e98842a580f063e5965345a51c477a7f5c2585edf8dd7d896b2438dc61f91d8d970c.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_bb8058a9e234a7ffaa98891b1df7f6b8e67410e6984568b151daa05113b8c7f89d7b5918ae73f020998a16f7f5a087a13d6a9a5e5d7c301e2ca12fd9d1f8d177.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_647fb67570c6108fb10ae6785a1abdbecac99ffcf80351d0bef17c3cf783dce497b1895fcdaae997dacc72c359fbfb128cc1540dd7df56deb4961e1cd4b22636.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_f7a298a0f1f754623fe3b30f6910ce2c1373f715450750bd7a391571812b00df1917e2be90df6c4efc54dbdfda8616278a574dea02ba2c7a31992768df8db334.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_df30604d5842ef29888c3c1881220dc6d3f8854666d94f0680c5f38aa643c5fb79b10eb9f10998d8856eb24ca265783195937434fd6c2bb8e4846df0277a7fb7.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_f17fe6fb0993f1703181d7ae9e9ea570f3d33a43afd6f2a4567daa1a6745698c7b8193dc72d50991d2dd87cd3dcf663959206607d193a9b57926d061a1f50aef.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_945dcbab2c2a131f3c90f4fb91776b76066d589f84fb55bff25cd5d79a56218000616bfca1f0af9a74f32348693707af49e8fe624de8aa34f1e1c5b6a25709cf.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_65820d252e1b93596de6697fd5f02483f3e2524a0696c7d698b64745edb32bf5831a90e556842f5f88c8209766cc78ca3a41cf783d20236a9f90d4a7ea7b3e72.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_7286884797a1210857e2a36f8ab46604b0034b6abf512380447a5763c873db6a72b8547f660053de0ea69faef1eb64878f39ff4b0ea86c963efab95764a3bf5b.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_cbcf6c279ac6c6a25ae138bf964e64a5fd90d22dcdf8a53b6fe7b72cefa51063bfb0181a6e50dd2acdcae2795619887d1d83b10461e44e5103be756f2588d837.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_47965bc586b95810c925b9df3314e0c9a5cd121e70ca0831f87df0bc034695de4f83ecf2def86f737e14614ee138794473cf32cd3082a5d38db9dec0c1f266fa.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_12aa201cea075846d266536aa222d64d4088b851d87f55dac5e611b77add6826c8ebc6e82650fcd1a9e88a05a0072dedd195719c5f64cd4580a0acd8aee05d92.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_7859317dea28a85c983d7b2a933704b193600b52929d2d894deae21a5d78f1f9715214d4c2ed1b925e9183146806725621d586779705dea3b651260eb53a2f8a.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_ba908905616a17c43311d27fad46edbbbc4e8b6f8e9ff2739a83eecd0ebbbc43068e2702191f77618b5ec19c13659282966f90d4e41737a774307360137eb5e5.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_d87ea86dd0e7ecdd5fe7a5bb67becf943e57c3add866b456034d51663d099031bd563e12f61fdccc044969adf938a8584ed22ccd401ab8b669e20e4f92fb54e8.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_35311c3d71a3605fad4e1d6b50f3911311cdcc46418bdf56d6d0308a75a69585269ee7582a335e29989adf308fa1a81a10a2c2d4e257e9d680447a4996f6269e.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_f4fc182ef03c12e9dcadd6febc3dbaa4a29134469057ca9e8ec0be2f2de29a494514ff4b59798e74debf26f78b2df2b3e2665c69b77035761fb463b783202915.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_85c0f2769456e60153b0fd8364b82a035da53384f62de342d9bdca806f3f1ea56486919a00497a18d457949c82bf8bfacc4423fc332074ddf71a49a8fe628fff.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_67f99bef3678c549a14b5f2ff790cce6aba338dca29020755444231b45fa0f980f795e3658496ba70739a099b47b22bc2eab564343ac6132309de3adbbae3455.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_09eecfdd96206ed13830b4b93cfb2cc75cd38083671a34194437b5734b5bb38712209dc335b07e3266ceb3c3a44a155b9bbe5f3e0e1105b19dd45d3def76f020.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_4c089fbdb88e3b624a6f884d3ba1bf606f003bfcd3742376d0d353cd62181dc663aa3811a56361c3100de488fc4d6595a50de2b26f058921ba74f5f2c1b5be00.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_897ff6ac314c5f5e0f496c6af624bd9abf296a02cb5aeb850b9220b6dc3ce2fc4004cb02ed8b59d59d4b9c9d90f050d6eebc1d08ecaebab2f671f7d9367e6410.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_67d1e619e71d36ae00ddcf85ee18628bb4eb64fcb3d6119b463e75cb987013420a21136d19cd03e6634ccc01cfa9af4a357930e4cf6900953b7812efb4f249fb.js