Re: [oracle_br] Re: Detectar quebra de linha

2009-05-21 Por tôpico francisco porfirio
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

2009-05-21 Por tôpico Marcos Braga
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

2009-05-21 Por tôpico 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]
>