- Este tópico contém 7 respostas, 3 vozes e foi atualizado pela última vez 15 anos atrás por
burga.
-
AutorPosts
-
8 de abril de 2010 às 6:54 pm #93579
Anônimo
Bom dia a todos, estou aprendendo Oracle e preciso de ajuda para resolver um problema que estou penando há um tempo já. Tenho uma tabela NF e nela criei um campo Num_NF (varchar2) neste campo possuo algumas notas armazenadas com espaços a esquerda e direita e zeros a esquerda. Gostaria de obter um exemplo de uso do comando TRIM ou LTRIM no qual delete tanto os zeros a esquerda quanto os espaçamentos. Podem me ajudar? Se possível gostaria de saber também porque é deletado todos os registros do campo quando eu executo o comando TRIM na tabela?
8 de abril de 2010 às 8:36 pm #93581fsitja
ParticipanteSegue abaixo:
SQL> select ltrim(ltrim(rtrim(' 000999.11 ')), '0') from dual;LTRIM(LTRIM(RTRIM('000999.11')
999.11
SQL>
[quote=”faabade”:1b6vws65]gostaria de saber também porque é deletado todos os registros do campo quando eu executo o comando TRIM na tabela?[/quote]
Não entendi… você pode postar o código que você está rodando e que está causando isso. Trim não deleta registros.A menos que você esteja falando do médodo Trim usado em nested tables. Mesmo assim ele só elimina os registros previamente deletados (vazios).
8 de abril de 2010 às 9:57 pm #93582Anônimo
[quote=”fsitja”:po5mhw2z]Segue abaixo:
SQL> select ltrim(ltrim(rtrim(' 000999.11 ')), '0') from dual;LTRIM(LTRIM(RTRIM('000999.11')
999.11
SQL>
[quote=”faabade”:po5mhw2z]gostaria de saber também porque é deletado todos os registros do campo quando eu executo o comando TRIM na tabela?[/quote]
Não entendi… você pode postar o código que você está rodando e que está causando isso. Trim não deleta registros.A menos que você esteja falando do médodo Trim usado em nested tables. Mesmo assim ele só elimina os registros previamente deletados (vazios).[/quote]
Obrigado pelo retorno fsitja, eu rodei o script que passou e aconteceu exatamente o que descreveu mas eu fiz um select na minha tabela e o dado desta não foi alterado segue:
select ltrim(ltrim(rtrim(‘ 3 ‘)), ‘0’) from NF;
1 3
2 3
3 3
4 3
5 3select Num_NF from nf:
1 1
2 2
3 003
4 004
5 00000005Com o primeiro comando os espaços e zeros as esquerda da linha 3 não deveriam ser deletados?
8 de abril de 2010 às 10:27 pm #93583burga
ParticipanteNa verdade, quando você utiliza o select com “trims”, os dados são alterados somente para a apresentação.
Se você quer alterar permanentemente a informação contida no campo Num_NF da tabela NF, você deverá efetuar o update dos dados.
update NF set Num_NF = ltrim(ltrim(rtrim(Num_NF)), '0');
8 de abril de 2010 às 11:28 pm #93584Anônimo
[quote=”burga”:2565ak5h]Na verdade, quando você utiliza o select com “trims”, os dados são alterados somente para a apresentação.
Se você quer alterar permanentemente a informação contida no campo Num_NF da tabela NF, você deverá efetuar o update dos dados.
update NF set Num_NF = ltrim(ltrim(rtrim(Num_NF)), '0');
[/quote]Era isso mesmo, eu só esqueci de uma condição, há campos que podem conter letras, neste caso eu precisarei converter o campo (TO_NUMBER) antes de usar o comando TRIM ou há um outro jeito?
9 de abril de 2010 às 12:46 am #93586burga
ParticipanteSe um valor contém letras você não conseguirá converter em número, o Oracle retornará a seguinte mensagem de erro:
select to_number(‘as’) from dual;
Erro ao iniciar na linha 1 no comando
select to_number(‘as’) from dual
Relatório de erro:
Erro de SQL: ORA-01722: número inválido
01722. 00000 – “invalid number”
*Cause:
*Action:Na condição do update você pode filtrar pra ele não converter valores com letras.
WHERE REGEXP_LIKE(TRIM(Num_NF),’^[[:digit:]]+$’);
9 de abril de 2010 às 1:30 am #93587fsitja
ParticipanteNa verdade esse tipo de teste é muito difícil de ser feito com expressões regulares. Isso porque um número pode conter vírgulas e pontos, sendo válido para conversão, e isso ainda depende de configuração de NLS_NUMERIC_CHARS.
O mais fácil de testar a possibilidade de conversão é criar uma function que converta ou capture o erro em caso de exception.
Depois eu posto um exemplo, agora tá na minha hora. 😉
9 de abril de 2010 às 10:03 pm #93590burga
ParticipanteOpa, realmente tem o problema dos pontos e vírgulas, mas sendo números de endereços, acho que dá pra ignorar que vão existir números quebrados e retirar todos os pontos e virgulas da string.
WHERE REGEXP_LIKE(REPLACE(REPLACE(TRIM(Num_NF),’,’),’.’),’^[[:digit:]]+$’);
-
AutorPosts
- Você deve fazer login para responder a este tópico.