-- simple DBMS_EPG rem create and authorize dad as SCOTT -- as SYS: BEGIN DBMS_EPG.create_dad ( dad_name => 'hello' , path => '/hello/*' ); END; / -- as SCOTT: begin DBMS_EPG.AUTHORIZE_DAD('hello'); end; / create or replace package dashboard as procedure departments; end; create or replace package body dashboard as procedure write_javascript ( p_data in varchar2 , p_labels in varchar2 ) is begin htp.p(''); end; procedure departments as l_data varchar2(4000); l_labels varchar2(4000); begin htp.p('Departments Dashboard'); select '['||listagg( '"'||dname||'"', ',') within group (order by sumsal desc) ||']' as data , '['||listagg( nvl(sumsal,0), ',') within group (order by sumsal desc) ||']' as labels into l_labels, l_data from ( select dname , sum(sal) sumsal from emp right outer join dept using (deptno) group by dname ) ; write_javascript(l_data, l_labels); htp.p(''); htp.p('

Salary distribution across departments

'); htp.p(''); htp.p(''); end departments; end dashboard; -- url on local XE: http://127.0.0.1:8080/hello/dashboard/departments -- other ports can be configured with EXECUTE dbms_xdb.SETHTTPPORT(2100);