PL/SQL: UPDATE внутри CURSOR, но некоторые данные имеют значение NULL

Я все еще изучаю некоторые различия PL/SQL, так что это может быть простой вопрос, но... вот.

У меня есть курсор, который захватывает кучу записей с несколькими полями. Затем я запускаю два отдельных оператора SELECT в LOOP из результатов курсора, чтобы получить некоторые расстояния и вычислить эти расстояния. Эти работают отлично.

Когда я обновляю таблицу новыми значениями, моя проблема заключается в том, что есть четыре части конкретных критериев.

update work
        set kilometers = calc_kilo,
            kilo_test = test_kilo                                  
        where lc = rm.lc
        AND ld = rm.ld
        AND le = rm.le
        AND lf = rm.lf
        AND code = rm.code
        AND lcode = rm.lcode
        and user_id = username;

Моя проблема в том, что это редко обновляется, потому что rm.lf и rm.le имеют значения NULL в базе данных. Как я могу бороться с этим, и создать правильное обновление.


person jlrolin    schedule 26.03.2009    source источник
comment
Кроме того, поскольку я нахожусь в курсоре, использование IS NULL потребует оператора IF или чего-то еще, и я не могу правильно понять синтаксис. Я полагаю, что пропуск операторов сработает, но операторы IF, похоже, дают ошибки компилятора.   -  person jlrolin    schedule 26.03.2009


Ответы (2)


Если я правильно вас понимаю, вы хотите сопоставить lf с rm.lf, в том числе, когда они оба нулевые? Если это то, что вы хотите, то это сделает это:

...
AND (lf = rm.lf 
  OR (lf IS NULL AND rm.lf IS NULL)
)
... 

Он сравнивает значения lf и rm.lf, которые вернут false, если одно из них равно нулю, поэтому условие OR возвращает true, если они оба равны нулю.

person Welbog    schedule 26.03.2009
comment
rm.lf МОЖЕТ быть NULL от курсора при любом проходе цикла. Значит, это не условие. Это может быть lf = 10 на одном проходе, а на следующем проходе lf = NULL. Проблема в том, что lf = NULL недопустимо. Если IS NULL является допустимым. Как мне создать это внутри цикла, когда данные постоянно меняются. - person jlrolin; 26.03.2009
comment
Сработало... Должно быть, у меня на минуту мозги пукнули. Большое спасибо. - person jlrolin; 26.03.2009
comment
Снова то же самое решение, которое используют многие люди: ... AND nvl(lf,'N/A') = nvl(rm.lf, 'N/A') ... nvl - это функция, которая говорит, что первый параметр не нулевой, то верните его, иначе верните второй параметр. - person darreljnz; 26.03.2009

У меня есть курсор, который захватывает кучу записей с несколькими полями. Затем я запускаю два отдельных оператора SELECT в LOOP из результатов курсора, чтобы получить некоторые расстояния и вычислить эти расстояния. Эти работают отлично.

Когда я обновляю таблицу новыми значениями, моя проблема заключается в том, что есть четыре части конкретных критериев.

Первое, на что я бы обратил внимание, это не использование курсора для чтения данных, затем выполнения вычислений, а затем выполнения обновлений. В 99% случаев быстрее и проще просто запускать обновления, которые делают все это за один шаг.

person David Aldridge    schedule 26.03.2009