2014-09-23 2 views
0

У меня есть файл, содержащий список 5000 идентификаторов записей в таблице.sqlplus, слишком длинный ввод, когда SELECT длинным списком id

Пример: id_list.txt

('12345', '23456', '34567', ..., '65432') 

Я хочу, чтобы выбрать записи, используя следующую команду в Linux:

id_list=`cat id_list.txt` 
sqlplus -s user/[email protected] <<END 
    select company_name, company_status, count(*) 
    from printing_request 
    where request_id in ${id_list} 
    group by company_name, company_status; 
END 

Чтобы объяснить, таблица printing_request где многие компании могут отправить много запросов на печать их документов. Если запрос будет завершен, его статус будет изменен с I на C.

Я ожидаю, что выход был что-то вроде этого

company_name | company_status | count 
AA   | I    | 1000 
AA   | C    | 1234 
BB   | I    | 2334 
... 

Но я получил ошибку Input is too long (> 2499 characters)

Не-решение, которое я могу думать только о том, чтобы разбить на ID_LIST на множество списков и петли для выбора много раз. Но когда я думаю о том, сколько циклов он должен выполнить, и как мне в итоге придется делать группировку и подсчитывать вручную после этого, я отказываюсь от этого решения.

+5

В Oracle SQL, 'IN' список констант допускается иметь только 1000 элементов. Поэтому, даже если вы решите текущую проблему, вы столкнетесь с лимитом SQL. Этот файл находится на сервере базы данных? Если да, можете ли вы создать внешнюю таблицу поверх нее? Если нет, можете ли вы использовать SQL * Loader для загрузки идентификаторов в таблицу на сервере, которую вы указываете в инструкции 'SELECT'? –

+0

Я спрашиваю своего руководителя о SQL * Loader и, что удивительно, она дала мне код для загрузки моих данных во вновь созданную временную таблицу. Большое спасибо. – asinkxcoswt

ответ

1

Если вы столкнулись с «слишком длинным списком», то идентификаторы, конечно же, не были введены вручную. Они, должно быть, были выведены из чего-то другого, и, возможно, это «что-то еще» уже есть в вашей базе данных. Попробуйте перефразировать ваш выбор, принимая это во внимание.

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

Как эти идентификаторы попадают в файл в первую очередь? Кто бы там ни разместил их, не мог ли она сразу же поместить его в БД? Это решит все ваши проблемы.

0

1) создать глобальную временную таблицу с идентификатором столбца

2) генерировать 5000 вставки инструкций в эту таблицу из SQLPlus

3) изменить ваш запрос, чтобы присоединиться к этой таблице