powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Select id in (1, 2, 3 ... n)
26 сообщений из 26, показаны все 2 страниц
Select id in (1, 2, 3 ... n)
    #39417088
nnn2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется БД Oracle 9i и количество непоследовательных id около 10000.
Необходимо выполнить Select * from TBL where id in (1000, 2103, 7320, ... 21248);
Вносить изменения в БД запрещено разработчиком, можно только select. Таким образом создавать таблицы с перечнем id нельзя. Временные таблицы, насколько я понял из статьи http://www.sql.ru/blogs/oracleandsql/1373 вносят изменения: "После создания временной таблицы ее описание сохраняется в словаре данных ORACLE...".
1. Правильно ли я понимаю, что единственный выход -select id in (....., n)?
2. И тогда, какое ограничение на перечень? Где-то на форуме нашел ограничение в 1000. Так ли?
3. Слабое железо на сервере и мало памяти. Какое оптимальное количество в перечне, что бы не повесить сервер вообще и оставить небольшой запас ресурсов для других задач, хотя бы что бы сервер отвечал?
Спасибо!
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39417093
Фотография Anton_Demin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nnn2k,

Сформулируйте, пожалуйста, конкретнее, что вам надо?
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39417094
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nnn2k,

Код: plsql
1.
select tbl.* from table(table_of_number) n join tbl on tbl.id = n.column_value

?
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39417095
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nnn2k,
создай отдельную схему, создай там табилцу залей туда данные и дай грант нужной схеме на селект. и не делай мозги себе и людям.
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39417097
trace.log
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nnn2k,

ну сделайте подзапрос, ваши id-ки попадают же под выборку и какие-нибудь условия.
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39417206
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nnn2kИмеется БД Oracle 9i и количество непоследовательных id около 10000.
Необходимо выполнить Select * from TBL where id in (1000, 2103, 7320, ... 21248);
..
1. Правильно ли я понимаю, что единственный выход -select id in (....., n)?
..
Спасибо!
как раз неправильно
воткнётесь в лимит 1000

и тема обсуждалась не единожды. ищите
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39417217
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nnn2k1. Правильно ли я понимаю, что единственный выход -select id in (....., n)?
Спасибо!

select * from t where (id,1) in ((1000,1), (2103,1), (7320,1), ... (21248,1));

пар (a,b) можно больше 1000

......
stax
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39417306
nnn2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anton_Deminnnn2k,

Сформулируйте, пожалуйста, конкретнее, что вам надо?
Еженедельно присылается xml файл где содержится ~10000 разных id, по этим id надо делать выборку из БД Oracle, в которую нельзя вносить изменения - нельзя вмешиваться в структуру БД, нельзя создавать дополнительные таблицы типа "table_of_numbers". Написав запрос Select * from TBL where id in (..... 10000) он получится огромного размера и Oracle его просто не пропустит по лимиту. Создавать 10000 выборок (select * from TBL where id=1; select * from TBL where id=15; ...) - столько запросов будет выполнятся слишком долго и, наверное, подвесит сервер.

--Eugene--,
Для создания коллекции table_of_numbers придется вносить изменения в схему, чего нельзя делать по условиям.

trace.log,
id лежат отдельно в xml файле.

orawish,
Можно распределить 10'000 id по 10 запросам по 1'000 id. Всяко быстрее чем 10'000 отдельных запросов по одному id.
Много тем на эту тему, но из всего что нашел - чаще предложения о временных таблицах, что, предположительно, вносит изменения в схему и запрещено разработчиком БД.

stax..,
Справится ли слабый сервер с таким запросом или повиснет на час? В ближайшее время не могу его так протестировать. Может у Вас был опыт по времени исполнения подобного запроса.

Vint,
Вероятно это самый простой и безболезненный способ, им и воспользуюсь. Спасибо за мысль!

Спасибо всем за ответы! Использую вариант Vint'а, так как остальные возможности не подходят по условиям использования БД без изменений или вопрос с нагрузкой на БД.
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39417311
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nnn2kxml файл где содержится ~10000 разных id, по этим id надо делать выборку из БД Oracle, в которую нельзя вносить изменения
Код: plsql
1.
... where id in (select ... from xmltable('...' passing xmltype(:clob) columns ...))
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39417316
nnn2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь, совсем запутался в структуре Oracle, не часто с ним работаю.
Доп. условия: есть пользователь USER_BUH, в нем набор данных, который надо получить (select * from TBL), имея много id из xml файла.
Получается, что и схему в пользователе я не могу новую создать, так как запрет распространяется на всего пользователя. Создавать нового пользователя (USER_TMP_TBL) только ради таблицы с id номерами - не рационально, полагаю. Да и разрешения надо же сохранять внутри основного пользователя USER_BUH, в которого логинится программа оператора (сотрудника), что опять запрещено. Вероятно придется вернуться к разбивке диапазона id по нескольким выборкам (~10000 по 10-20 выборкам select).

Хотя, поразмыслив, описание временных таблиц же сохраняются в словарь Oracle, который является системным, а не пользовательским, вроде как. Остается надеяться, что это так, и разработчик БД не завернет запрос с использованием временных таблиц.

Elic,
Спасибо, это был бы замечательный вариант. Но насколько понял: xmltable ввели только в 10й версии, а у меня на производстве 9i.
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39417317
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nnn2kа у меня на производстве 9i.rtfm xmlsequence
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39417478
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot nnn2k]Anton_Deminnnn2k,


stax..,
Справится ли слабый сервер с таким запросом или повиснет на час? В ближайшее время не могу его так протестировать. Может у Вас был опыт по времени исполнения подобного запроса.


опыта на 10000 нет

попробуйте, минутное ж дело

