在PLSQL中混淆Division运算符的行为

时间:2014-03-28 15:17:38

标签: sql oracle plsql

我是一个用于反转数字的PLSQL语句。

,代码就是这个

declare
 num5 int:=54321;
 revnum int:=0;
 temp int;
 num int;
begin
 num:=num5;
 while(num5>0)
 loop
  temp:=mod(num5,10);
  num5:=num5/10;
  revnum:=revnum*10+temp;
 end loop;
dbms_output.put_line('Original number is '||num);
dbms_output.put_line('Reverse number is '||revnum);
end;
/ 

我得到的输出是 :

原始号码是54321

反向数字是123451

对我来说,代码似乎没问题, 为什么我会得到额外的' 1'

为了进一步挖掘,我尝试将一个小于十的数字除以后仍然得到1而不是' 0&#39 ;;

这里发生了什么?

我尝试过的示例代码。

declare 
 num int:=6;
 res int;
begin
 res:=num/10;
 dbms_output.put_line(res);
end;
/

这里的输出也是1而不是0.为什么会这样?

2 个答案:

答案 0 :(得分:2)

您正在使用整数。 6/10四舍五入为1

declare 
 num1 number;
 num2 int;
begin
 num1 := 6/10;
 num2 := 6/10;
 dbms_output.put_line(num1);
dbms_output.put_line(num2);

end;
/

结果

.6
1

你需要一个围绕num5 / 10的截断。否则循环会进入另一个循环。 (5/10)= .5四舍五入为1.

declare
 num5 int:=715143212;
 revnum int:=0;
begin
 dbms_output.put_line('Original number is '||num5);
 while num5 > 0
 loop
    revnum := revnum * 10;
    revnum := revnum + mod(num5,10);
    num5 := trunc(num5/10);
 end loop;
dbms_output.put_line('Reverse number is  '||revnum);
end;
/ 

答案 1 :(得分:0)

如果我说你要反转一个数字(或字符串),我理解你的问题? 因此2468变为8642.我认为还有另一种方法可以实现这一点。

declare

  num5 int:=54321;
  revnum int:=0;
  temp int;
  num int;

  lv_num5       varchar2(100);
  ln_num5       number(3);
  lv_rev_num5   varchar2(100) := null;
  ln_rev_num5   number(3);

begin

  lv_num5 := to_char(num5);
  ln_num5 := length(lv_num5);

  for x in reverse 1..ln_num5   -- From the last digit to the first digit

    lv_rev_num5 := lv_rev_num5||substr(lv_num5, x, 1);

  end loop;

  ln_rev_num5 := to_number(lv_rev_num5);

  dbms_output.put_line('1- Original number is '||num5);
  -- Or
  dbms_output.put_line('2- Original number is '||lv_num5);
  dbms_output.put_line('Reverse number is '||ln_rev_num5);

end;
/ 

我希望这个解决方案也适合你。

问候 卡洛斯