Calling a stored procedure¶
You can call a stored procedure using the SQL CALL command.
In order for a user to call a stored procedure, the user’s role must have the USAGE privilege for the stored procedure.
Once you have the privileges to call the stored procedure, you can use a CALL statement to call the stored procedure.
Note
To both create and call an anonymous procedure, use CALL (with anonymous procedure). Creating and calling an anonymous procedure does not require a role with CREATE PROCEDURE schema privileges.
Specifying the arguments¶
If the stored procedure has arguments, you can specify those arguments by name or by position.
For example, the following stored procedure accepts three arguments:
CREATE OR REPLACE PROCEDURE sp_concatenate_strings(
first_arg VARCHAR,
second_arg VARCHAR,
third_arg VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
BEGIN
RETURN first_arg || second_arg || third_arg;
END;
$$;
When calling the procedure, you can specify the arguments by name:
CALL sp_concatenate_strings(
first_arg => 'one',
second_arg => 'two',
third_arg => 'three');
+------------------------+
| SP_CONCATENATE_STRINGS |
|------------------------|
| onetwothree |
+------------------------+
If you specify the arguments by name, you do not need to specify the arguments in any particular order:
CALL sp_concatenate_strings(
third_arg => 'three',
first_arg => 'one',
second_arg => 'two');
+------------------------+
| SP_CONCATENATE_STRINGS |
|------------------------|
| onetwothree |
+------------------------+
You can also specify the arguments by position:
CALL sp_concatenate_strings(
'one',
'two',
'three');
+------------------------+
| SP_CONCATENATE_STRINGS |
|------------------------|
| onetwothree |
+------------------------+
Note the following:
You must either specify all arguments by name or by position. You cannot specify some of the arguments by name and other arguments by position.
When specifying an argument by name, you cannot use double quotes around the argument name.
If two functions or two procedures have the same name but different argument types, you can use the argument names to specify which function or procedure to execute, if the argument names are different. Refer to Overloading procedures and functions.
Specifying optional arguments¶
If the stored procedure has optional arguments, you can omit the optional arguments in the call. Each optional argument has a default value that is used when the argument is omitted.
For example, the following stored procedure has one required argument and two optional arguments. Each optional argument has a default value.
CREATE OR REPLACE PROCEDURE build_string_proc(
word VARCHAR,
prefix VARCHAR DEFAULT 'pre-',
suffix VARCHAR DEFAULT '-post'
)
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
BEGIN
RETURN prefix || word || suffix;
END;
$$
;
You can omit any of the optional arguments in the call. When you omit an argument, the default value of the argument is used.
CALL build_string_proc('hello');
+-------------------+
| BUILD_STRING_PROC |
|-------------------|
| pre-hello-post |
+-------------------+
CALL build_string_proc('hello', 'before-');
+-------------------+
| BUILD_STRING_PROC |
|-------------------|
| before-hello-post |
+-------------------+
If you need to omit an optional argument and specify another optional argument that appears after the omitted argument in the signature, use named arguments, rather than positional arguments.
For example, suppose that you want to omit the prefix
argument and specify the suffix
argument. The suffix
argument
appears after the prefix
in the signature, so you must specify the arguments by name:
CALL build_string_proc(word => 'hello', suffix => '-after');
+-------------------+
| BUILD_STRING_PROC |
|-------------------|
| pre-hello-after |
+-------------------+
Examples¶
To execute a stored procedure, use a CALL statement. For example:
CALL stproc1(5.14::FLOAT);
Each argument to a stored procedure can be a general expression:
CALL stproc1(2 * 5.14::FLOAT);
An argument can be a subquery:
CALL stproc1(SELECT COUNT(*) FROM stproc_test_table1);
You can call only one stored procedure per CALL statement. For example, the following statement fails:
CALL proc1(1), proc2(2); -- Not allowed
Also, you cannot use a stored procedure CALL as part of an expression. For example, all the following statements fail:
CALL proc1(1) + proc1(2); -- Not allowed
CALL proc1(1) + 1; -- Not allowed
CALL proc1(proc2(x)); -- Not allowed
SELECT * FROM (call proc1(1)); -- Not allowed
However, inside a stored procedure, the stored procedure can call another stored procedure, or call itself recursively.
Caution
Nested calls can exceed the maximum allowed stack depth, so be careful when nesting calls, especially when using recursion.