Hace algunos días en mi actual proyecto se presento la necesidad de mostrar la información de una cadena pero en forma de tabular.
Al principio no se me ocurría como, pero rascandole un poquito a google di con la solución, estoy trabajando bajo una 10g por lo que no estoy seguro que funcione con versiones anteriores de Oracle.
Primero creamos un “TYPE” que usara la función que después crearemos:
1 | CREATE OR REPLACE TYPE str2tblType AS TABLE OF VARCHAR2(500); |
Después creamos la función que se encarga de convertir la cadena a una tabla de datos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | CREATE OR REPLACE FUNCTION str2tbl( p_str IN VARCHAR2, p_delim IN VARCHAR2 DEFAULT ',' ) RETURN str2tblType PIPELINED AS l_str VARCHAR2(500) DEFAULT p_str||p_delim; l_n NUMBER; BEGIN LOOP l_n := INSTR( l_str, p_delim ); EXIT WHEN (NVL(l_n,0) = 0); pipe ROW( LTRIM(RTRIM(SUBSTR(l_str,1,l_n-1))) ); l_str := SUBSTR( l_str, l_n+1 ); END LOOP; RETURN; END; |
Por ultimo solo nos basta usarla:
1 | SELECT COLUMN_VALUE col FROM TABLE(str2tbl('a,b,c')); |
Como se darán cuenta utiliza cosas como los “TYPE” otra como “PIPELINED” y la función “table()” después del “from”, tal vez mas adelante hable de ellas, por el momento se los dejo de tarea.