Я предлагаю немного другой подход к проблеме: материализуйте этот список значений :new.
в качестве набора результатов.Это позволит вам обработать его так же, как таблицу.
Этот запрос ниже вернет счетчик значений :new.
, которые не равны NULL и не соответствуют коду вТаблица pdv_validcodes.
SELECT COUNT(1)
INTO cnt
FROM (
SELECT q.spec
FROM ( SELECT :new.spec_1 AS spec FROM DUAL
UNION ALL SELECT :new.spec_2 FROM DUAL
UNION ALL SELECT :new.spec_3 FROM DUAL
UNION ALL SELECT :new.spec_4 FROM DUAL
UNION ALL SELECT :new.spec_5 FROM DUAL
UNION ALL SELECT :new.spec_6 FROM DUAL
UNION ALL SELECT :new.spec_7 FROM DUAL
UNION ALL SELECT :new.spec_8 FROM DUAL
UNION ALL SELECT :new.spec_9 FROM DUAL
UNION ALL SELECT :new.spec_10 FROM DUAL
UNION ALL SELECT :new.add_spec_1 FROM DUAL
UNION ALL SELECT :new.add_spec_2 FROM DUAL
UNION ALL SELECT :new.add_spec_3 FROM DUAL
UNION ALL SELECT :new.add_spec_4 FROM DUAL
UNION ALL SELECT :new.add_spec_5 FROM DUAL
) q WHERE q.spec IS NOT NULL
) p
LEFT
JOIN pdv_validcodes c
ON c.code = UPPER(p.spec) AND c.code_type = 'YNNA'
WHERE c.code IS NULL
Вот как это работает:
Сначала мы возвращаем список значений :new.
в качестве результирующего набора,(Это встроенное представление с псевдонимом q
.)
Далее мы исключаем все значения NULL из этого набора результатов.(Это встроенное представление с псевдонимом p
.)
Далее мы объединяем этот набор результатов с таблицей pdv_validcodes
.(Мы сопоставляем только с 'YNNA'
code_type и выполняем сопоставление как соединение OUTER (LEFT JOIN
), чтобы мы возвращали все строки из набора результатов p,соответствуют ли они коду в таблице pdv_validcodes
.
В качестве последнего шага мы исключаем все строки, для которых найдено совпадение (c.code
будет NULL
, где строки из p
не будут совпадать), в результате чего у нас будет список значений :new.
, для которых естьне было совпадений.
ПРИМЕЧАНИЯ:
Этот запрос вернет счетчик нуля при совпадении всех: новых значений и вернет ненулевой счет, если естьany: new. значения, для которых совпадение не найдено (я думаю, что оно инвертировано из оригинала)
Возможно, это не лучший способ выполнения операции, но он устраняет большую часть избыточного кодаэто было в исходном запросе.
Литерал 'YNNA' указывается только один раз, и каждое из выражений: new.процитировано только один раз.
Я предполагаю, что типы данных всех этих: новые.выражения совместимы (например, все VARCHAR), так как мы отмечаем, что все они сравниваются со столбцом кода.Если это не так, то в исходном запросе происходит неявное преобразование типов данных, которое, вероятно, необходимо будет сделать явным в этом, чтобы сработала операция UNION ALL.)
Общее табличное выражениебудет работать как замена для (старой школы) встроенного представления.
Этот код еще не проверен.