Pretty common oracle error. Raised when you are trying to fetch data
from sql into a pl/sl variable and the sql does not return any data.
>> Using the data from this schema
What to do next
1. Re-Raise it with a error message that provides more context.
2. Suppress the error if this is a valid business scenario and do the necessary processing.
Example CASE : If a user has a preference to display the numbers in local currency, convert the amount, else, display in USD.
3. Functions, by design, do not raise the NO_DATA_FOUND exception, instead they return null to the calling program.
>> Using the data from this schema
SQL> SELECT COUNT(*) FROM scott_emp WHERE empno = 9999; COUNT(*) ---------- 0 SQL> DECLARE l_ename scott_emp.ename%TYPE; l_empno scott_emp.empno%TYPE := 9999; BEGIN SELECT ename INTO l_ename FROM scott_emp WHERE empno = l_empno; END; / DECLARE * ERROR at line 1: ORA-01403: no DATA found ORA-06512: at line 5
1. Re-Raise it with a error message that provides more context.
DECLARE l_ename scott_emp.ename%TYPE; l_empno scott_emp.empno%TYPE := 9999; BEGIN SELECT ename INTO l_ename FROM scott_emp WHERE empno = l_empno; EXCEPTION WHEN no_data_found THEN raise_application_error(-20001,'No employee exists with employee id ' || l_empno); END; / ERROR at line 1: ORA-20001: No employee EXISTS WITH employee id 9999 ORA-06512: at line 11
Example CASE : If a user has a preference to display the numbers in local currency, convert the amount, else, display in USD.
CREATE OR REPLACE PROCEDURE p_calc_sales_metrics( p_user_id IN users.user_id%TYPE, p_profit IN net_sales.profit%TYPE ) AS l_pref_currency user_prefs.pref_currency%TYPE; l_profit_local_amt net_sales.profit%TYPE; BEGIN ---other code BEGIN SELECT pref_currency INTO l_pref_currency WHERE user_id = p_user_id l_cur_conv_factor := get_conv_rate('USD',l_pref_currency); exception WHEN no_data_found THEN l_cur_conv_factor := 1; END; --- other code.. l_profit_local_amt := p_profit * l_cur_conv_factor; END; /
CREATE OR REPLACE FUNCTION STGDATA.f_get_ename( i_empno IN scott_emp.empno%TYPE ) RETURN scott_emp.ename%TYPE AS l_ename scott_emp.ename%TYPE; BEGIN SELECT ename INTO l_ename FROM scott_emp WHERE empno = i_empno; RETURN l_ename; END; / SQL> SELECT f_get_ename(7839) FROM dual; F_GET_ENAME(7839) --------------------- KING SQL> SELECT f_get_ename(9999) FROM dual; F_GET_ENAME(9999) ------------------------------------------- SQL> SELECT nvl(f_get_ename(9999),'NULL RETURNED') FROM dual; NVL(F_GET_ENAME(9999),'NULLRETURNED') ------------------------------------------------ NULL RETURNED
0 comments:
Post a Comment