我们有一个oracle存储过程(sp),其中有一个select查询,它调用一个内部函数(根据输入参数执行一些加法或减法),比如()。问题是,当我们使用sqldeveloper直接运行sp时,sp返回正确的结果,但是当我们使用jdbc从java应用程序调用sp时,它返回错误的结果(对于相同的输入参数)。
通过分析,我们发现函数()被n个记录调用了n+1次。任何输入,为什么它的行为不同,这取决于它从何处被调用?
选择查询
SELECT * FROM (
SELECT
count(1) over(order by col1,col2) as row_count,
col1,
col3,
col4,
abc(col4,col5,col6) AS balance,
col6,
col5,
col2,
row_number() over(order by col1,col2) rn
FROM tableA ORDER BY col1, col2 )
WHERE rn BETWEEN 1 AND 1000;
功能
FUNCTION abc(col4 IN NUMBER,
col5 IN NUMBER,
col6 VARCHAR2) RETURN NUMBER
IS
BEGIN
IF col5='4' AND col6='XYZ' THEN
global_value:=global_value + col4;
ELSE
global_value:=global_value - col4;
END IF;
RETURN global_value;
END abc;
样本数据
col1 col2 col3 col4 col5 col6
20200103 11 0 86.4 1 XYZ
20200115 11 0 86.4 1 XYZ
20200120 11 0 86.4 1 XYZ
20200210 11 0 86.4 1 XYZ
20200203 11 0 86.4 1 XYZ
20200224 11 0 86.4 1 XYZ
20200218 11 0 86.4 1 XYZ
20200309 11 0 86.4 1 XYZ
20200302 11 0 86.4 1 XYZ
20200309 11 null 86.4 4 XYZ
20200302 11 null 86.4 4 XYZ
结果jdbc调用vs sqldeveloper运行
(jdbccall) (sqldev execution)
balance balance
1213.6 1213.6
1127.2 1127.2
1040.8 1040.8
954.4 954.4
868 868
781.6 781.6
695.2 695.2
608.8 608.8
695.2 695.2
608.8 608.8
522.4 695.2
608.8
全局值是全局变量,初始值为1300
暂无答案!
目前还没有任何答案,快来回答吧!