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, 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';
4

1 回答 1

2

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

要解决“无法在源表中获得一组稳定的行”,您必须在 GROUP BY 子查询中使用与 ON 子句中使用的相同的 NVL 函数。

于 2017-02-16T07:59:59.090 回答