Olá pessoal... Pra quem não sabe, eu estudo Matemática aplicada a Informática na ULBRA. (ou seja, adoro cálculos!). Já fazia um tempo que eu queria montar um select que gera os números primos. Finalmente, hoje eu consegui!!!
select z.zz PRIMOS
from
(select rownum+1 zz
from user_tables
where rownum < 100
) z
where zz not in (
select y.bb
from (select rownum+1 aa from user_tables a where rownum < 100) x
, (select rownum+1 bb from user_tables b where rownum < 100) y
where bb<>aa
and mod(bb, aa)=0
and aa<=bb
)
/
ai dr_gori, parabéns, cada volta e meia você coloca umas dicas muito interessantes...
algumas são curiosidades mas outras são de grande valia para quem trabalha com oracle....
Realmente, procuro colocar aqui coisas que podem beneficiar os parceiros do oracle e também porque eu não quero esquecer essas dicas! (eu mesmo vivo consultando esse forum e acho dicas que eu mesmo dei que nem lembrava mais!)
Obrigado a todos que colaboram também com o fórum, seja pra dar uma dica, ou mesmo comentar algo!!!!
SQL> select l prime_number
2 from (select level l from dual connect by level <= 100)
3 , (select level m from dual connect by level <= 100)
4 where m<=l
5 group by l
6 having count(case l/m when trunc(l/m) then 'Y' end) = 2
7 order by l
8 /
PRIME_NUMBER
--------------------------------------
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
Outra forma mais rápida que produto cartesiano: (10g apenas)
/* imaginando que a package PKG_UTIL exista e nela tenha sido declarado um REF CURSOR chamado C_CURSOR */
create or replace procedure NUM_PRIMOS(LIMITEMAX IN NUMBER
, p_retorno OUT PKG_UTIL.C_CURSOR) is
begin
OPEN p_retorno for
select P.primos
from (select rownum+1 primos
from user_tables
where rownum < LIMITEMAX
) P
where P.PRIMOs not in ( select y.bb
from ( select rownum+1 aa from user_tables a where rownum < LIMITEMAX) x
, (select rownum+1 bb from user_tables b where rownum < LIMITEMAX) y
where bb<>aa
and mod(bb, aa)=0
and aa<=bb
) ;
end NUM_PRIMOS;