Sql NVL(EXPR1,0)与NVL(EXPR1,-1)

Sql NVL(EXPR1,0)与NVL(EXPR1,-1),sql,oracle,nvl,Sql,Oracle,Nvl,上面抛出了一个错误 原因:java.sql.SQLException:ORA-06502:PL/sql:numeric或value 错误:字符到数字转换错误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) s

上面抛出了一个错误

原因:java.sql.SQLException:ORA-06502:PL/sql:numeric或value 错误:字符到数字转换错误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, 0) =
            NVL (B.B_2, 0)
    AND NVL (A.A_3, ' ') =
            NVL (B.B_3, ' ') )
WHEN MATCHED
THEN   'DML STATEMENT';

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


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

这很奇怪。列的数据类型是什么?能否显示两个表的CREATETABLE语句?你在Java之外试过这个吗?*\u 1和*\u 3是varchar,而*\u 2是number。我在一个java程序调用的存储过程中尝试了这个方法。这是一个固定语句吗?还是动态SQL?修复了一个。没有使用exec或动态或实时值…我能发现的唯一缺陷是,您在ON子句中访问
B
,其中
B
是未知的;它应该是
srt
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';