Pegar próximo número sorteado

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
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Bom dia,

Tenho uma tabela onde possui alguns registros aleatórios que são vendidos a clientes, que dá direito a um sorteio no próximo mês.
Acontece que alguns números não são vendidos, então preciso pegar o próximo número vendido.

Ex.
o número sorteado foi 123456, porém ele não foi vendido então tenho que somar 1 número (123456 + 1 = 123457) e verificar se foi vendido ou não, caso também não for vendido, fazer a mesma coisa até encontrar algum ganhador.
Alguém pode me dar uma idéia de como fazer isso?
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

Como você sabe se foi vendido o não? alguma flag? se sim! faz esse filtro na sua query e so pega os numeros vendidos... se não for na mesma tabela ou não puder fazer relacionamento, faz 2 cursores, um pra abrir o numero e outro pra checar se foi vendido.. joga isso dentro de um for loop e abraço!
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Sim, existe uma flag. Mas esse sorteio é pela loteria e não um sistema interno, então o numero sorteado pode não estar vendido, então tenho que pegar o numero sorteado e somar mais uma unidade e fazer isso até encontrar um vendido.
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

Ta fazendo um jogo do bixo é? rsrsrs

Bom, você consegue fazer isso com um loop até achar o número que foi sorteado, então, se ele não foi vendido, você busca o numero sorteado +1 como deseja e assim vai indo até achar um que seja vendido...
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Se entendi direito:

Selecionar tudo

SQL> set serveroutput on
SQL> declare
  2    cursor t_sorteio (p_num_sorteado in number) is
  3    with t as (
  4    select 1 cod_venda, 5 num, 'S' flag_venda from dual
  5    union all select 2, 12, 'N' from dual
  6    union all select 3, 15, 'S' from dual
  7    union all select 4, 20, 'S' from dual)
  8    select min(t.num) from t
  9    where t.num >= p_num_sorteado
 10    and t.flag_venda = 'S';
 11    v_num_sorteado number := 10;
 12    v_cod_venda_sort number;
 13  begin
 14    open t_sorteio (p_num_sorteado => v_num_sorteado);
 15    fetch t_sorteio
 16      into v_cod_venda_sort;
 17    dbms_output.put_line('Cod Venda Sorteada: ' || v_cod_venda_sort);
 18    dbms_output.put_line(' - Número da sorte: ' || v_num_sorteado);
 19    close t_sorteio;
 20  end;
 21  /
Cod Venda Sorteada: 15
- Número da sorte: 10

Procedimento PL/SQL concluído com sucesso.

SQL> 
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Corrigindo meu post anterior, postei meio sem pensar.

Selecionar tudo

SQL> set serveroutput on
SQL> declare
  2    cursor t_sorteio (p_num_sorteado in number) is
  3    with t as (
  4    select 1 cod_venda, 5 num, 'S' flag_venda from dual
  5    union all select 2, 12, 'N' from dual
  6    union all select 3, 15, 'S' from dual
  7    union all select 4, 20, 'S' from dual)
  8    select t.cod_venda, t.num
  9      from t
 10     where t.num = (select min(t.num) from t
 11                     where t.num >= p_num_sorteado
 12                       and t.flag_venda = 'S');
 13    v_num_sorteado number := 10;
 14    v_cod_venda_venc number;
 15    v_num_sorte_venc number;
 16  begin
 17    open t_sorteio (p_num_sorteado => v_num_sorteado);
 18    fetch t_sorteio
 19      into v_cod_venda_venc, v_num_sorte_venc;
 20    dbms_output.put_line('Número Sorte Vencedor: ' || v_num_sorte_venc);
 21    dbms_output.put_line('Código da Venda Vencedor: ' || v_cod_venda_venc);
 22    dbms_output.put_line(' - Número da sorte sorteado: ' || v_num_sorteado);
 23    close t_sorteio;
 24  end;
 25  /
Número Sorte Vencedor: 15
Código da Venda Vencedor: 3
- Número da sorte sorteado: 10

Procedimento PL/SQL concluído com sucesso.

SQL> 

Só tem que ter uma unique key na coluna do número da sorte, se tiver repetido vai ter 2 vencedores e vai dar exception no select into. Teria que fazer um loop.
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Fiz dessa forma, nos meus testes funcionou legal.

Selecionar tudo

SELECT NROSORTE, SERIESORTEIO, LOJA, CODCLIENTE,
            TO_CHAR(DATANRSORTE, 'DD/MM/YYYY') , 
            CPF,
            NOMCLI, 
            TELCLI
FROM CYBELAR_NROSORTE"
  WHERE NROSORTE IN (SELECT MIN(NROSORTE) 
                                      FROM CYBELAR_NROSORTE
                                        WHERE NROSORTE >= :Numero
                                            AND FLGUSO = 1
                                            AND EXTRACT(MONTH FROM mês_ANO) = :mês
                                            AND EXTRACT(YEAR FROM mês_ANO) = :Ano
                                    GROUP BY mês_ANO)
    AND EXTRACT(MONTH FROM mês_ANO) = :mês
    AND EXTRACT(YEAR FROM mês_ANO) = :Ano
    AND FLGUSO = 1
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 11 visitantes