DUVIDAS (DECLARE)!!!

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
mataveli
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Qui, 27 Dez 2007 8:51 am
Localização: sorocaba

Buenas caros amigos!!!

Preciso rodar uma DECLARE;
preciso limpar a tabela, identificar nessa tabela os lancamentos impares, contar os lancamentos pares e impares e inserir na tabela os lancamentos de numeros impares.

Afff... está meio confuso mais se puderem me ajudar com um exemplo, serei grato.

Abrax...

Mataveli
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, beleza?

Cara, dá uma olhada neste tópico abaixo, aqui do fórum, sobre Pares e Ímpares:

http://www.glufke.net/oracle/viewtopic. ... ight=impar

Abaixo, vai uma dica:

Selecionar tudo

-- Se o mod do valor, retornar 0, é Par
SELECT MOD(12,2) FROM dual;

-- Se retornar 1, é Ímpar
SELECT MOD(13997,2) FROM dual;

Troque onde está o (12 e o 13997) pelo campo da tua tabela e faça um teste.

Talvez o ajude neste caso ai, beleza?

qualquer coisa, manda pra gente.
mataveli
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Qui, 27 Dez 2007 8:51 am
Localização: sorocaba

beleza BROW!!! TENHO UM mês DE PL/SQL, TO TENTANDO APRENDER SOZINHO. HEHEHEHE!!! IMBAÇADO...

FIZ UMAS LOUCURAS aí, vê SE TUH CONSEGUE INTENDER ... ABRAÇOSS!! :roll:

Selecionar tudo

 DECLARE
CURSOR C_LANCTO IS
SELECT NUM_LIGACAO,
       NUM_AVISO,
       ANO_LANCTO,
       mês_LANCTO,
       VAL_LANCTO
FROM   LANCAMENTO_TMP
WHERE  ANO_LANCTO = 2007 AND
       mês_LANCTO = 10;
v_num_ligacao NUMBER(9);
v_num_aviso   NUMBER(9);
v_ano_lancto  NUMBER(4);
v_mês_lancto  NUMBER(2);
v_val_lancto   NUMBER(15,2);
  BEGIN
  OPEN C_LANCTO;
 LOOP 
  FETCH C_LANCTO
  INTO v_num_ligacao,
       v_num_aviso,
       v_ano_lancto,
       v_mês_lancto,
       v_val_lancto;
EXIT WHEN C_LANCTO%NOTFOUND;

-------------- aqui EU PRECISO LIMPAR A TABELA LANCAMENTO_TMP.
BEGIN
DELETE FROM LANCAMENTO_TMP;
EXCEPTION
 WHEN OTHERS THEN
--------------------------------------------
END;

------------ PRECISO IDENTIFICAR O NUMERO DE AVISO IMPAR DA REFERENCIA 2007.
BEGIN
SELECT NUM_AVISO
FROM LANCAMENTO
WHERE NUM_AVISO MOD(10,2) = 0 AND
      ANO_LANCTO = 2007;
------------------------------------------------------
---------------------------PRECISO CONTAR OS LANCAMENTOS PARES E IMPARES.
SELECT COUNT(1) VAL_LANCTO
FROM LANCAMENTO
WHERE VAL_LANCTO MOD(10,2) = 0 , MOD(9,2) = 1;

