PL / SQL L oop через список и найти значения, которых нет в таблице базы данных - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть список имен. Но этот список довольно большой (более 10000 наименований). Я хочу go через этот список значений и перечислить значения, которых нет в таблице.

Мне удалось придумать это,

 select i.column_value as country_code
 from table(SYS.DBMS_DEBUG_VC2COLL('AU', 'IN', 'ZA', 'DK', 'CH', 'NL')) i
 where not exists (select null
                   from country c
                   where c.country_code = i.column_value)

, но это ограничивает количество значений, которое должно быть предоставлено функции как 1000. Таким образом, я не могу дать полный список сразу

ORA-00939: too many arguments for function

Кто-нибудь знает решение этой проблемы.

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Если вы действительно застряли с фиксированными списками значений, вы можете объединить несколько выражений коллекции таблиц в подзапросе (встроенное представление):

select i.column_value as country_code
from (
  select * from table(SYS.odcivarchar2list(
    'AU', 'IN', 'ZA', 'DK', 'CH', 'NL' -- up to 999 entries
  ))
  union all
  select * from table(SYS.odcivarchar2list(
    'AU', 'IN', 'ZA', 'DK', 'CH', 'NL' -- up to 999 entries
  ))
) i
where not exists (select null
                  from country c
                  where c.country_code = i.column_value)

Я склонен использовать odcivarchar2list вместо dbms_debug_vc2coll, но он должен работать с любым из них.

Если данные находятся в файле и вы можете сделать их доступными на сервере базы данных, вы можете загрузить их как внешняя таблица, что потребует меньше ручной работы.

0 голосов
/ 14 февраля 2020

Согласитесь с Алексом, что внешняя таблица - это путь к go, при условии, что у вас есть разрешения на создание каталога и копирование файла на сервер базы данных. Быстрый выбор - запросить all_directories существующих каталогов и посмотреть, есть ли у вас доступ для копирования туда вашего файла. Кроме того, dba_external_tables покажет вам существующие внешние таблицы (если таковые имеются), которые вы можете описать, чтобы показать синтаксис.

Если вам не хватает разрешений, вы можете изучить SQL Loader sqlldr, чтобы загрузить коды из необработанного файла в таблицу базы данных, что упростит ваш запрос и быстрее.

В sqlldr используйте OPTIONS (DIRECT=TRUE, PARALLEL=TRUE) UNRECOVERABLE для ускорения загрузки.

Удачи и общайтесь здесь, если вам нужна дополнительная помощь.

...