powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Массив в ХП
12 сообщений из 12, страница 1 из 1
Массив в ХП
    #33040621
vovik221
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
ХЕЛП! Ессть форма со списком CheckLictBox. Пользователь отмечает нужные пункты. Далее, по отмеченным пунктам формируется список ID. Есть ХП, в которой надо сделать выборку типа Select нечто From таблица Where ID In (тот самый список, который собрал пользователь) . ВОПРОС: как передать этот список в ХП?
Заранее благодарен.
...
Рейтинг: 0 / 0
Массив в ХП
    #33040679
McMurfy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это вопрос в форум по той СУБД, которую вы используете. Обычно передают строкой с разделителями...
...
Рейтинг: 0 / 0
Массив в ХП
    #33041161
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
Select * From Table1 T Where :ParamStr Containing '~'||T.ID||'~' ;
/* строка ParamStr  = ~12~23~267~675~'; */

Best regards,
Dnico
.
...
Рейтинг: 0 / 0
Массив в ХП
    #33041166
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dnico
Код: plaintext
1.
Select * From Table1 T Where :ParamStr Containing '~'||T.ID||'~' ;
/* строка ParamStr  = ~12~23~267~675~'; */

Best regards,
Dnico
.
Для таблица с миллионами записей это решение будет "немножко" медленным.
...
Рейтинг: 0 / 0
Массив в ХП
    #33041269
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДля таблица с миллионами записей это решение будет "немножко" медленным.

тогда можно вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE OR_TAB (
    ID_USER    INTEGER,
    CONDITION  INTEGER
); 

/* Перед использованием очищаем и заполняем CONDITION значениями */
SELECT T1.* FROM TABLE1 T1
JOIN OR_TAB T2 ON (T2.CONDITION = T1.ID)
WHERE T2.ID_USER =  1 ;

ИЛИ 

SELECT T1.* FROM TABLE1 T1
WHERE T1.ID IN (T2.CONDITION OR_TAB T2 WHERE T2.ID_USER =  1 );

Best regards,
Dnico
.
...
Рейтинг: 0 / 0
Массив в ХП
    #33041416
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dnicoтогда можно вот так:
Уже было. /topic/175575.

P.S. Тяжело там, где нет массивов-параметров :)

Код: plaintext
\nSQL> create type TIntTable as table of integer ;\n   2   /\n\nType created.\n\nSQL> ed\nWrote file afiedt.buf\n\n   1   create or replace function ListDbaObjects (IDs TIntTable) return sys_refcursor as\n   2     result sys_refcursor ;\n   3   begin\n   4     open result for\n   5       select o.object_id, o.object_name\n   6       from dba_objects o, table(IDs) t\n   7       where o.object_id = t.column_value ;\n   8     return result ;\n   9 * end ;\nSQL> /\n\nFunction created.\n\nSQL> exec :result := ListDbaObjects (TIntTable ( 1 , 2 , 3 , 4 , 5 ));\n\nPL/SQL procedure successfully completed.\n\n OBJECT_ID OBJECT_NAME                                                          \n---------- --------------------                                                 \n          2  C_OBJ#                                                               \n          3  I_OBJ#                                                               \n          4  TAB$                                                                 \n          5  CLU$                                                                 \n
...
Рейтинг: 0 / 0
Массив в ХП
    #33041969
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerP.S. Тяжело там, где нет массивов-параметров :)
Но только при условии, что в СУБД нет поддержки временных таблиц. Иначе и без массивов параметров можно прекрасно жить на времянках :)
...
Рейтинг: 0 / 0
Массив в ХП
    #33043061
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSНо только при условии, что в СУБД нет поддержки временных таблиц. Иначе и без массивов параметров можно прекрасно жить на времянках :)
Насчет "прекрасно" - это слегка из серии "прекрасно ездить на жигулях, пока не ездил на мерседесе" :)

Физическая реализация, разумеется, может быть разной, и временная таблица как одна из возможных реализаций безусловно полезна. Но "объект, который передается по имени" - имхо не самая удачная из имеющихся концепций. Также часто удобна возможность работать напрямую, не через DML. Там, где это есть, где можно именно что передать временную таблицу как параметр - замечательно.
...
Рейтинг: 0 / 0
Массив в ХП
    #33043104
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer ASCRUSНо только при условии, что в СУБД нет поддержки временных таблиц. Иначе и без массивов параметров можно прекрасно жить на времянках :)
Насчет "прекрасно" - это слегка из серии "прекрасно ездить на жигулях, пока не ездил на мерседесе" :)

Физическая реализация, разумеется, может быть разной, и временная таблица как одна из возможных реализаций безусловно полезна. Но "объект, который передается по имени" - имхо не самая удачная из имеющихся концепций. Также часто удобна возможность работать напрямую, не через DML. Там, где это есть, где можно именно что передать временную таблицу как параметр - замечательно.
Я не имел ввиду передачу временной таблицы в качестве параметров, тем более что это не поддерживается :) Делается просто глобальная времянка NOT TRANSACTIONAL, клиентское приложение в нее выставляет что и сколько хочет, дальше соединяя обычным INNER JOIN мы в любой момент отфильтруем запрос на выбранные и занесенные в времянку записи. Ни о каком DML естественно речи идти не может - глобальная времянка разделяет данные для каждой сессии и создается автоматически для вновь подключаемой сессии.
...
Рейтинг: 0 / 0
Массив в ХП
    #33043111
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гм, рано нажал "отправить" :)

В данном случае, с учетом того, что операторы DML не требуют подтверждения завершения транзакции, так как таблица в них не участвует (NOT TRANSACTIONAL), то клиент спокойно может добавлять, изменять и удалять ее содержимое и использовать его тогда, когда ему это нужно в запросах, ХП и т.д. У меня таким образом сделаны пользовательские фильтры, где в одном месте клиентского приложения в такую времянку генерятся все ID, которые будут участвовать в процессе работы и потом до перегенерации фильтра все клиентское приложение и серверный код с любых модулей уже точно знают, с кем работают в групповых режимах.
...
Рейтинг: 0 / 0
Массив в ХП
    #33043925
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSЯ не имел ввиду передачу временной таблицы в качестве параметров, тем более что это не поддерживается :)
Вот именно это "не поддерживается" я и имел в виду. Фактически подпрограммы вынуждены получать данные из глобальной переменной, записывать в нее что-то и неявно передавать ее дальше. Максимально неудачный режим, с моей точки зрения :)

NOT TRANSACTIONAL - безусловно, вариант, который должен быть в арсенале. Собственно это и отличает абстрактную "переменную" от "таблицы".
...
Рейтинг: 0 / 0
Массив в ХП
    #33043929
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSУ меня таким образом сделаны пользовательские фильтры, где в одном месте клиентского приложения в такую времянку генерятся все ID, которые будут участвовать в процессе работы
Для этого варианта инструмент, безусловно, идеальный. В Oracle для этого пришлось бы использовать некую дополнительную механику; как именно оптимально - не скажу сходу; наиболее похожим решением, пожалуй, будет заполнять таблицу фильтра в автономной транзакции.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Массив в ХП
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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