Difficulty Understanding Oracle DQL Procedures and Functions Coming from T-SQL
Oracle supports "table valued functions" as well. However they need a lot more boiler plate code than one would like. The main (annoying) "problem" is, that you need to explicitly define a type that can be returned: 

create type stuff_type as object
(
  customer varchar(50),
  widgets_purchased number
)
/

create stuff_list as table of stuff_type
/


create function get_stuff(p_start_date date, p_end_date date)
   return stuff_list
   pipelined
as
begin
  for rec in (select customer, sum(widgets_purchased) as widgets_purchased
              from widgetsales
              where transactiondate &gt;= p_start_date
                and transactiondate &lt;= p_end_date
              group by customer) 
  loop
    pipe row stuff_type(rec.customer, rec.widgets_purchased);     
  end loop;
end;
/


The usage is also a bit different:

select *
from table(get_stuff(current_date - 7, current_date));


Some more examples and insights can be found here: https://oracle-base.com/articles/misc/pipelined-table-functions



Starting with Oracle 12.1 you can also use implicit results:

create or replace procedure get_stuff(p_start_date date, p_end_date date)
as
  c1 SYS_REFCURSOR;  
BEGIN
  OPEN c1 FOR 
    select customer, sum(widgets_purchased) as widgets_purchased
    from widgetsales
    where transactiondate &gt;= p_start_date
      and transactiondate &lt;= p_end_date
    group by customer;

  DBMS_SQL.RETURN_RESULT(c1);
END;
/ 


Some more details and examples for implicit results: https://oracle-base.com/articles/12c/implicit-statement-results-12cr1