Как передать массив значений через Params

Модератор: Модераторы

Как передать массив значений через Params

Сообщение Sharfik » 12.11.2023 10:04:02

Есть какие то встроенные решения чтобы через "Params.ParamByName" передать набор значений для :parray в SQL скрипте ниже?

Код: Выделить всё
SELECT ID,NAME FROM TDOCUMENTATIONS WHERE XX_ID IN (:parray);
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 766
Зарегистрирован: 20.07.2013 01:04:30

Re: Как передать массив значений через Params

Сообщение Снег Север » 12.11.2023 10:59:36

Можно, если поле БД и переменная поддерживает тип "набор значений".
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2997
Зарегистрирован: 27.11.2007 16:14:47

Re: Как передать массив значений через Params

Сообщение Sharfik » 12.11.2023 18:21:53

Еще раз... есть TQuery с его Params.ParamByName. Передать список можно только строкой, других типов данных там нет для этого. Параметр через штатные функции в скрипт SQL эта шляпа вставляется в кавычках. И получается что сделать поиск по вариациям нельзя.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 766
Зарегистрирован: 20.07.2013 01:04:30

Re: Как передать массив значений через Params

Сообщение sts » 13.11.2023 14:53:09

передача набора значений в параметр f1 in (:0) порождает неоднозначность, нет никаких признаков как интерпретировать входящий параметр - как одиночное значение или как набор по этому интерпретируется как одиночное, как набор не встречал, возможно есть какето низкоуровневые функции конкретного драйвера конкретной базы.

теоретически есть вариант (зависит от возможности бд) использовать f1 in (funct1(:0))

Добавлено спустя 2 минуты 14 секунд:
хотя, посетила идея, может есть такой вариант f1 in :0
но чет сомнительно

Добавлено спустя 6 минут 8 секунд:
сомнительно потому что изначально в sql типов массивов и подобного не было, а значит и поддержки на уровне синтаксиса не было, а значит парсер ожидает после in скобки а их нету
sts
постоялец
 
Сообщения: 415
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Как передать массив значений через Params

Сообщение Снег Север » 13.11.2023 18:51:32

Не знаю как там в абстрактном sql, а в MYSQL еть конструкции в которые прекрасно подставляются наборы значений, надо только каждое из них заключать в свои кавычки, обычно - двойные.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2997
Зарегистрирован: 27.11.2007 16:14:47

Re: Как передать массив значений через Params

Сообщение svk12 » 14.11.2023 02:21:22

Sharfik писал(а):Параметр через штатные функции в скрипт SQL эта шляпа вставляется в кавычках.

Если .asString и .Text обрамляют присвоенное им значение кавычками, то, может быть, стоит вообще не использовать здесь параметр.
Слепить строку запроса динамически и подсунуть в SelectSQL ?
svk12
постоялец
 
Сообщения: 407
Зарегистрирован: 09.06.2008 18:42:47

Re: Как передать массив значений через Params

Сообщение Vapaamies » 14.11.2023 17:30:00

Снег Север писал(а):в MYSQL еть конструкции в которые прекрасно подставляются наборы значений, надо только каждое из них заключать в свои кавычки, обычно - двойные.

:shock: Пруфы?
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 291
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Как передать массив значений через Params

Сообщение Снег Север » 14.11.2023 17:44:41

Vapaamies писал(а): Пруфы?

https://www.educba.com/mysql-where-in-array/
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2997
Зарегистрирован: 27.11.2007 16:14:47

Re: Как передать массив значений через Params

Сообщение Vapaamies » 14.11.2023 23:38:45

Снег Север писал(а):https://www.educba.com/mysql-where-in-array/

И где там кавычки, тем более двойные? Двойные кавычки — экранирование имен в SQL.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 291
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Как передать массив значений через Params

Сообщение Снег Север » 14.11.2023 23:53:47

Vapaamies писал(а):И где там кавычки, тем более двойные?

