找出1000以内所有的完数,即一个数等于,其不包含自身的因子之和
declare
i number;
j number;
sum number;
BEGIN
for i IN 1..1000
loop
sum:=0;
for j IN 1..i-1
loop
if mod(i,j)=0 then sum:=sum+j;
end if;
end loop;
if (i=sum)then dbms_output.putline(To_char(i));
end if;
end loop;
end;
希望能帮到刚开始学习的大家啦
declare
i number;
j number;
sum number;
BEGIN
for i IN 1..1000
loop
sum:=0;
for j IN 1..i-1
loop
if mod(i,j)=0 then sum:=sum+j;
end if;
end loop;
if (i=sum)then dbms_output.putline(To_char(i));
end if;
end loop;
end;
希望能帮到刚开始学习的大家啦
解决方案 »
- Oracle如何导入导出XML格式的文件,谢谢
- 请教oracle建表慢的问题
- sql语句困惑???期待解决!!!
- 高手救急:怎样从 Oracle 导出数据到Sql Server?
- ORA-01652: 无法通过256(在表空间TEMP中)扩展 temp 段 如何解决??。。。。
- Window 2003 server 上安装Oracle8i问题。高手请进!
- 一个简单的关于SELECT语句的问题,急!!!
- 初学者帮帮我吧!!
- 请问:Oracle中,将内容转换为字符串和截取字符串的一部分的函数是什么,谢谢了
- 怎么使用ORACLE开发库,而不使用ODBC来访问数据库。
- scott用户下建了DDL触发器,无法删除怎么办?
- oracle基础操作
第一个,您的代码在我的环境上,执行不了,有一些内容,需要修改,以下是修改后的内容。
DECLARE
i NUMBER;
j NUMBER;
n_sum NUMBER;
BEGIN
i := 0;
n_sum := 0;
FOR i IN 1..1000 LOOP
n_sum := 0;
FOR j IN 1..i - 1 LOOP
IF
MOD(i,j) = 0
THEN
SELECT
n_sum + j
INTO
n_sum
FROM
dual; END IF;
END LOOP; IF
i = n_sum
THEN
dbms_output.put_line(i);
END IF;
END LOOP;END;第二,代码块,只有在数据量很大,或者业务逻辑很复杂的情况下,才会用。程序员拼的是逻辑,而不是体力。这个问题,可以通过直接查询获取,不需要些代码块循环。
时间有点仓促,没有仔细看,应该还有优化的余地,供大家分享一下。
以下语句,可以查询到10000以内的完数。
WITH
TAB1 AS (SELECT LEVEL L FROM DUAL CONNECT BY LEVEL <= 10000),
TAB2 AS (SELECT T1.L L1,T2.L L2 FROM TAB1 T1 JOIN TAB1 T2 ON MOD(T2.L,T1.L) = 0 AND T2.L > T1.L),
TAB3 AS (SELECT L2,SUM(L1) L1 FROM TAB2 GROUP BY L2)
SELECT L1 FROM TAB3 WHERE L2=L1 ORDER BY 1;
不太建议用sum这种关键词当变量名,后面的putline应该是PUT_LINE把 这样就可以跑起来了