PLSQL: Cómo recojer valores checkbox de un formulario HTML

Cuando tenemos que recojer diversos valores de checkbox en un formulario HTML, normalmente nos encontramos con que el identificador del elemento HTML es el mismo, cosa que realiza una concatenación de valores por GET o POST con el mismo identificador. Algunos lenguajes de programación facilitan la recolección de dichos valores generando un array de valores (por ejemplo PHP). En el caso de PLSQL esta funcionalidad no está desarrollada por defecto, pero podemos escribir un código que nos realice la misma funcionalidad:

 
CREATE OR REPLACE PACKAGE pkg_checkboxes IS
 
TYPE chkArray IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;
PROCEDURE display_form;
PROCEDURE process_form(checkboxes IN VARCHAR2 DEFAULT NULL);
PROCEDURE process_form(checkboxes IN chkArray);
 
END pkg_checkboxes;
 
CREATE OR REPLACE PACKAGE BODY pkg_checkboxes IS
 
PROCEDURE display_form IS
BEGIN
htp.p('<html>');
htp.p('<head>');
htp.p('<title>Checkboxes Testing</title>');
htp.p('</head>');
htp.p('<body>');
htp.p('<form name="frmChk" method="post" action="cp_cpw_checkboxes.process_form">');
htp.p('<input type="checkbox" name="checkboxes" value="Japan" /> Japan
');
htp.p('<input type="checkbox" name="checkboxes" value="China" /> China
');
htp.p('<input type="checkbox" name="checkboxes" value="Russia" /> Russia
');
htp.p('<input type="checkbox" name="checkboxes" value="USA" /> USA
');
htp.p('<input type="checkbox" name="checkboxes" value="Canada" /> Canada
');
htp.p('
');
htp.p('<input type="submit" value="Submit" />');
htp.p('</form>');
htp.p('</body>');
htp.p('</html>');
END display_form;
 
PROCEDURE process_form(checkboxes IN VARCHAR2 DEFAULT NULL) IS
BEGIN
htp.p('You selected:
 
');
htp.p('
<ul>');
IF checkboxes IS NOT NULL THEN
htp.p('
	<li>'||checkboxes||'</li>
');
ELSE
htp.p('
	<li>No checkbox selected</li>
');
END IF;
htp.p('</ul>
');
END process_form;
 
PROCEDURE process_form(checkboxes IN chkArray) IS
BEGIN
htp.p('You selected:
 
');
htp.p('
<ul>');
FOR i IN 1..checkboxes.COUNT LOOP
htp.p('
	<li>'||checkboxes(i)||'</li>
');
END LOOP;
htp.p('</ul>
');
END process_form;
 
END pkg_checkboxes;

(Código obtenido de http://www.joelennon.com/?q=pl-sql-checkboxes)

Cómo cargar el entorno de portal en una sesión SQL

Si necesitamos acceder a las vistas de portal para realizar una query externa usando SQL plus o SQL Developer, necesitarem iniciar el entorno de Portal. Lo podemos hacer con la siguiente sentencia:

BEGIN
portal.wwctx_api_private.set_context( p_user_name => 'portal') ;
END;