Declaração de variavel em função

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
joaoluizbt
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Qui, 05 Mai 2011 3:53 pm
Localização: Rio de Janeiro

Bom dia,

eu tenho uma função que faz dois selects e depois soma os valores.
o problema é que se um dos selects não retorna nada, na hora da soma, ele exibe nenhum resultado...

qual a melhor maneira de se resolver isso? criando duas variaveis e guardando o resultado do select e depois somando? como eu declaro as variaveis aqui?

se será que eu resolvo isso com alguns IFs?

usei este codigo:

Selecionar tudo

CREATE OR REPLACE Function FNCT1 (p_pdv In Varchar2) Return Number Is
  p_base_1 Number;
Begin
  select (retroativo.soma_retroativo + adiantamento.soma_adiantamento) as base_1
  Into p_base_1
  from (select sum(vl_pgto) as soma_retroativo
        from tbl_retroativo
        where pdv = p_pdv) retroativo,
       (select sum(val_pg) as soma_adiantamento
        from tbl_adiantamento
        where cod_dealer = p_pdv) adiantamento;
    Return p_base_adiantamento;
End;
Muito obrigado.
joaoluizbt
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Qui, 05 Mai 2011 3:53 pm
Localização: Rio de Janeiro

olá,

utilizei o case no lugar onde eu somo os dois valores:

Selecionar tudo

CREATE OR REPLACE Function FNCT_1(p_pdv In Varchar2) Return Number Is
  p_base_1 Number;
Begin
  select (CASE
    WHEN retroativo.soma_retroativo is null and adiantamento.soma_adiantamento is null THEN
        (0)
    WHEN retroativo.soma_retroativo is null and adiantamento.soma_adiantamento is not null THEN
        (adiantamento.soma_adiantamento)
    WHEN retroativo.soma_retroativo is not null and adiantamento.soma_adiantamento is null THEN
        (retroativo.soma_retroativo)
    WHEN retroativo.soma_retroativo is not null and adiantamento.soma_adiantamento is not null THEN
        (retroativo.soma_retroativo + adiantamento.soma_adiantamento)
END) as base_adiantamento
  Into p_base_1
        from (select sum(vl_pgto) as soma_retroativo
        from tbl_retroativo
        where pdv = p_pdv) retroativo,
       (select sum(val_pg) as soma_adiantamento
        from tbl_adiantamento
        where cod_dealer = p_pdv) adiantamento;
    Return p_base_1;
End;
espero que ajude mais alguém.
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP
Ricardo H. Tajiri

Talvez fique mais simples se usar o NVL...

Selecionar tudo

CREATE OR REPLACE Function FNCT1 (p_pdv In Varchar2) Return Number Is
  p_base_1 Number;
Begin
  select (NVL(retroativo.soma_retroativo,0) + NVL(adiantamento.soma_adiantamento,0)) as base_1
  Into p_base_1
  from (select sum(vl_pgto) as soma_retroativo
        from tbl_retroativo
        where pdv = p_pdv) retroativo,
       (select sum(val_pg) as soma_adiantamento
        from tbl_adiantamento
        where cod_dealer = p_pdv) adiantamento;
    Return p_base_adiantamento;
End;
Abraços
joaoluizbt
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Qui, 05 Mai 2011 3:53 pm
Localização: Rio de Janeiro

Olá,

Realmente, fica muito melhor, eu não conhecia este comando.
Muito obrigado, o código ficou muito mais "clean".

grande abraço.
Responder
  • Informação
  • Quem está online

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