Chiapa eu tinha feito da forma **franciscana** que você falou.
Fiz uma lógica bem simples, sei que não é a melhor, porém como eu estava com uma certa urgência, desenvolvi dessa forma. No meu caso ele pega cada linha de um campo string e posteriormente insere em uma tabela. DECLARE var_qtd_caracter PLS_INTEGER; var_posicao_anterior PLS_INTEGER; var_posicao_atual PLS_INTEGER; BEGIN var_posicao_anterior:=0; var_posicao_atual := 0; FOR varre IN(SELECT translate(nome_do_campo,chr(10)||chr(13),'|')||'|' nome_do_campo, length(translate(nome_do_campo,chr(10)||chr(13),'|')) - length(replace(translate(nome_do_campo,chr(10)||chr(13),'|'),'|',''))+1 qtd_enter FROM noe_da_tabela WHERE instr(nome_do_campo,chr(10)) >0) LOOP FOR enter IN 1..varre.qtd_enter LOOP IF(enter = 1)THEN INSERT INTO enter_teste VALUES (replace(substr(varre.nome_do_campo,1,instr(varre.nome_do_campo,'|',1,1)),'|','') ); COMMIT; ELSE var_posicao_anterior := instr(varre.nome_do_campo,'|',1,enter-1); var_posicao_atual := instr(varre.nome_do_campo,'|',1,enter)-instr(varre.nome_do_campo,'|',1,enter-1); INSERT INTO enter_teste VALUES (varre.bad_codigo_beneficio, replace(substr(varre.nome_do_campo,var_posicao_anterior,var_posicao_atual),'|','')); COMMIT; END IF; END LOOP; END LOOP; END; -- Atenciosamente Francisco Porfirio Ribeiro Neto [As partes desta mensagem que não continham texto foram removidas]