JAVA存储过程出现ORA-24345错误
上一篇 / 下一篇 2008-08-18 23:50:52 / 个人分类:ORACLE
写了一个简单的JAVA存储过程,处理一个精度较大的数学问题,结果碰到了ORA-24345错误。
由于对JAVA不熟悉,JAVA存储过程也很少使用,因此费了不少时间,总算写了出来,但是在执行的时候发现了一个问题。
这个存储过程是用来计算圆周率的取值的,相关算法可以参考:http://yangtingkun.itpub.net/post/468/468870
关于存储过程就不详细描述了,下面直接看问题的产生:
SQL> create or replace and compile java source named "pi" as
woBM;B0 2 import java.math.BigDecimal;
AOJ @5Q/aa!B0 3 public class pi extends Object
#s
zR#};G0b0 4 {ITPUB个人空间;@!|-@o p[4l%?:iI;S
5 public static String pi (int n)
fs~;J"|?7g2I9iF0 6 {ITPUB个人空间&`*q-z,XTLv `
h
7 BigDecimal result = new BigDecimal(1);ITPUB个人空间R#mY1zx
8 for (int i=n;i>0;i--)ITPUB个人空间 `)p `2Bx!_M
9 {ITPUB个人空间2u&GEoM(XKo
10 BigDecimal temp = new BigDecimal(i);ITPUB个人空间;I,@i!P7Bed
11 result = new BigDecimal(2).addITPUB个人空间c(V~mu8g:R
12 (result.multiply
#gR2n~Ln sFHLZ
\0 13 (temp.divide(new BigDecimal(1).add
bJf6p#hq0 14 (temp.multiply
/kz},BX
? pH0 15 (new BigDecimal(2))ITPUB个人空间FOQ)f4s?
16 ),102,BigDecimal.ROUND_HALF_UP)
:@\9l_-yE`1m0 17 )ITPUB个人空间%G|iI"p%_6~-XX
18 );ITPUB个人空间Ov!uR8vPB*s
19 }ITPUB个人空间B7e%wD1h!r
20 return result.toString();
9k!u,V9y2b0 21 }
k(f-C(J[0 22 }ITPUB个人空间2~+Yk*b6L*_
23 /
Java已创建。
SQL> create or replace function f_pi (p_n in number) return varchar2 asITPUB个人空间5B h(Z/r-}]Z
2 language java name 'pi.pi(int) return String';
3CK*UI
Kz~m|G_
y0 3 /
函数已创建。
下面是调用结果:
SQL> select f_pi(10) from dual;
F_PI(10)
F:JA BO$u0----------------------------------------------------------------------------------------------------
0xh3ddi-K%b03.14084209564085725076437150740556313311731268387615136841143033093497489782319503681732783899966562
SQL> select f_pi(20) from dual;
F_PI(20)ITPUB个人空间2E0y YG2`k:iL4cK
----------------------------------------------------------------------------------------------------
.w.e,vL,^a03.14159211320774327955203808659259711079349608208228689356906807763678437061385664739133875908352702
SQL> select f_pi(50) from dual;ITPUB个人空间"Ie:n ~
Ple
select f_pi(50) from dualITPUB个人空间k-s%TC0F-jQFvj
*
0z$H-_5X6O9_'DV1H0第1行出现错误:ITPUB个人空间)k3X'q#V
a,ST v_eW
ORA-24345:出现截断或空读取错误
`#W7t4`5X:i^0ERROR:
R,O7g8Y Z1zx2[Qt0ORA-01002:提取违反顺序
未选定行
数据量比较小的时候没有问题,一旦输入参数值比较大,就会出现上面的这个错误。
测试还发现,如果将java存储过程中的除法保留小数位数缩小一些,上面的查询就可以得到结果,但是如果继续增大数据量仍然会导致错误:
SQL> create or replace and compile java source named "pi" as