viernes, 25 de abril de 2008

Función Split Oracle

Hace unos dias alguien me preguntó sobre alguna función en Oracle que hiciera un Split de una cadena, lo cierto es que no conozco el lenguaje de oracle como sql server, pero un amigo me hizo llegar esta función, espero les sirva.

create or replace function split
(
p_list varchar2,
p_del varchar2 := ','
)
return split_tbl pipelined
is
l_idx pls_integer;
l_list varchar2(32767) := p_list;AA
l_value varchar2(32767);
begin
loop
l_idx := instr(l_list,p_del);
if l_idx > 0 then
pipe row(substr(l_list,1,l_idx-1));
l_list := substr(l_list,l_idx+length(p_del));
else

pipe row(l_list);
exit;
end if;
end loop;
return;
end split;
/

La estuve probando en mi base de datos oracle 10g y me funcionó a la perfección, asi que suerte.

6 comentarios:

Anónimo dijo...

qué significa esa "AA" después de l_list varchar2(32767) := p_list;?? y qué es split_tbl??

Michael Núñez dijo...

Saludos,

Esto "split_tbl pipelined" lo que indica que el resultado será listado en tabla

Claudiojan dijo...

Guru necesito hacerte una consulta!...

lo que necesito es crear un procedimiento con un cursor el cual me separe una cadena de una tabla llamada cli_nombre el que contiene juan perez esta funcion debe separar jose y guardarlo en cli_nombre1 y perez en cli_paterno ojala me pueda ayudar pues trate de ocupar tu split pero no comprendi como ocuparlo... espero tu ayuda.

Saludos Claudiojan!.

Spulit dijo...

No me funciona, snifff, tambien tengo Oracle 10g y se me queja en
";AA
l_value varchar2(32767);"

Alguna sugerencia??

Shell - bash dijo...

para utilizar esta funcion se debe realizar lo siguiente
SELECT * FROM TABLE(Split_('1|3|6|10','|'))

anthian dijo...

Buenas,

Al que preguntava lo del AA, supongo que es un error tipográfico. Almenos funciona quitando el AA famoso.

Os dejo la función de concatenar, que para APEX no está implmenetada por defecto i viene bastante bien:

create or replace function FNC_CONCATENATE_TABLE_RESULTS
(
p_cursor sys_refcursor,
p_del varchar2 := ','
) return varchar2
is
l_value varchar2(32767);
l_result varchar2(32767);
begin
loop
fetch p_cursor into l_value;
exit when p_cursor%notfound;
if l_result is not null then
l_result := l_result || p_del;
end if;
l_result := l_result || l_value;
end loop;
return l_result;
end FNC_CONCATENATE_TABLE_RESULTS;
/

se utiliza de la siguiente forma:

SELECT FNC_CONCATENATE_TABLE_RESULTS(CURSOR( _SELECT_DE_UNA_SOLA_COLUMNA_ ),':')
FROM dual;

Ej:

SELECT FNC_CONCATENATE_TABLE_RESULTS(CURSOR(
SELECT 'A' FROM DUAL
UNION ALL
SELECT 'B' FROM DUAL
UNION ALL
SELECT 'C' FROM DUAL)
,':') as concatenated_result
FROM DUAL