Create Demo table
create table employees(emp_no number, name varchar2(30))
Table created.
Populate Demo table with 1000 records
begin
for i in 1..1000 loop
insert into employees values (i,'Employee'||i);
end loop;
commit;
end;
Create s sleep procedure
CREATE OR REPLACE PROCEDURE sleep(p_milli_seconds IN NUMBER) IS
l_date DATE := SYSDATE;
l_differen_in_milli_seconds NUMBER;
BEGIN
LOOP
SELECT SYSDATE - l_date INTO l_differen_in_milli_seconds FROM dual;
EXIT WHEN l_differen_in_milli_seconds >((1 / 24 / 60 / 60 / 1000) * p_milli_seconds);
END LOOP;
END sleep;
Create function to fetch data
CREATE OR REPLACE FUNCTION get_emp_no(p_emp_name IN VARCHAR2) RETURN NUMBER IS
l_empno NUMBER;
BEGIN
SELECT emp_no INTO l_empno FROM employees WHERE NAME = p_emp_name;
sleep(100);/*Introducing a delay of 100 milliseconds to demonstrate*/
RETURN l_empno;
END get_emp_no;
Call the function multiple times
DECLARE
emp_no NUMBER;
l_date date :=sysdate;
l_execution_seconds number ;
begin
/* Call the function 20 times, but only with 5 different values (logic introduced with mod operator below)*/
for i in 1..20 loop
emp_no:= get_emp_no ('Employee'||((i MOD 5)+1));
end loop;
l_execution_seconds := round((sysdate-l_date)*24*60*60,2);
dbms_output.put_line ('Execution complete in '|| l_execution_seconds || ' seconds');
end;
Add RESULT_CACHE clause to the function
CREATE OR REPLACE FUNCTION get_emp_no(p_emp_name IN VARCHAR2) RETURN NUMBER RESULT_CACHE IS
l_empno NUMBER;
BEGIN
SELECT emp_no INTO l_empno FROM employees WHERE NAME = p_emp_name;
sleep(100);/*Introducing a delay of 100 milliseconds to demonstrate*/
RETURN l_empno;
END get_emp_no;
Test the Result Cache function
DECLARE
emp_no NUMBER;
l_date date :=sysdate;
l_execution_seconds number ;
begin
/* Call the function 20 times, but only with 5 different values (logic introduced with mod operator below)*/
for i in 1..20 loop
emp_no:= get_emp_no ('Employee'||((i MOD 5)+1));
end loop;
l_execution_seconds := round((sysdate-l_date)*24*60*60,2);
dbms_output.put_line ('Execution complete in '|| l_execution_seconds || ' seconds');
end;