OUT parameters let a database function return multiple values easily without using complex return types.
OUT parameters in PostgreSQL
Start learning this pattern below
Jump into concepts and practice - no test required
CREATE FUNCTION function_name(IN param1 type, OUT out_param1 type, OUT out_param2 type) RETURNS record AS $$ BEGIN -- function body out_param1 := value1; out_param2 := value2; END; $$ LANGUAGE plpgsql;
OUT parameters are declared in the function signature and act like variables inside the function.
The function automatically returns a record containing all OUT parameters.
CREATE FUNCTION get_full_name(IN user_id INT, OUT first_name TEXT, OUT last_name TEXT) RETURNS record AS $$ BEGIN SELECT fname, lname INTO first_name, last_name FROM users WHERE id = user_id; END; $$ LANGUAGE plpgsql;
CREATE FUNCTION calculate_stats(IN a INT, IN b INT, OUT sum INT, OUT product INT) RETURNS record AS $$ BEGIN sum := a + b; product := a * b; END; $$ LANGUAGE plpgsql;
This example creates a users table, inserts two users, defines a function with OUT parameters to get full name by user ID, and calls it.
CREATE TABLE users (id INT, fname TEXT, lname TEXT); INSERT INTO users VALUES (1, 'Alice', 'Smith'), (2, 'Bob', 'Jones'); CREATE FUNCTION get_full_name(IN user_id INT, OUT first_name TEXT, OUT last_name TEXT) RETURNS record AS $$ BEGIN SELECT fname, lname INTO first_name, last_name FROM users WHERE id = user_id; END; $$ LANGUAGE plpgsql; -- Call the function SELECT * FROM get_full_name(1);
You can call functions with OUT parameters using SELECT * FROM function_name(args);
If you have only OUT parameters and no IN parameters, you can call the function without arguments.
OUT parameters simplify returning multiple values without defining custom types.
OUT parameters let functions return multiple values easily.
They are declared in the function signature and act like output variables.
Use SELECT * FROM function_name(...) to get the results as columns.
Practice
OUT parameters in PostgreSQL functions?Solution
Step 1: Understand OUT parameters role
OUT parameters are used to return multiple values from a function as separate columns.Step 2: Compare with other options
Input variables are declared with IN, not OUT. Temporary tables and single return types are unrelated to OUT parameters.Final Answer:
To allow a function to return multiple values as columns -> Option DQuick Check:
OUT parameters = multiple return columns [OK]
- Confusing OUT with IN parameters
- Thinking OUT creates tables
- Assuming OUT returns a single value
Solution
Step 1: Check correct OUT parameter syntax
OUT parameters are declared inside the parameter list asOUT name type. CREATE FUNCTION f(OUT a INT) RETURNS RECORD AS $$ ... $$ LANGUAGE plpgsql; matches this.Step 2: Analyze other options
CREATE FUNCTION f(a INT OUT) RETURNS VOID AS $$ ... $$ LANGUAGE plpgsql; wrongly places OUT after type. CREATE FUNCTION f(a INT) RETURNS OUT INT AS $$ ... $$ LANGUAGE plpgsql; misuses RETURNS OUT. CREATE FUNCTION f(a INT) RETURNS TABLE(OUT a INT) AS $$ ... $$ LANGUAGE plpgsql; misuses RETURNS TABLE with OUT inside parentheses.Final Answer:
CREATE FUNCTION f(OUT a INT) RETURNS RECORD AS $$ ... $$ LANGUAGE plpgsql; -> Option BQuick Check:
OUT parameters declared as 'OUT name type' [OK]
- Placing OUT after the type
- Using RETURNS OUT instead of parameter list
- Confusing RETURNS TABLE syntax
CREATE FUNCTION get_person() RETURNS TABLE(id INT, name TEXT) AS $$ BEGIN RETURN QUERY SELECT 1, 'Alice'; END; $$ LANGUAGE plpgsql;
What will be the output of
SELECT * FROM get_person();?Solution
Step 1: Understand RETURNS TABLE behavior
RETURNS TABLE defines OUT parameters implicitly, so the function returns rows with columns id and name.Step 2: Analyze the RETURN QUERY statement
The query returns one row with values (1, 'Alice'), so SELECT * FROM function returns that row.Final Answer:
One row with columns id=1 and name='Alice' -> Option AQuick Check:
RETURNS TABLE returns rows with named columns [OK]
- Thinking RETURNS TABLE needs explicit OUT keyword
- Expecting no rows or error
- Assuming single column record output
CREATE FUNCTION calc_sum(a INT, b INT, OUT result INT) AS $$ BEGIN result := a + b; END; $$ LANGUAGE plpgsql;
Which of the following calls will cause an error?
Solution
Step 1: Understand how OUT parameters affect function call
Functions with OUT parameters return a record, soSELECT * FROM calc_sum(2, 3);works and returns result column.Step 2: Analyze each call
SELECT calc_sum(2, 3); returns a record but as a single column, valid. SELECT result FROM calc_sum(2, 3); tries to select a column named 'result' directly from function call without FROM, which is invalid syntax. CALL calc_sum(2, 3, result_var); is invalid syntax for CALL with OUT parameters and will cause an error.Final Answer:
CALL calc_sum(2, 3, result_var); -> Option CQuick Check:
CALL with OUT parameters requires different syntax [OK]
- Selecting OUT column without FROM clause
- Using CALL incorrectly with OUT parameters
- Assuming function returns scalar value
Solution
Step 1: Check OUT parameter declaration and assignment
CREATE FUNCTION text_info(input TEXT, OUT len INT, OUT upper TEXT) AS $$ BEGIN len := length(input); upper := upper(input); END; $$ LANGUAGE plpgsql; declares OUT parameters in the signature and assigns values inside the function body, which is correct.Step 2: Compare other options
CREATE FUNCTION text_info(input TEXT) RETURNS TABLE(len INT, upper TEXT) AS $$ BEGIN len := length(input); upper := upper(input); END; $$ LANGUAGE plpgsql; uses RETURNS TABLE but does not assign values properly. CREATE FUNCTION text_info(input TEXT, OUT len INT, OUT upper TEXT) RETURNS RECORD AS $$ BEGIN len := length(input); upper := upper(input); END; $$ LANGUAGE plpgsql; mixes OUT parameters with RETURNS RECORD incorrectly. CREATE FUNCTION text_info(input TEXT) RETURNS RECORD AS $$ BEGIN RETURN QUERY SELECT length(input), upper(input); END; $$ LANGUAGE plpgsql; returns a record but does not use OUT parameters as requested.Final Answer:
CREATE FUNCTION text_info(input TEXT, OUT len INT, OUT upper TEXT) AS $$ BEGIN len := length(input); upper := upper(input); END; $$ LANGUAGE plpgsql; -> Option AQuick Check:
OUT params declared and assigned inside function [OK]
- Mixing RETURNS TABLE with OUT params incorrectly
- Not assigning OUT parameters inside function
- Using RETURNS RECORD without OUT params
