Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MySQL,StoredProc-задействовать тип Delphi set of, что передать и как обработать в MySQL 
V
    Опции темы
kami
Дата 1.11.2012, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 72



Здравствуйте, дамы и господа!

В программе на Delphi есть следующее описание:
Код

TStatus = (sStatus1, sStatus2, sStatus3);
TStatusSet = set of TStatus;


В MySQL (соединение через ADO компоненты) хранится табличка:
Код

CREATE TABLE `tbl` (
  `ID` int(11) ,
  -- ======================
  `Status` int(11) NOT NULL


При добавлении записи в эту таблицу или чтении "построчно" всё просто:
Код

  Status:=TStatus(DataSet.FieldByName('Status').AsInteger);


А вот как быть, если нужно выбрать все записи по нескольким статусам, т.е (для Delphi) с использованием set of TStatus? Динамически запрос составить не могу - в силу ряда причин можно пользоваться только хранимыми процедурами... Как передать в хранимку и выполнить что-то типа
Код

SELECT * FROM `tbl`WHERE `status` IN (@StatusSet); -- где StatusSet типа TStatusSet

Пробовал использовать тип параметра хранимки SET, но через ADO его видно как строку.
Кроме того, хоть и пишут, что внутреннее представление этого типа бинарное, аналогично Delphi, но в SQL операторах он тоже идет как строка...

Собственно, вопрос - как передать (возможно, с преобразованием) в хранимую процедуру параметр типа set of и как им воспользоваться в SELECT-е?

P.S. Прошу прощения за невнятное название темы и мешанину в самом вопросе - это всё от непонимания предметной области :(
PM MAIL WWW   Вверх
kami
Дата 2.11.2012, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 72



Небольшой upd:
в принципе, можно воспользоваться таким фокусом:
в хранимую процедуру передавать Set Of как integer, тогда тело процедуры будет выглядеть так:
Код

SELECT * FROM `workingshift` WHERE ((1 << `Status`) & Statuses_) != 0;

Но - таблица в перспективе будет очень большой, так что СУБД замучается сдвигать статус каждой строки влево. Не выход.
Нужно как-то представить StatusSet в виде набора значений и использовать в WHERE оператор IN...

Это сообщение отредактировал(а) kami - 2.11.2012, 12:24
PM MAIL WWW   Вверх
Vas
Дата 2.11.2012, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Передавай как строку, а в хранимке уже готовь запрос
Код

create table `tbl` 
(`id` int(11) not null auto_increment primary key,
`name` varchar(255),
`status` int(3));

insert into `tbl` (`name`, `status`) values ('1111', 1);
insert into `tbl` (`name`, `status`) values ('22222', 1);
insert into `tbl` (`name`, `status`) values ('33333', 1);
insert into `tbl` (`name`, `status`) values ('44444', 2);
insert into `tbl` (`name`, `status`) values ('55555', 3);
insert into `tbl` (`name`, `status`) values ('66666', 3);


CREATE PROCEDURE `sel_stat`(IN `list_stat` VARCHAR(64))
begin
   SET @stm := CONCAT('SELECT * FROM tbl WHERE status IN (', list_stat, ') ');
 
   PREPARE fetch_parents FROM @stm;
   EXECUTE fetch_parents;
   DROP PREPARE fetch_parents;  
END;



Ну и выборка 
Код

call sel_stat('1,2');


Результат
+----+-------+--------+
| id | name  | status |
+----+-------+--------+
|  1 | 1111  |      1 |
|  2 | 22222 |      1 |
|  3 | 33333 |      1 |
|  4 | 44444 |      2 |
+----+-------+--------+
4 rows in set (0.00 sec)

Код

call sel_stat('1,2,3');

+----+-------+--------+
| id | name  | status |
+----+-------+--------+
|  1 | 1111  |      1 |
|  2 | 22222 |      1 |
|  3 | 33333 |      1 |
|  4 | 44444 |      2 |
|  5 | 55555 |      3 |
|  6 | 66666 |      3 |
+----+-------+--------+
6 rows in set (0.00 sec)


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
kami
Дата 2.11.2012, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 72



Vas, здОрово!
Спасибо!!!
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

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


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0605 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.