如何打印非素数?PL/SQL

the*_*ace -3 database oracle plsql

此代码用于打印1到30之间的非素数.它是如何工作的以及错误在哪里.

BEGIN  
    <<outer>>
    FOR i in 1..30
        <<inner>> 
        for k in 2..i-1 loop 
            if (mod(i, k) = 0) THEN 
                DBMS_OUTPUT.PUT_LINE(i);
                exit inner when (mod(i, k)= 0);
            end if;
        end loop inner
    end loop outer 
end;
Run Code Online (Sandbox Code Playgroud)

APC*_*APC 5

喝咖啡休息时间,所以这里是一个纯粹的SQL实现.

with data as ( select level as n# from dual 
               connect by level <= 30 )
select distinct d1.n#
from data d1 cross join data d2
where d1.n# > d2.n#
and d2.n# != 1
and mod(d1.n#, d2.n#) = 0
order by d1.n#
Run Code Online (Sandbox Code Playgroud)

虚伪?哎呀!


该解决方案具有与@TYH在PL/SQL解决方案中指出的相同的低效率.这就是它需要的原因distinct.可能这可以通过递归CTE进行优化(仅适用于11gR2).