Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2896063
  • 博文数量: 599
  • 博客积分: 16398
  • 博客等级: 上将
  • 技术积分: 6875
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-30 12:04
个人简介

WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606

文章分类

全部博文(599)

文章存档

2014年(12)

2013年(56)

2012年(199)

2011年(105)

2010年(128)

2009年(99)

分类: Oracle

2011-12-23 17:24:02

for 循环可能会遇到ORA-01426: numeric overflow

declare
  v_start binary_double;
  v_end binary_double;
begin
 v_start:=1;
 v_end:=2147483647;
 for i in v_start..v_end loop
   exit;
end loop;
end;
/

在FOR循环中可能会遇到ORA-01426,主要是由于起始值或者结束值超过了2147483647,默认情况下
FOR 循环的数值需要 在-2147483648 到 2147483647之间,否则就会报错。

SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS for IBM/AIX RISC System/6000: Version 10.2.0.4.0 - Productio
NLSRTL Version 10.2.0.4.0 - Production
SQL> declare
  2    v_start binary_double;
  3    v_end binary_double;
  4  begin
  5   v_start:=1;
  6   v_end:=2147483648;
  7   for i in v_start..v_end loop
  8     exit;
  9  end loop;
 10  end;
 11  /
declare
*
ERROR at line 1:
ORA-01426: numeric overflow
ORA-06512: at line 7

SQL> declare
  2    v_start binary_double;
  3    v_end binary_double;
  4  begin
  5   v_start:=1;
  6   v_end:=2147483647;
  7   for i in v_start..v_end loop
  8     exit;
  9  end loop;
 10  end;
 11  /
PL/SQL procedure successfully completed.
SQL> declare
  2    v_start binary_double;
  3    v_end binary_double;
  4  begin
  5   v_start:=-2147483649;
  6   v_end:=2147483647;
  7   for i in v_start..v_end loop
  8     exit;
  9  end loop;
 10  end;
 11  /
declare
*
ERROR at line 1:
ORA-01426: numeric overflow
ORA-06512: at line 7

SQL> declare
  2    v_start binary_double;
  3    v_end binary_double;
  4  begin
  5   v_start:=-2147483648;
  6   v_end:=2147483647;
  7   for i in v_start..v_end loop
  8     exit;
  9  end loop;
 10  end;
 11  /
PL/SQL procedure successfully completed.

即使在11G中也是如此:
SQL> declare
  2    v_start binary_double;
  3    v_end binary_double;
  4  begin
  5   v_start:=1;
  6   v_end:=2147483647;
  7   for i in v_start..v_end loop
  8     exit;
  9  end loop;
 10  end;
 11  /
PL/SQL 过程已成功完成。
以下摘自ORACLE官方联机文档:

The bounds of a loop range can be literals, variables, or expressions but must evaluate to numbers. Otherwise, PL/SQL raises the predefined exception VALUE_ERROR. The lower bound need not be 1, but the loop counter increment or decrement must be 1.

j IN -5..5
k IN REVERSE first..last
step IN 0..TRUNC(high/low) * 2
Internally, PL/SQL assigns the values of the bounds to temporary PLS_INTEGER variables, and, if necessary, rounds the values to the nearest integer. The magnitude range of a PLS_INTEGER is -2147483648 to 2147483647, represented in 32 bits. If a bound evaluates to a number outside that range, you get a numeric overflow error when PL/SQL attempts the assignment. See "PLS_INTEGER Datatype".

 
阅读(7537) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~