ORA-06503: PL/SQL Function Returned Without Value
ORA-06503 is a runtime error thrown by Oracle when a PL/SQL function completes execution without hitting a RETURN statement that provides a value to the caller. Every function in Oracle PL/SQL must return a value through every possible execution path — if even one path exits without a RETURN, this error will be raised. It commonly surfaces in production when edge-case data triggers a code branch that developers never anticipated during testing.
Top 3 Causes
1. Missing RETURN in Conditional Branches
The most frequent cause. When using IF-ELSIF without a final ELSE clause, certain inputs can fall through without hitting any RETURN.
Broken code:
CREATE OR REPLACE FUNCTION get_discount(p_type IN VARCHAR2) RETURN NUMBER IS
BEGIN
IF p_type = 'GOLD' THEN
RETURN 0.20;
ELSIF p_type = 'SILVER' THEN
RETURN 0.10;
-- No ELSE: if p_type is 'BRONZE' or NULL → ORA-06503!
END IF;
END;
/
Fixed code:
CREATE OR REPLACE FUNCTION get_discount(p_type IN VARCHAR2) RETURN NUMBER IS
BEGIN
IF p_type = 'GOLD' THEN
RETURN 0.20;
ELSIF p_type = 'SILVER' THEN
RETURN 0.10;
ELSE
RETURN 0.05; -- Always covers remaining cases
END IF;
END;
/
2. No RETURN in the EXCEPTION Block
When an exception is caught and handled, the function still needs to return a value. Developers often forget to add a RETURN inside EXCEPTION handlers.
Broken code:
CREATE OR REPLACE FUNCTION get_salary(p_id IN NUMBER) RETURN NUMBER IS
v_sal NUMBER;
BEGIN
SELECT salary INTO v_sal FROM employees WHERE emp_id = p_id;
RETURN v_sal;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Not found.');
-- Missing RETURN → ORA-06503 raised here!
END;
/
Fixed code:
CREATE OR REPLACE FUNCTION get_salary(p_id IN NUMBER) RETURN NUMBER IS
v_sal NUMBER;
BEGIN
SELECT salary INTO v_sal FROM employees WHERE emp_id = p_id;
RETURN v_sal;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Not found.');
RETURN 0; -- Explicit return value
WHEN OTHERS THEN
RETURN NULL; -- Always return something
END;
/
3. RETURN Only Inside a LOOP
If the only RETURN statement lives inside a loop, and the loop body never executes (empty result set or condition never met), the function exits without returning any value.
Broken code:
CREATE OR REPLACE FUNCTION get_max_bonus(p_dept IN NUMBER) RETURN NUMBER IS
BEGIN
FOR r IN (SELECT bonus FROM employees
WHERE dept_id = p_dept AND bonus > 1000
ORDER BY bonus DESC) LOOP
RETURN r.bonus; -- Never reached if no qualifying rows!
END LOOP;
-- No fallback RETURN → ORA-06503!
END;
/
Fixed code:
CREATE OR REPLACE FUNCTION get_max_bonus(p_dept IN NUMBER) RETURN NUMBER IS
BEGIN
FOR r IN (SELECT bonus FROM employees
WHERE dept_id = p_dept AND bonus > 1000
ORDER BY bonus DESC) LOOP
RETURN r.bonus;
END LOOP;
RETURN 0; -- Fallback RETURN after the loop
END;
/
Quick Fix Solutions
-
Add a final
RETURNas the last statement of every function, regardless of logic above it. -
Initialize a return variable at the top and use a single
RETURN v_resultat the end. -
Always add
RETURNinside every EXCEPTION handler — even if returningNULL.
-- Recommended safe function template
CREATE OR REPLACE FUNCTION safe_function(p_input IN VARCHAR2) RETURN VARCHAR2 IS
v_result VARCHAR2(200) := NULL; -- Default value set upfront
BEGIN
IF p_input IS NOT NULL THEN
v_result := UPPER(p_input);
END IF;
RETURN v_result; -- Single exit point
EXCEPTION
WHEN OTHERS THEN
RETURN NULL; -- Always return in exception block
END;
/
Prevention Tips
-
Adopt a single-exit-point pattern: Assign results to a local variable throughout your logic, and use only one
RETURN v_resultat the very end of the function body. - Write unit tests for edge cases: Use frameworks like utPLSQL to test NULL inputs, empty cursors, and unexpected values before deploying to production. Catching ORA-06503 in a test environment is far cheaper than troubleshooting it in production.
Related Errors
| Error Code | Description |
|---|---|
| ORA-06502 | Value/type mismatch on RETURN |
| ORA-06550 | Compile-time PL/SQL error (static RETURN check) |
| ORA-04063 | Object has compilation errors |
📖 Want a more detailed guide?
Check out the full in-depth version (Korean) on oraerror.com — includes detailed analysis, additional SQL examples, and prevention tips.
Top comments (0)