Hi folks,
A user-defined function is a set of PL/SQL statements you can call by name. Functions are very similar to procedures, except that a function returns a value to the environment in which it is called.
Syntax
CREATE OR REPLACE FUNCTION <name> (<paramete1_name parameter1_type, .. ,parametern_name parametern_type>) RETURN <return type> AS --local variables(optional) BEGIN --your code END <name>;
Example 1
The following example is a function responsible to return the next available city id from the table city. It is a simple algorithm, but enough to demonstrate the usage of this feature.
You can use the following script to create and populate this table. create_and_populate_tables_city_and_country
Function
CREATE OR REPLACE FUNCTION F_GET_NEW_CITY_ID RETURN NUMBER AS v_new_id number := 0; v_is_an_used_id varchar2(1) := 'N'; BEGIN select max(nvl(id, 0)) + 1 into v_new_id from city; LOOP BEGIN select 'Y' into v_is_an_used_id from city where id = v_new_id; EXCEPTION WHEN NO_DATA_FOUND THEN v_is_an_used_id := 'N'; END; EXIT WHEN v_is_an_used_id = 'N'; v_new_id := v_new_id +1; END LOOP; RETURN v_new_id; END F_GET_NEW_CITY_ID;
How to test/execute in an anonymous block
No matter where you are executing or calling a function, you always must use a declared variable to receive the return from this function.
DECLARE v_Return NUMBER; BEGIN v_Return := F_GET_NEW_CITY_ID; DBMS_OUTPUT.PUT_LINE('v_Return = ' || v_Return); END;
Result
Example 2
Function
create or replace FUNCTION F_CHECK_CITY_NAME (p_city_name IN VARCHAR2) RETURN BOOLEAN AS v_is_an_used_id varchar2(1) := 'N'; BEGIN SELECT NVL('Y', 'N') INTO v_is_an_used_id FROM CITY WHERE UPPER(name) = UPPER(p_city_name); IF v_is_an_used_id = 'Y' THEN RETURN TRUE; ELSE RETURN FALSE; END IF; END F_CHECK_CITY_NAME;
How to test/execute in an anonymous block
DECLARE P_CITY_NAME VARCHAR2(200); v_Return BOOLEAN; BEGIN P_CITY_NAME := 'CURITIBA'; v_Return := F_CHECK_CITY_NAME( P_CITY_NAME => P_CITY_NAME ); IF (v_Return) THEN DBMS_OUTPUT.PUT_LINE('v_Return = ' || 'TRUE'); ELSE DBMS_OUTPUT.PUT_LINE('v_Return = ' || 'FALSE'); END IF; END;
Result
This post is part of a series about the most common structures in PL/SQL. You can check the rest of them in the link below.
Please write down in the comments any further questions you may have. I’ll be happy to help you.