.....
stax
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39417881
Kumotori
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я сразу хочу извиниться перед уважаемым сообществом за не-Oracle.

И так, у вас есть база с которой нет возможности нормально работать и если вы не можете вносить в базу изменения, то и результаты вашей выборки и сравнения с XML остаются вне базы данных.
И если это так, спрашивается - а зачем вам в таком случае делать сравнение при помощи SQL? (select .... where ... in)

Например Python лугко обработает 10000 ваших id и с XML умеет работать. (других средств тоже полно)

(по питону см. : xml.etree.ElementTree и cx_Oracle)
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39417889
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nnn2k,
во первых совет элика, во вторых, если уж совсем руки не из Ж. видимо массив из клиента в оракл это слишком сложно..... и предвосхишая стоны насчет того, что что-то там нельзя сделать в схеме.... создать другую схему в которой можно и дать права никто не запрещает так же как и пользоваться sys.odcinumberlist, правда не помню уже были ли эти типы в 9ке. насчет отдельной схемы совет еще в силе... дай права основной схеме и работай с объектами другой.. это тоже возможно...
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39417929
Nobody1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..nnn2k1. Правильно ли я понимаю, что единственный выход -select id in (....., n)?
Спасибо!

select * from t where (id,1) in ((1000,1), (2103,1), (7320,1), ... (21248,1));

пар (a,b) можно больше 1000

......
stax

а еще можно

alter session set "_fix_control"='17376322:OFF';

тогда и без пар пойдет
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39418329
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vintnnn2k,
во первых совет элика, во вторых, если уж совсем руки не из Ж. видимо массив из клиента в оракл это слишком сложно..... и предвосхишая стоны насчет того, что что-то там нельзя сделать в схеме.... создать другую схему в которой можно и дать права никто не запрещает так же как и пользоваться sys.odcinumberlist, правда не помню уже были ли эти типы в 9ке. насчет отдельной схемы совет еще в силе... дай права основной схеме и работай с объектами другой.. это тоже возможно...

sys.odcinumberlist можно 10000 елементов?


Код: plsql
1.
2.
3.
4.
5.
SQL> @D:\t.sql
4,8,12,16,20,24,28,32,36,40,
          *
ERROR at line 5:
ORA-00939: too many arguments for function



.....
stax
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39418404
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..sys.odcinumberlist можно 10000 елементов?Можно даже 10001. Но конструктор поддерживает только до 1000 параметров.
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39418416
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-stax..sys.odcinumberlist можно 10000 елементов?Можно даже 10001. Но конструктор поддерживает только до 1000 параметров.
Код: plsql
1.
2.
SQL> desc sys.odcinumberlist
 sys.odcinumberlist VARRAY(32767) OF NUMBER



так я о "конструкторе",
или есть другой способ, я о задачке nnn2k?

ps
10000 пар без проблем хавает слабенький сервер
......
stax
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39418589
arlx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не увидел вариант попробовать вариант с with:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with tbl as
 (select /*+ MATERIALIZE */
	 *
		from (select 1 id from dual
					 union all
					 select 2 id from dual
					 union all
					 select 3 id from dual
					 union all
					 select 4 id from dual))
select * from mytbl a
/*left*/ join tbl b on a.id = b.id
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39418660
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..,
если говорить о вызове из java например то посмотрев пример Дениса Попова за 5 год можно увидеть что он вызывает процедуру. без конструктора. смысл конкатенировать? я вызывал как select * from table((?) as odci.numberlist). не помню уже сколько я там закидывал элементов.
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39419034
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vintstax..,
если говорить о вызове из java например то посмотрев пример Дениса Попова за 5 год можно увидеть что он вызывает процедуру. без конструктора. смысл конкатенировать? я вызывал как select * from table((?) as odci.numberlist). не помню уже сколько я там закидывал элементов.
так я об етом и талдычу что (?) на 10000 не прокатит

......
stax
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39419040
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..,
так я ж вначале написал что отдельная схема с правами на основную всё решает... ну а odci вспомнил как костыль.))) ну не прокатит и ладно)) я не расстроюсь))
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39419100
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vintstax..,
так я ж вначале написал что отдельная схема с правами на основную всё решает... ну а odci вспомнил как костыль.))) ну не прокатит и ладно)) я не расстроюсь))
да я не против отдельной схемы, но нужны права

иногда встречаются параноики админы/безпечники которых не переубедить

.....
stax
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39419622
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если SQL будет создаваться динамически то я не вижу проблем для решения 1 запросом:
Или как предложил Stax
stax..select * from t where (id,1) in ((1000,1), (2103,1), (7320,1), ... (21248,1));

пар (a,b) можно больше 1000


или

Код: plsql
1.
2.
3.
4.
 Select * from TBL where 
     id in (1, 2, 3,..,999)
 or id in (1000, 1001, ...1999)
 or id in (...)     
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39433170
nnn2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь, ушел в работу с головой.
Сначала маялся с установкой тестового сервера 9i на Linux, в итоге - виртуалка и Win, для экспериментов над вариантами решения вопроса.
По сути: На рабочем сервере разбил 100к запросов по 10000 - 0.2-0.6 секунд на каждые 10к. Вполне приемлемо.
То что предложил Elic (xmlsequence) - тоже успешно заработало на 9i, но пришел к предположению, что парсинг xml - это опять же лишняя нагрузка на оперативку (если конечно происходит разбивка на DOM элементы), так что plain text - вероятно дешевле. Остановился на Where id in (....) с разбивкой по 10к запросов.
Спасибо всем за помощь!
...
Рейтинг: 0 / 0
Select id in (1, 2, 3 ... n)
    #39433172
nnn2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
*Ошибся в числах. Конечно, 100к - это 10к, а 10 000 - 1 000.
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Select id in (1, 2, 3 ... n)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]