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.
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!
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.
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...
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>
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.
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