谁能解释我这个程序我发现很难理解,因为我是plsql的新手

时间:2016-03-30 15:13:04

标签: oracle plsql oracle11g

我正在尝试输出动态接受的号码并打印接受号码中的位数

 WHILE N !=0
  LOOP

  R:=MOD(N,10);
  CNT:=CNT+1;
  N:=TRUNC(N/10);

  END LOOP;

我只是想知道它如何正确理解我用我的逻辑尝试了这个程序,我得到了我需要但是这个源代码很难理解,我想知道这是如何工作的,为什么mod用于这段代码虽然没有使用它,但我得到了正确的输出?为什么在这里使用截断?*

2 个答案:

答案 0 :(得分:1)

这会创建一个循环,以查看您可以将数字除以10的时间。

N = 1234

循环中断条件为N != 0,因此请进入循环。

这并不是必要的,因为你可以看到你在其他任何地方都不使用R

 R := MOD(N,10); 

然后计算第一个数字

 CNT:=CNT+1;

并且

 N:=TRUNC(N/10); -- Return N = 123 instead of 123.4

CNT=2返回N = 12
CNT=3返回N = 1
CNT=4返回N = 0

并结束循环,因为N == 0撤退CNT = 4

答案 1 :(得分:1)

重新格式化和编号你的行:

1. WHILE N !=0 LOOP
2.   R:=MOD(N,10);
3.   CNT:=CNT+1;
4.   N:=TRUNC(N/10);
5. END LOOP;
  • 第1行和第1行5将保持循环,而N非零(即有更多数字)。
  • 第2行将获得最低有效数字的值 - 但是这不会在任何地方使用,因此可以忽略该行。
  • 第3行增加位数的计数(我假设在{/ 1}}早先在PL / SQL块的某处声明了。{/ li>
  • 第4行将值除以10,然后使用CNT来丢弃结果的小数部分 - 如果你没有丢弃结果的小数部分,那么循环永远不会终止,如果{{1然后TRUNC()也永远不会为零。

执行相同计算的单行方法是使用对数:

N != 0
  • N/10获取CNT := CEIL( LOG( 10, ABS( N ) ) );
  • 的绝对值(即忽略任何负号)
  • ABS()获取N
  • 的对数,基数为10
  • LOG( 10, N )将所有小数部分四舍五入以得到整数。
相关问题