Re: [oracle_br] Re: Detectar quebra de linha
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]
Re: [oracle_br] Re: Detectar quebra de linha
Oi Francisco, Adaptando a solução do Chiappa, dá uma olhada nesse exemplo... -- SQL> create table t1 (c1 varchar2(50)); Tabela criada. SQL> insert into t1 values ('primeiralinha 2 segundalinha 3 terceiralinha'); 1 linha criada. SQL> insert into t1 values ('primeiralinha'||chr(10)||'segundalinha'); 1 linha criada. SQL> insert into t1 values ('unica linha'); 1 linha criada. SQL> commit; Commit concluido. SQL> select * from t1; C1 -- primeiralinha segundalinha terceiralinha primeiralinha segundalinha unica linha 3 linhas selecionadas. SQL> select c1 from t1 where regexp_like(c1, chr(10)); C1 -- primeiralinha segundalinha terceiralinha primeiralinha segundalinha 2 linhas selecionadas. SQL> select 2 c1, 3 (length(c1) - nvl(length(replace(c1,chr(10),'')),0))/length(chr(10)) cnt 4 from t1 where regexp_like(c1, chr(10)); C1CNT -- -- primeiralinha 2 segundalinha terceiralinha primeiralinha 1 segundalinha 2 linhas selecionadas. SQL> -- Funciona para contar ENTER's que é uma maravilha []s Braga 2009/5/21 jlchiappa > > > Bom, primeiro contagem de ocorrências de um dado caracter numa string : até > existem algumas funções que se poderia usar , dependendo ** fundamentalmente > ** da versão de banco, que pra variar vc não diz, mas a contagem só com > funções genéricas é franciscanamente SIMPLES, vc tira do comprimento da > string original o comprimento dela SEM o caracter desejado, kapluft , tipo + > ou - : > > select (length(:main_str) - > nvl(length(replace(:main_str,:srch_str,'')),0))/ > length(:srch_str) cnt > from dual; > > Isso em qquer versão, mas já se for banco 10g vc pode usar as funções de > regexp, há uma count lá... > > Já pra retornar cada posição de cada ocorrência vc terá, afaik, que ter uma > lógica de loop, ie : vc tem várias funções que retornam a posição de uma > dada ocorrência dum caracter (como a INSTR , ou algumas do pacote regexp no > 10g), vc teria que executar a função escolhida n vezes, uma pra cada > ocorrência - isso poderia ser um loop PL/SQL (a opção mais simples, afaik) > ou se exigido que seja em SQL apenas aí provavelmente vc teria que escrever > um SQL mais complexo, repetindo n vezes um select instr da string from dual, > já seria algo BEM mais complexo, mas possível, certamente. > > []s > > Chiappa > --- Em oracle_br@yahoogrupos.com.br , > francisco porfirio escreveu > > > > > Caros, > > > > Gostaria de um axulio de vocês. > > > > Estou precisando detectar as quebras de linhas da minha string. > > > > Consegui detecar apenas a primeira debra de linha atavés do instr. > > > > Alguem sabe informar se tem alguma função que me retorne a posição de > todos > > os caracter do tipo quebra de linha "chr(10)", ou que ao menos me informe > > quantas vezes esse caracter se repete na minha tring ? > > > > obrigado; > > > > -- > > Atenciosamente > > Francisco Porfirio Ribeiro Neto > [As partes desta mensagem que não continham texto foram removidas]
[oracle_br] Re: Detectar quebra de linha
Bom, primeiro contagem de ocorrências de um dado caracter numa string : até existem algumas funções que se poderia usar , dependendo ** fundamentalmente ** da versão de banco, que pra variar vc não diz, mas a contagem só com funções genéricas é franciscanamente SIMPLES, vc tira do comprimento da string original o comprimento dela SEM o caracter desejado, kapluft , tipo + ou - : select (length(:main_str) - nvl(length(replace(:main_str,:srch_str,'')),0))/ length(:srch_str) cnt from dual; Isso em qquer versão, mas já se for banco 10g vc pode usar as funções de regexp, há uma count lá... Já pra retornar cada posição de cada ocorrência vc terá, afaik, que ter uma lógica de loop, ie : vc tem várias funções que retornam a posição de uma dada ocorrência dum caracter (como a INSTR , ou algumas do pacote regexp no 10g), vc teria que executar a função escolhida n vezes, uma pra cada ocorrência - isso poderia ser um loop PL/SQL (a opção mais simples, afaik) ou se exigido que seja em SQL apenas aí provavelmente vc teria que escrever um SQL mais complexo, repetindo n vezes um select instr da string from dual, já seria algo BEM mais complexo, mas possível, certamente. []s Chiappa --- Em oracle_br@yahoogrupos.com.br, francisco porfirio escreveu > > Caros, > > Gostaria de um axulio de vocês. > > Estou precisando detectar as quebras de linhas da minha string. > > Consegui detecar apenas a primeira debra de linha atavés do instr. > > Alguem sabe informar se tem alguma função que me retorne a posição de todos > os caracter do tipo quebra de linha "chr(10)", ou que ao menos me informe > quantas vezes esse caracter se repete na minha tring ? > > obrigado; > > -- > Atenciosamente > Francisco Porfirio Ribeiro Neto > > > [As partes desta mensagem que não continham texto foram removidas] >