NVL(EXPR1,0)vs NVL(EXPR1,-1)

时间:2017-02-16 07:11:57

标签: sql oracle nvl

MERGE INTO A
USING (  
    SELECT B_1,B_2,B_3,SUM(B_4)
    FROM B
    GROUP BY B_1,B_2,B_3) srt
ON (
    A.A_1 = B.B_1
    AND NVL (A.A_2, 0) =
            NVL (B.B_2, 0)
    AND NVL (A.A_3, ' ') =
            NVL (B.B_3, ' ') )
WHEN MATCHED
THEN   'DML STATEMENT';

上面抛出错误

  

引起:java.sql.SQLException:ORA-06502:PL / SQL:数值或值   错误:字符到数字转换错误ORA-30926:无法获取   源表中的稳定行集

但是当您使用以下NVL(EXPR,-1)替换上述查询时,它可以正常工作而不会出现任何错误。有人能预见到我无法看到的任何理由吗?

MERGE INTO A
USING (  
    SELECT B_1,B_2,B_3,SUM(B_4)
    FROM B
    GROUP BY B_1,B_2,B_3) srt
ON (
    A.A_1 = B.B_1
    AND NVL (A.A_2, -1) =
            NVL (B.B_2, -1)
    AND NVL (A.A_3, ' ') =
            NVL (B.B_3, ' ') )
WHEN MATCHED
THEN   'DML STATEMENT';

1 个答案:

答案 0 :(得分:2)

虽然您的两个查询看起来相似,但由于ON子句列中使用的NVL函数,它们的行为可能会有所不同。分析以上两个查询及其结果,我得出的结论是,列A.A_2和B.B_2中的任何一个都必须具有NULL和0(但不是值-1)的值。

要解决"无法在源表中获得稳定的行集" ,您必须在正在使用的GROUP BY子查询中使用相同的NVL函数在ON条款中。