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.