我正在尝试在PL / SQL中为阿姆斯特朗编写一个程序。任何人都可以告诉我哪里错了?

时间:2016-04-03 20:53:44

标签: oracle plsql oracle11g plsqldeveloper

while  N !=0
LOOP

R:=MOD(N,10);
R1:=power(R,3);
A:=A+R1;
N:=TRUNC(N/10);

END LOOP;

在此之后,如果N = A那么 SYS.DBMS_OUTPUT.PUT_LINE('number is armstrong'); 其他 SYS.DBMS_OUTPUT.PUT_LINE('号码不是武器');

2 个答案:

答案 0 :(得分:1)

你的问题是比较(N = A),因为在LOOP结束时N为零。然后,您必须将A与输入的原始数字进行比较,(NOrig = A)。 这个程序你可以帮忙:

create or replace procedure amstrong_number(pNumber int)
is

  NOrig int:=0;
  N int:=0;
  R int:=0;
  R1 int:=0;
  A int:=0;

begin

  NOrig:=pNumber;
  N:=pNumber;

  WHILE N!= 0
  LOOP

    R:=MOD(N,10);
    R1:=POWER(R,3);
    A:=A+R1;
    N:=TRUNC(N/10);

  END LOOP;

  IF NOrig = A THEN
    dbms_output.put_line(' number is amstrong ');
  ELSE
    dbms_output.put_line(' number is not an amstrong ');
  END IF;

end;

此致

答案 1 :(得分:0)

在评论中,您说您想从键盘输入用户输入。目前尚不清楚你打算如何做到这一点;一般来说,PL / SQL没有与最终用户交互的工具,它是一种在服务器上进行处理的语言。

让用户提供号码的一种方法是使用带参数的过程。下面是一个如何做到这一点的例子。您必须首先编译该过程(例如,我将其保存在脚本中,“Armstrong.sql”,然后在SQL * Plus中运行命令“start Armstrong”)。然后用户可以使用我称之为is_Armstrong的过程,来自SQL * Plus或SQL Developer或Toad之类的图形界面,如下所示:exec is_Armstrong(...)其中括号中是用户的输入数字。

我内置了两个应用程序异常检查 - 对于负数或非整数以及太长(超过20位)的数字。我为阿姆斯特朗编写了任意长度的数字(< = 20),将其限制为三位数几乎不能保存任何工作,所以为什么不把它变成一般。还有其他可能的应用程序例外 - 例如,如果用户输入字符串而不是数字怎么办?我没有处理所有错误 - 下面的最后一个例子显示了一个未处理的错误。为你想要明确处理的任何其他内容编写自己的错误处理代码。

Armstrong.sql的内容:

create or replace procedure is_Armstrong(p_input_number number)
as
   l_string varchar2(20);
   l_sum number := 0;
   l_loop_counter number;
   l_len number;
   not_a_positive_integer exception;
   number_too_large exception;
begin
   l_string := to_char(p_input_number); 
   l_len    := length(l_string);    
   if p_input_number <= 0 or p_input_number != floor(p_input_number) then
      raise not_a_positive_integer;
   elsif l_len > 20 then
      raise number_too_large;
   end if;
   for l_loop_counter in 1..l_len
   loop
      l_sum := l_sum + power(to_number(substr(l_string, l_loop_counter, 1)), l_len);
   end loop;
   if p_input_number = l_sum then
      dbms_output.put_line('Number ' || l_string || ' is an Armstrong number.');
   else 
      dbms_output.put_line('Number ' || l_string || ' is not an Armstrong number.');
   end if;
exception
   when not_a_positive_integer then
      dbms_output.put_line('Input number must be a positive integer.');
   when number_too_large then
      dbms_output.put_line('Input number must be no more than twenty digits.');
end;
/

编写程序:

SQL> start Armstrong.sql
Procedure created.
Elapsed: 00:00:00.03

用法示例:

SQL> exec is_Armstrong(-33);
Input number must be a positive integer
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.08

SQL> exec is_Armstrong(1.5);
Input number must be a positive integer
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.08

SQL> exec is_Armstrong(1234512345123451234512345);
Input number must be no more than twenty digits
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.01

SQL> exec is_Armstrong(3);
Number 3 is an Armstrong number.
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.00

SQL> exec is_Armstrong(100);
Number 100 is not an Armstrong number.
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.00

SQL> exec is_Armstrong(371);
Number 371 is an Armstrong number.
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.00

SQL> exec is_Armstrong('abc')
BEGIN is_Armstrong('abc'); END;
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 1
Elapsed: 00:00:00.00