当使用jdbc调用时,select查询中的java函数被n行调用n+1次

oewdyzsn  于 2021-06-26  发布在  Java
关注(0)|答案(0)|浏览(180)

我们有一个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

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题