-- get URI by substituting values for placeholders select uri_template_util_pkg.expand('/employees/{department}/{id}', t_str_array('Accounting', '1234')) from dual -- determine which URI template matches the URI -- note: put most specific URI templates first select uri_template_util_pkg.match('/employees/Accounting/1234', t_str_array('/employees/{department}/list', '/employees/{department}/{id}', '/employees/{id}') ) as the_first_match from dual -- get name/value pairs from URI declare l_values uri_template_util_pkg.t_dictionary; l_name varchar2(255); begin debug_pkg.debug_on; l_values := uri_template_util_pkg.parse ('/employees/{department}/{id}', '/employees/Accounting/1234'); l_name := l_values.first; while l_name is not null loop debug_pkg.printf('%1 = %2', l_name, l_values(l_name)); l_name := l_values.next(l_name); end loop; end; -- combined example -- in real-world usage, you would probably get the URI from an actual web request (for example through mod_plsql) declare l_uri varchar2(255); l_template varchar2(255); l_values uri_template_util_pkg.t_dictionary; l_name varchar2(255); begin debug_pkg.debug_on; l_uri := uri_template_util_pkg.expand('/employees/{department}/{id}', t_str_array('Accounting', '1234')); debug_pkg.printf('expanded uri = %1', l_uri); l_template := uri_template_util_pkg.match(l_uri, t_str_array('/employees/{department}/list', '/employees/{department}/{id}', '/employees/{id}')); debug_pkg.printf('the uri %1 matches the template %2', l_uri, l_template); l_values := uri_template_util_pkg.parse (l_template, l_uri); l_name := l_values.first; while l_name is not null loop debug_pkg.printf('%1 = %2', l_name, l_values(l_name)); l_name := l_values.next(l_name); end loop; end;