NVL (EXPR1,0) против NVL(EXPR1,-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';

1 ответ

Хотя ваши два запроса выглядят одинаково, они могут вести себя по-разному из-за функции NVL, используемой в столбцах предложения ON. Анализируя два вышеупомянутых запроса и их результаты, я пришел к выводу, что любой из столбцов A.A_2 и B.B_2 должен иметь значения как NULL, так и 0(но не значение -1).

Чтобы разрешить "невозможно получить стабильный набор строк в исходных таблицах", необходимо использовать ту же функцию NVL в подзапросе GROUP BY, которая используется в предложении ON.

Другие вопросы по тегам