SQL Stored Procedure: Syntax, Usage, and Examples
An SQL stored procedure is a precompiled set of SQL statements stored in the database. It allows for reusable, modular code that improves performance and simplifies complex database operations. Stored procedures can take parameters, execute queries, and return results.
How to Use an SQL Stored Procedure
A stored procedure is created using the CREATE PROCEDURE
statement and executed with the EXEC
or CALL
command, depending on the database system.
Creating a Stored Procedure
sql
CREATE PROCEDURE GetAllUsers()
AS
BEGIN
SELECT * FROM users;
END;
Executing a Stored Procedure
In SQL Server:
sql
EXEC GetAllUsers;
In MySQL and PostgreSQL:
sql
CALL GetAllUsers();
Stored Procedure with Parameters
Stored procedures can accept input parameters for dynamic queries.
sql
CREATE PROCEDURE GetUserByID(@UserID INT)
AS
BEGIN
SELECT * FROM users WHERE id = @UserID;
END;
To execute it:
sql
EXEC GetUserByID 5;
This retrieves the user with id = 5
.
When to Use an SQL Stored Procedure
Stored procedures improve performance and code reusability while ensuring secure database interactions.
Reusable Business Logic
Instead of writing the same SQL query multiple times, store frequently used queries in a stored procedure.
sql
CREATE PROCEDURE GetActiveUsers()
AS
BEGIN
SELECT * FROM users WHERE status = 'active';
END;
Now, any part of the application can call EXEC GetActiveUsers
instead of rewriting the query.
Transaction Management
Stored procedures help maintain data consistency in complex transactions.
sql
CREATE PROCEDURE TransferFunds(@FromAccount INT, @ToAccount INT, @Amount DECIMAL(10,2))
AS
BEGIN
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - @Amount WHERE id = @FromAccount;
UPDATE accounts SET balance = balance + @Amount WHERE id = @ToAccount;
COMMIT;
END;
If one update fails, the entire transaction rolls back.
Improved Security
Using stored procedures restricts direct database access. Applications can call the procedure without having permission to modify tables directly.
sql
GRANT EXECUTE ON GetUserByID TO app_user;
This allows app_user
to call GetUserByID
but not run SELECT * FROM users
directly.
Examples of SQL Stored Procedures
Inserting Data Using a Stored Procedure
sql
CREATE PROCEDURE AddUser(@Name VARCHAR(50), @Email VARCHAR(100))
AS
BEGIN
INSERT INTO users (name, email) VALUES (@Name, @Email);
END;
Execute it:
sql
EXEC AddUser 'Alice', 'alice@example.com';
Updating Data Using a Stored Procedure
sql
CREATE PROCEDURE UpdateUserEmail(@UserID INT, @NewEmail VARCHAR(100))
AS
BEGIN
UPDATE users SET email = @NewEmail WHERE id = @UserID;
END;
Execute it:
sql
EXEC UpdateUserEmail 5, 'newemail@example.com';
Deleting Data Using a Stored Procedure
sql
CREATE PROCEDURE DeleteUser(@UserID INT)
AS
BEGIN
DELETE FROM users WHERE id = @UserID;
END;
Execute it:
sql
EXEC DeleteUser 10;
Learn More About SQL Stored Procedures
Stored Procedures vs. Regular Queries
Stored procedures have advantages over regular queries:
- Performance: The database compiles and optimizes stored procedures once, whereas regular queries run from scratch each time.
- Security: Users can execute a stored procedure without direct table access.
- Code Reusability: Procedures eliminate the need to rewrite complex queries in different places.
Returning Values from Stored Procedures
Some stored procedures return values, often using OUTPUT
parameters.
sql
CREATE PROCEDURE GetUserCount(@TotalUsers INT OUTPUT)
AS
BEGIN
SELECT @TotalUsers = COUNT(*) FROM users;
END;
To call it:
sql
DECLARE @UserCount INT;
EXEC GetUserCount @UserCount OUTPUT;
PRINT @UserCount;
Handling Errors in Stored Procedures
Use TRY...CATCH
blocks to handle errors.
sql
CREATE PROCEDURE SafeTransfer(@FromAccount INT, @ToAccount INT, @Amount DECIMAL(10,2))
AS
BEGIN
BEGIN TRANSACTION;
BEGIN TRY
UPDATE accounts SET balance = balance - @Amount WHERE id = @FromAccount;
UPDATE accounts SET balance = balance + @Amount WHERE id = @ToAccount;
COMMIT;
END TRY
BEGIN CATCH
ROLLBACK;
PRINT 'Error occurred. Transaction rolled back.';
END CATCH;
END;
If an error occurs, ROLLBACK
ensures that no changes are made.
Nested Stored Procedures
A stored procedure can call another stored procedure.
sql
CREATE PROCEDURE GetUserDetails(@UserID INT)
AS
BEGIN
EXEC GetUserByID @UserID;
END;
This allows modular execution of stored procedures.
Stored Procedures with Loops
Stored procedures can include loops, useful for batch processing.
sql
CREATE PROCEDURE PrintNumbers(@Max INT)
AS
BEGIN
DECLARE @Counter INT = 1;
WHILE @Counter <= @Max
BEGIN
PRINT @Counter;
SET @Counter = @Counter + 1;
END;
END;
Executing EXEC PrintNumbers 5;
prints numbers from 1 to 5.