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

person Rohan K    schedule 16.02.2017    source источник
comment
Это странно. Каковы типы данных для столбцов? Можете ли вы показать операторы CREATE TABLE для обеих таблиц? Вы пробовали это вне Java?   -  person Thorsten Kettner    schedule 16.02.2017
comment
*_1 и *_3 — это varchar, а *_2 — число. Я попробовал это в хранимой процедуре, вызванной из java-программы.   -  person Rohan K    schedule 16.02.2017
comment
Это фиксированное утверждение? Или динамический SQL?   -  person Thorsten Kettner    schedule 16.02.2017
comment
Фиксированный. Не используются exec или динамические значения или значения реального времени...   -  person Rohan K    schedule 16.02.2017
comment
Единственный недостаток, который я могу заметить, заключается в том, что вы обращаетесь к B в предложении ON, где B не может быть известно; должно быть srt.   -  person Thorsten Kettner    schedule 16.02.2017


Ответы (1)


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

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

person Ram Limbu    schedule 16.02.2017