Procedure

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
Nilsonp
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qua, 28 Nov 2007 9:05 am
Localização: Guarulhos - S.P.

Tenho esta procedure e preciso transformar este bloco de decode em if/else


será que alguém pode me ajudar?

Selecionar tudo

create or replace procedure prc_tel (mês in number, ano in number) as
	Cursor c_cli is
		select	 aux.cod_cliente,
			 aux.ano_mês,
			 aux.ddd_telefone,
			 aux.num_telefone,
			 aux.dia_vencimento,


        		 sum  (nvl(decode(aux.ddd_telefone_destino, aux.ddd_telefone, aux.tempo),0)) local,
        		 sum  (nvl(decode(aux.ddd_telefone_destino, aux.ddd_telefone, 0, aux.tempo),0)) inter,
        		 sum  (nvl(decode(aux.ddd_telefone_destino, aux.ddd_telefone, (aux.tempo - 400) * (  select  val_minuto
													     from   bd_custo_ddd 
			                                                				     where  ddd_origem  = aux.ddd_telefone
							                  				     and    ddd_destino = aux.ddd_telefone_destino
												           )
					  ),0)
			       ) val_local,
        		 sum  (nvl(decode(aux.ddd_telefone_destino, aux.ddd_telefone, 0, aux.tempo * (
												        select  val_minuto
												        from    bd_custo_ddd 
			                                                     			        where   ddd_origem  = aux.ddd_telefone
							                        		        and   ddd_destino = aux.ddd_telefone_destino
											              )
					  ),0)
			       ) val_inter
		from (
         		select	  cliente.cod_cliente,
          			  telefones.num_telefone,
				  telefones.dia_vencimento,
				  telefones.ddd_telefone, 
 				  ligacoes.ano_mês,
				  ligacoes.ddd_telefone_destino,				
           			  sum((ligacoes.dat_termino - ligacoes.dat_inicio) * 24 * 60) tempo
         		from	  bd_clientes  cliente,
				  bd_telefones telefones,
				  bd_ligacoes  ligacoes
         		where	  cliente.cod_cliente    = telefones.cod_cliente
            		  and	  telefones.ddd_telefone = ligacoes.ddd_telefone
            		  and	  telefones.num_telefone = ligacoes.num_telefone
			  and 	  ligacoes.dat_inicio between to_date(telefones.dia_vencimento ||'/' || mês || '/' || ano) and (add_months (to_date(telefones.dia_vencimento ||'/' || mês || '/' || ano),1))
         		group by  cliente.cod_cliente,
           			  telefones.num_telefone,
				  telefones.dia_vencimento,
				  telefones.ddd_telefone, 
				  ligacoes.ano_mês,
				  ligacoes.ddd_telefone_destino
      		     ) aux 
		group by aux.cod_cliente,
			 aux.ano_mês,
			 aux.ddd_telefone,
			 aux.num_telefone,
			 aux.dia_vencimento;
	v_val_local  number(11,2);
	v_mês        number(2);
	v_ano        number(4);
begin
	delete from  bd_contas_mensais contas_mensais
               where contas_mensais.ano_mês = ano || mês;
	v_mês := mês;
	v_ano := ano;
	for r_cli in c_cli loop
    		if r_cli.val_local < 0 then
      			v_val_local := 0;
    		else
      			v_val_local := r_cli.val_local;
    		end if;
    		if mês = 12 then
     			v_mês := 1;
      			v_ano := ano + 1;
    		else
     			v_mês := mês + 1;
    		end if;
		insert into bd_contas_mensais ( cod_cliente,
						ano_mês,
						ddd_telefone,
						num_telefone,
						tot_minutos_locais, 
				  		val_minutos_locais,
						tot_minutos_inter,
						val_minutos_inter,
						dat_vencimento
					      )
 		values ( r_cli.cod_cliente,
			 r_cli.ano_mês,
			 r_cli.ddd_telefone,
			 r_cli.num_telefone,
			 r_cli.local,
			 v_val_local,
			 r_cli.inter,
			 r_cli.val_inter,
			 to_date (r_cli.dia_vencimento || '/' || v_mês || '/' || v_ano));
	End loop ;
	commit;
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

E ai Nilson, beleza??

o IF não pode ser usado dentro do select, o q você pode usar nesse caso é o CASE, segue ai um exemplo.

Selecionar tudo

SQL> SELECT SUM( CASE 2
  2              WHEN 1 THEN 10
  3              WHEN 2 THEN 20
  4              ELSE 30
  5              END) SOMA FROM DUAL
  6  /

     SOMA
---------
       20
o case você pode usar da mesma forma q usaria o IF..
se tiver alguma duvida ou problema falai pra nós!

[]'s
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

É isso ai brother.

Só complementando a dica do Tinecks, caso queira relamente utilizar um IF, você deve jogar este teu cursor num LOOP e, dentro dele realizar as validaçãos necessárias, como já eixste no final da tua procedure, em PL/SQL, beleza?

Dentro do select, só com DECODE ou CASE mesmo brother.

qualquer coisa manda ai.
Nilsonp
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qua, 28 Nov 2007 9:05 am
Localização: Guarulhos - S.P.

Se eu usar apenas o case, posso colocar dentro do bloco do NVL?
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

Opa.!

pode usar ele direto dentro do NVL sim !

[]'s!!
Responder
  • Informação