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.
IT Tutorial IT Tutorial | Oracle DBA | SQL Server, Goldengate, Exadata, Big Data, Data ScienceTutorial