How to create stored procedure that returns query result?
As of a view I suggested in a comment: as you already have a SELECT statement, it is a matter of a few letters to convert it to a view. Here's an example:

SQL&gt; select d.deptno, d.dname, e.empno, e.ename, e.job, e.sal
  2  from dept d join emp e on e.deptno = d.deptno;

    DEPTNO DNAME               EMPNO ENAME      JOB              SAL
---------- -------------- ---------- ---------- --------- ----------
        10 ACCOUNTING           7839 KING       PRESIDENT       5000
        10 ACCOUNTING           7782 CLARK      MANAGER         2450
        10 ACCOUNTING           7934 MILLER     CLERK           1300
        20 RESEARCH             7902 FORD       ANALYST         3000
        20 RESEARCH             7369 SMITH      CLERK            800
        20 RESEARCH             7566 JONES      MANAGER         2975
        30 SALES                7900 JAMES      CLERK            950
        30 SALES                7844 TURNER     SALESMAN        1500
        30 SALES                7654 MARTIN     SALESMAN        1250
        30 SALES                7521 WARD       SALESMAN        1250
        30 SALES                7499 ALLEN      SALESMAN        1600
        30 SALES                7698 BLAKE      MANAGER         2850

12 rows selected.

SQL&gt;


Convert it to a view:

SQL&gt; create or replace view v_emps as
  2  select d.deptno, d.dname, e.empno, e.ename, e.job, e.sal
  3  from dept d join emp e on e.deptno = d.deptno;

View created.

SQL&gt;


See? Lines 2 and 3 are what you already have. 

Now, when you want to select something, you'd use a view instead of the same SELECT statement over and over again. For example:

SQL&gt; select dname, sum(sal) from v_emps group by dname;

DNAME            SUM(SAL)
-------------- ----------
ACCOUNTING           8750
RESEARCH             6775
SALES                9400

SQL&gt; select job, count(*) from v_emps group by job;

JOB         COUNT(*)
--------- ----------
CLERK              3
SALESMAN           4
PRESIDENT          1
MANAGER            3
ANALYST            1

SQL&gt; select ename from v_emps where deptno = 20;

ENAME
----------
SMITH
JONES
FORD

SQL&gt;


Quite simple, isn't it? 

A view is nothing but a stored query - it doesn't occupy any space, it always returns current data. True - if it is complex and deals with A LOT of data, it may be slow; but then performance tuning takes place. 

I'd suggest you to try it; won't cost much, as you've seen - just a simple create or replace view v_emps ...