Oracle SQL Stored Procedures Call vs. Execute
Oracle SQL: CALL vs. EXECUTE for Stored Procedures

Explore the nuances of invoking Oracle stored procedures using the CALL
statement versus the EXECUTE
command in SQL*Plus and SQL Developer. Understand their differences, use cases, and best practices.
In Oracle SQL, stored procedures are powerful tools for encapsulating business logic, improving performance, and enhancing security. When it comes to executing these procedures, developers often encounter two primary methods: the CALL
statement and the EXECUTE
command (or its shorthand EXEC
). While both achieve the goal of running a stored procedure, they operate in slightly different contexts and have distinct implications. This article delves into these differences, providing clarity on when to use each method and why.
Understanding the CALL Statement
The CALL
statement is a standard SQL statement, part of the SQL/PSM (Persistent Stored Modules) standard. It is designed for invoking stored procedures and functions directly within SQL contexts, such as from other stored procedures, triggers, or even directly from a SQL client. When you use CALL
, Oracle's SQL engine processes it as a native SQL command. This means it can be used in environments where only SQL statements are expected, and it integrates seamlessly with SQL transaction management.
CREATE OR REPLACE PROCEDURE greet_user (p_username IN VARCHAR2)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello, ' || p_username || '!');
END;
/
-- Invoking with CALL
CALL greet_user('Alice');
-- Invoking a function with CALL (if it returns a value)
-- CALL my_function(arg1, arg2) INTO :result_variable;
Example of creating and invoking a stored procedure using the CALL
statement.
CALL
statement is particularly useful when you need to invoke a procedure from within another SQL statement or a PL/SQL block where EXECUTE
is not valid. It's also the more portable option across different SQL databases that support SQL/PSM.Understanding the EXECUTE Command
The EXECUTE
command (often abbreviated as EXEC
) is a SQLPlus and SQL Developer client-side command, not a standard SQL statement. It is a convenience command provided by these client tools to execute a PL/SQL block or a stored procedure. When you type EXECUTE my_procedure;
in SQLPlus, the client tool internally wraps this into an anonymous PL/SQL block and sends it to the Oracle database for execution. This is why EXECUTE
is typically followed by a procedure call without the CALL
keyword.
CREATE OR REPLACE PROCEDURE log_message (p_message IN VARCHAR2)
IS
BEGIN
INSERT INTO application_logs (log_date, message_text) VALUES (SYSDATE, p_message);
COMMIT;
END;
/
-- Invoking with EXECUTE (SQL*Plus/SQL Developer specific)
EXEC log_message('Application started successfully.');
-- This is what SQL*Plus/SQL Developer effectively sends to the database:
-- BEGIN
-- log_message('Application started successfully.');
-- END;
-- /
Example of creating and invoking a stored procedure using the EXECUTE
command.
EXECUTE
is a client-side command, it's not valid within PL/SQL blocks, triggers, or other SQL statements. It's primarily for interactive use in tools like SQL*Plus or SQL Developer.Key Differences and Use Cases
The fundamental difference lies in their origin and how they are processed. CALL
is a SQL standard statement processed by the database engine, while EXECUTE
is a client-side command that wraps your procedure call in an anonymous PL/SQL block before sending it to the database. This distinction dictates their appropriate use cases.
flowchart TD A[User Input: CALL greet_user('Alice')] --> B{Oracle SQL Engine} B --> C[Direct Procedure Execution] C --> D[Result] E[User Input: EXEC greet_user('Bob')] --> F{SQL*Plus/SQL Developer Client} F --> G["Client Wraps in PL/SQL: BEGIN greet_user('Bob'); END;"] G --> B B --> C C --> D
Flowchart illustrating the processing difference between CALL
and EXECUTE
.
Here's a summary of their differences:

Comparison of CALL
statement and EXECUTE
command.
When to Use Which
Choosing between CALL
and EXECUTE
depends on your context:
Use
CALL
when:- You are invoking a procedure from within a PL/SQL block (e.g., another procedure, function, or trigger).
- You are executing a procedure as part of a larger SQL script that might be run by a non-SQL*Plus client.
- You need to capture output parameters directly into host variables in some programming languages (though this is less common in pure SQL).
- You want to adhere strictly to SQL standards for maximum portability.
Use
EXECUTE
(orEXEC
) when:- You are interactively testing or running a procedure from SQL*Plus or SQL Developer.
- You need a quick and convenient way to execute a procedure without writing a full
BEGIN...END;
block.
In most interactive development scenarios using SQL*Plus or SQL Developer, EXECUTE
is the more common and convenient choice due to its brevity. However, for programmatic execution within the database or from applications, CALL
or direct PL/SQL block execution (BEGIN my_procedure; END;
) is preferred.
EXECUTE
is a client-specific command. If you copy a script containing EXEC
statements and try to run it in an environment that doesn't support SQL*Plus commands (e.g., a JDBC client executing raw SQL), it will fail. Always use CALL
or a BEGIN...END;
block for robust, portable code.