SELECT de INTEIROS

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
RODRIGO_PINTO
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qui, 08 Mar 2007 11:52 am
Localização: SP

Boa Tarde,

alguém sabe me dizer como faco para saber somente numeros inteiros.
preciso negar que seja inserido valores como 0006 e 6

Original:

Selecionar tudo

   IF P_CD_NRO_NOTA_FISCAL IS NOT NULL THEN
   	  SELECT COUNT(*) INTO v_TOT
	  FROM 	 NOTAS_FISCAIS
	  WHERE  SQ_PESSOAS = P_SQ_PESSOAS
	  AND    UPPER(TRIM(CD_NRO_NOTA_FISCAL)) = UPPER(TRIM(P_CD_NRO_NOTA_FISCAL));

	  IF v_TOT >0 THEN
      	  RAISE NroNotaDuplicado;
	  END IF;
   END IF;
-------------------------------------
DEVERIA funcionar esse abaixo ?????????

Selecionar tudo

SELECT count(*)
FROM 	 NOTAS_FISCAIS
WHERE round(CD_NRO_NOTA_FISCAL) = '6'
alguém pode me dizer a sintaxe correte ?

Grato
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Não entendi direiro...

Você não pode selecionar valores como 6.1234, somente 6?

Outra dica, COUNT(1), em questões de performance, é melhor que COUNT(*).

qualquer coisa, manda aí.

Abraços,

:-o
RODRIGO_PINTO
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qui, 08 Mar 2007 11:52 am
Localização: SP

oque acontece é o seguinte,
é um sistema q cadastra notas fiscais não pode ter a mesma nota fiscal para o mesmo fornecedor. ate ai esta funcionando td certinho, mais se alguém cadastrar a nota como 000001 e 1 o sistema aceita sem problemas, pois se trata de um campo texto.

gostaria que o tratamento abaixo tratasse somente numeros inteiros, assim ira impossibiliar o cadastro.

mais não consegui usar a função round no where.
ex:

Selecionar tudo

SELECT count(*) 
FROM     NOTAS_FISCAIS 
WHERE round(CD_NRO_NOTA_FISCAL) = '6'
RODRIGO_PINTO
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qui, 08 Mar 2007 11:52 am
Localização: SP

a ideia aqui é saber todas as notas q possuem 6 , 0006, 06

Selecionar tudo

where abs(CD_NRO_NOTA_FISCAL) = '6'

acabei de descobrir q o abs também me retorna o valor inteiro, mas também não consegui usa-lo dentro do WHERE.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Fala brother, beleza?

Já tentou dar um TO_NUMBER nesta nota, antes de testá-la?

Selecionar tudo



DECLARE 
 v_nro VARCHAR2(10);
BEGIN
 v_nro := '000006';
 IF to_number(v_nro) = 6
 THEN 
 dbms_output.put_line('v_nro ' || to_number(v_nro));
 dbms_output.put_line('000006 =6 ');
 ELSE 
  dbms_output.put_line('000006 <>6 ');
 END IF;
END;
 
Acho q funciona.
qualquer dúvida, manda ai.

Abraço,

:-o
RODRIGO_PINTO
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qui, 08 Mar 2007 11:52 am
Localização: SP

OBS: a coluna é do tipo VARCHAR2

Selecionar tudo

select * 
from notas_fiscais nf
where
to_number(nf.CD_NRO_NOTA_FISCAL) = 6;]
ERRO: ORA-01722: invalid number


é possivel fazer essa conversão de alguma outra forma ???
:evil:
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Esse erro está acontecendo porque na sua coluna CD_NRO_NOTA_FISCAL você provavelmente tem algum caracter que não seja numérico.

Essa prática de colocar um TO_NUMBER na coluna é desaconselhada, primeiro pelo motivo acima. (talvez HOJE não de erro, mas se amanhã alguém colocar um caracter não numérico ali no meio, vai dar erro).

Outro motivo é que isso mata o índice, faz com que o ORACLE tenha que varrer toda tabela pra achar sua linha. (ou seja, performance cai pra zero).

Acho que o maior problema aí é CAMPO ser alfanumérico: deveria ser NUMBER. (é claro, agora não dá mais pra mudar isso). Como a coluna é alfanumérica, sugiro que o usuário preencha corretamente o número: Se tem zeros antes, que ele digite os zeros OU que você coloque um LPAD pra preencher com zeros:

Selecionar tudo

SQL> select lpad(25,6,0) from dual;

LPAD(2
------
000025

SQL> 

Selecionar tudo

select *
from notas_fiscais nf
where nf.CD_NRO_NOTA_FISCAL = lpad(6,6,0);
:-o
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Blzinha Dr_Gori, está correto.
Só tem um problema, se este varchar2 for de 10 por exemplo e, uma nota conter mais zeros do que 6.

Dai talvez fosse melhor utilizar o length:

Selecionar tudo

select * 
from tb_teste
where nro_nf = lpad(6,LENGTH(nro_nf),0); 
Abraços,

:-o
RODRIGO_PINTO
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qui, 08 Mar 2007 11:52 am
Localização: SP

o problema é que preciso tambem retirar os zeros a esqueda do campo ta tabela varchar 2 e dos parametros passados para fazer a comparação certa.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Seria isso brow?

Selecionar tudo


DECLARE 
 v_nota VARCHAR2(10):='000006';
BEGIN
 v_nota := REPLACE(v_nota,0,null);
 DBMS_OUTPUT.put_line('Nota sem zeros: ' || v_nota); 
 DBMS_OUTPUT.put_line('Tamanho: ' || LENGTH(v_nota));
END;

Abraços,

:shock:
RODRIGO_PINTO
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qui, 08 Mar 2007 11:52 am
Localização: SP

brotherrrr foi quase,
fo*a q ele tira todos os zeros, ai não pode, nota fiscal n° 0060903
vai ficar 693.
sabe alguma maneira de remover somente os zero a esquerda ?
:-o
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Use o LTRIM. Ele retira da esquera os caracteres em branco. (default)
Caso você coloque o segundo parametro, um caracter, ele retira ESSE caractere.

Veja, vamos tirar os zeros da esquerda:

Selecionar tudo

SQL> select ltrim(cod,0)
  2  from (select '000000100' cod from dual)
  3  /

LTRIM(COD,0)
------------
100

SQL> 
Vamos testar agora tendo umas letras no meio:

Selecionar tudo

SQL> select ltrim(cod,0)
  2  from (select '0000X0100A' cod from dual)
  3  /

LTRIM(COD,0)
------------
X0100A

SQL> 
Perfeito!

Agora, colocamos o LPAD pra preencher com zeros:

Selecionar tudo

SQL> select lpad(ltrim(cod,0),10,0)
  2  from (select '0000X0100A' cod from dual)
  3  /

LPAD(LTRIM(COD,0),10,0)
-----------------------
0000X0100A

SQL> select lpad(ltrim(cod,0),10,0)
  2  from (select '0000b1' cod from dual)
  3  /

LPAD(LTRIM(COD,0),10,0)
-----------------------
00000000b1

SQL> 
:D
RODRIGO_PINTO
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qui, 08 Mar 2007 11:52 am
Localização: SP

valeu cara, perfeito !!!!
agradecido mesmo !!!


agora a galera vai cadastar com quantos zeros quizer na frente e "0001" vai ser igual a "1" auhauhuha

Obrigado
Abracos
Responder
  • Informação