Очки наденьте. Да, там в примере одинарные кавычки, но из делфи/лазаруса обычно применяют двойные.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2997
Зарегистрирован: 27.11.2007 16:14:47

Re: Как передать массив значений через Params

Сообщение sts » 16.11.2023 13:18:52

Снег Север писал(а):е знаю как там в абстрактном sql, а в MYSQL еть конструкции

это обычный in, речь же про то как передать для него набор значений в виде одного параметра

как заменить
f1 in (:p0,:p1,:p2)
на
f1 in (:p0_2)
где :p0_2 является параметром с типом массив содержащий значения из :p0,:p1,:p2

так вот, насколько я сталкивался скобки обязательны для in и реализация варианта без скобок (который семантически полностью соответствует задаче) f1 in :p0_2 сломает кучу инструментов которые ожидают после in скобку, а сразу же это не сделали потому что не было массивов как типов колонок и соответсвенно параметров

Добавлено спустя 11 минут 58 секунд:
Изображение

Добавлено спустя 5 минут 24 секунды:
для subquery скобки тоже обязательны

вот так выбор накладывает ограничение на будущее развитие языка

Добавлено спустя 6 минут:
https://archive.org/details/federalinfo ... ew=theater

Добавлено спустя 11 минут 45 секунд:
а вот еслибы разработчики вместо
Код: Выделить всё
<in predicate > :: = < value expression > [NOT] IN {< subquery > | (<in value list>) }

<in value list> :: = < value specif ication>{,< value specif ication>}...


сделали бы

Код: Выделить всё
<in predicate > :: = < value expression > [NOT] IN {< subquery > | <value list> }

<value list> :: = ( < value specif ication>{,< value specif ication>}... )


то можно былобы писать

(f1, f2, f3) = (:p0,:p1,:p2)

(f1, f2, f3) = :p0_2

т.е. появились бы кортежи что резко бы упростило работу с составными ключами
sts
постоялец
 
Сообщения: 415
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Как передать массив значений через Params

Сообщение Vapaamies » 16.11.2023 22:23:27

Снег Север писал(а):Очки наденьте. Да, там в примере одинарные кавычки, но из делфи/лазаруса обычно применяют двойные.

Таблетки примите и перестаньте гнать пургу.
sts писал(а):это обычный in, речь же про то как передать для него набор значений в виде одного параметра

Ну вот, хоть кто-то это написал, можно продолжить дискуссию по сути.
sts писал(а):(f1, f2, f3) = (:p0,:p1,:p2)

(f1, f2, f3) = :p0_2

т.е. появились бы кортежи что резко бы упростило работу с составными ключами

На самом деле, поскольку речь тут про переменное число параметров кортеж должен быть таким:
Код: Выделить всё
declare my_tuple = ();

insert into my_tuple values (:p); -- повторяем сколько надо раз

select * from my_table where my_field in my_tuple;

Но это мечты...

Хотя на практике можно создавать временную таблицу или таблицу в памяти — в зависимости от СУБД, после чего вставлять значения и штатно использовать в запросах. Мы так и сделали, когда надо было. Потом, правда, оказалось, что в рамках общей оптимизации можно переписать код таким образом, что подобная эквилибристика не требуется.

Так что, возможно, потребность в использовании IN с параметрами — признак плохой архитектуры.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 291
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Как передать массив значений через Params

Сообщение Sharfik » 19.11.2023 01:46:19

Vapaamies писал(а):Так что, возможно, потребность в использовании IN с параметрами — признак плохой архитектуры.

Вот даже интересно, если взять "Товар" и "Заказ". И требуется получить все заказы в которых фигурирует id трех конкретных товаров. Какая такая "правильная" архитектура должна быть, чтобы эту просто решаемую задачу с IN реализовать? Наверно надо наплодить еще десяток мусорных таблиц и SQL запросы формировать клиентом, чтобы побольше дыр в безопасности сделать?
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 766
Зарегистрирован: 20.07.2013 01:04:30


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15

Рейтинг@Mail.ru