----------------------------aqui INSERIR NA TABELA OS LANCAMENTOS DE NUM_AVISO IMPAR.
INSERT INTO LANCAMENTO_TMP 
(VAL_LANCTO)
SELECT VAL_LANCTO
FROM LANCAMENTO_TMP
WHERE NUM_AVISO MOD(9,2) = 1;

  EXCEPTION 
 WHEN OTHERS THEN
 
 DBMS_OUTPUT.PUT_LINE(v_num_ligacao||' | '||v_num_aviso||' | '||v_ano_lancto||',
||v_mês_lancto);
END;
IF MOD(
END LOOP;
  CLOSE C_LANCTO;
END;
/
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

Brow,

Fiz um exemplo aqui pra você...
Vê se consegue adaptar ai.

Selecionar tudo


CREATE TABLE teste (v_valor NUMBER, v_ano number);

INSERT INTO teste (v_valor, v_ano) VALUES (1, 2007);
INSERT INTO teste (v_valor, v_ano) VALUES (2, 2007);
INSERT INTO teste (v_valor, v_ano) VALUES (3, 2007);
INSERT INTO teste (v_valor, v_ano) VALUES (1, 2006);
INSERT INTO teste (v_valor, v_ano) VALUES (2, 2006);
INSERT INTO teste (v_valor, v_ano) VALUES (3, 2006);

COMMIT;

SELECT * 
FROM teste;



DECLARE 
 
 CURSOR CUR_PARES
   IS 
     SELECT V_VALOR,
            V_ANO
       FROM TESTE
					 WHERE V_ANO = 2007
						  AND MOD(V_VALOR,2) = 0;

BEGIN
  FOR X IN CUR_PARES
  LOOP
     dbms_output.put_line('Listando os PARES de 2007. VALOR => ' || X.V_VALOR);
     -- aqui você pode inserir na tua tabela...
  END LOOP;
END;		
	
qualquer coisa, manda ai.
mataveli
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Qui, 27 Dez 2007 8:51 am
Localização: sorocaba

aí browww !!!
valeu pela ajuda...
abraço.. té!

Matavelli
mataveli
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Qui, 27 Dez 2007 8:51 am
Localização: sorocaba

aí BROW !
COMO EU FAÇO PRA INSERIR APENAS VALORES IMPARES EM UMA TABELA???

GRATO!

Mataveli
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,

É só trocar o MOD que eu coloquei pros PARES, como 1:

Selecionar tudo

AND MOD(V_VALOR,2) = 1;
Ele só irá listar no LOOP os ímpares, daí você dá o insert no ponto que marquei pra você no código anterior, beleza?

qualquer coisa, manda ai.
mataveli
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Qui, 27 Dez 2007 8:51 am
Localização: sorocaba

BROW!!!
TO COLOCANDO PRA RODAR E APARECE ESSE ERRO aí,

ERROR at line 1:
ORA-01756: quoted string not properly terminated

---------------------------------
VLW, ABRAÇO!

MATAVELI
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,

Posta teu código completo aqui pra gente, pode seR?
mataveli
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Qui, 27 Dez 2007 8:51 am
Localização: sorocaba

TO ALUGANDO você HJ... VLW A ATENÇÃO BROW!!!
---------------------------------

Selecionar tudo

DECLARE
CURSOR C_LANCTO IS
SELECT NUM_LIGACAO,
       NUM_AVISO,
       ANO_LANCTO,
       mês_LANCTO,
       VAL_LANCTO
FROM   LANCAMENTO_TMP
WHERE  ANO_LANCTO = 2007 AND
       mês_LANCTO = 10;
v_num_ligacao NUMBER(9);
v_num_aviso   NUMBER(9);
v_ano_lancto  NUMBER(4);
v_mês_lancto  NUMBER(2);
v_val_lancto   NUMBER(15,2);
  BEGIN
  OPEN C_LANCTO;
 LOOP 
  FETCH C_LANCTO
  INTO v_num_ligacao,
       v_num_aviso,
       v_ano_lancto,
       v_mês_lancto,
       v_val_lancto;
EXIT WHEN C_LANCTO%NOTFOUND;
  BEGIN
   DELETE FROM LANCAMENTO_TMP;
    EXCEPTION
     WHEN OTHERS THEN
  END;
 BEGIN
  SELECT NUM_AVISO
   FROM LANCAMENTO
    WHERE mês_LANCTO = 10 AND
          ANO_LANCTO = 2007 AND
          MOD(9,2) = 1;
 SELECT COUNT(1) VAL_LANCTO
   FROM LANCAMENTO
    WHERE VAL_LANCTO MOD(10,2) = 0 AND 
                     MOD(9,2) = 1;
  DBMS_OUTPUT.PUT_LINE('Listando os PARES e IMPARES de 2007');
 INSERT INTO LANCAMENTO_TMP 
  (VAL_LANCTO)
    SELECT VAL_LANCTO
     FROM LANCAMENTO_TMP
      WHERE NUM_AVISO MOD(9,2) = 1;
     EXCEPTION 
      WHEN OTHERS THEN
 DBMS_OUTPUT.PUT_LINE(v_num_ligacao||' | '||v_num_aviso||' | '||v_ano_lancto||', ||v_mês_lancto);
 END;
 END LOOP;
  CLOSE C_LANCTO;
END;
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

O erro está abaixo do insert da LANCAMENTO_TMP, logo depois do insert tem um dbms_output, nele está faltando fechar as aspas.

Selecionar tudo

ex: DBMS_OUTPUT.PUT_LINE(v_num_ligacao||' | '||v_num_aviso||' | '||v_ano_lancto||','||v_mês_lancto); 
[]'s
mataveli
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Qui, 27 Dez 2007 8:51 am
Localização: sorocaba

aí GALERA, EU COLOCO PRA RODAR ESSA DECLARE SÓ Q ESTA RETORNANDO VALOR INSERIDOS 0. alguém SABE O POR QUE???

AGUARDO... ABRAÇO!

Selecionar tudo

---------------------------------------------------------
DECLARE 
CURSOR C_LANCTO IS
SELECT NUM_LIGACAO,
            NUM_AVISO,
            ANO_LANCTO,
            mês_LANCTO,
            VAL_LANCTO
FROM    LANCAMENTO
WHERE  ANO_LANCTO = 2007 AND
            mês_LANCTO = 10 AND
            COD_GRUPO = 9;
v_num_ligacao NUMBER(9);
v_num_aviso   NUMBER(9);
v_ano_lancto   NUMBER(4);
v_mês_lancto  NUMBER(2);
v_val_lancto    NUMBER(15,2);
v_count_par    NUMBER := 0;
v_count_impar NUMBER := 0;
BEGIN
  OPEN C_LANCTO;
    DELETE FROM LANCAMENTO_TMP; -- LIMPA TABELA!
  COMMIT;
  LOOP
   FETCH C_LANCTO
   INTO v_num_ligacao,
           v_num_aviso,
           v_ano_lancto,
           v_mês_lancto,
           v_val_lancto;
  EXIT WHEN C_LANCTO%NOTFOUND;
  IF MOD(v_num_aviso,2) = 1 THEN -- SE IMPAR INSERIR!
     BEGIN
       INSERT INTO LANCAMENTO_TMP
      (num_aviso,
       ano_lancto,
       mês_lancto,
       num_ligacao,
       val_lancto)
       VALUES  (v_num_aviso,
                      v_ano_lancto,
                      v_mês_lancto,
                      v_num_ligacao,
                      v_val_lancto);
     EXCEPTION
       WHEN OTHERS THEN
         DBMS_OUTPUT.PUT_LINE('ERRO AO INSERIR EM TABELA O CDC: ' ||v_num_ligacao);
   END;
  --DBMS_OUTPUT.PUT_LINE ('INSERIDO:' || v_num_ligacao);
   v_count_impar := v_count_impar + 1;
ELSE
   v_count_par := v_count_par + 1;
  END IF;
END LOOP;
   DBMS_OUTPUT.PUT_LINE (' INSERIDOS: ' || v_count_par);
   DBMS_OUTPUT.PUT_LINE (' INSERIDOS: ' || v_count_impar);
CLOSE C_LANCTO;
END;
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,

Este trecho abaixo retorna algo?

Selecionar tudo

SELECT NUM_LIGACAO, 
            NUM_AVISO, 
            ANO_LANCTO, 
            mês_LANCTO, 
            VAL_LANCTO 
FROM    LANCAMENTO 
WHERE  ANO_LANCTO = 2007 AND 
            mês_LANCTO = 10 AND 
            COD_GRUPO = 9; 
Outra coisa, mês_LANCTO é do tipo NUMBER?
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

Os contadores

Selecionar tudo

   DBMS_OUTPUT.PUT_LINE (' INSERIDOS: ' || v_count_par); 
   DBMS_OUTPUT.PUT_LINE (' INSERIDOS: ' || v_count_impar); 
estão apresentando a quantidade de registros inseridos? você está dando um commit depois de executar o seu script?

[]'s
mataveli
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Qui, 27 Dez 2007 8:51 am
Localização: sorocaba

Brow!!! você é o cara...
estava faltando o COMMIT mesmo, demoro mais rodou hehe !!!
Agradeço pela ajuda, abraço!

MATAVELI
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante