Страница 1 из 1
Сортировка результата EXECUTE BLOCK
Добавлено: 17 авг 2010, 14:47
Delchiv
- Есть локальная и удаленная БД (удаленная - не всегда доступна)
- Есть запрос, который делает выборку из обеих баз, либо только из локальной, если удаленная недоступна.
Код: Выделить всё
execute block
returns ( ID TYPE OF COLUMN menegers.ID, FIO TYPE OF COLUMN menegers.FIO)
as
begin
for
execute statement 'select m.id, m.fio from menegers m where m.id in (1,3,4,5) order by id'
into :ID, :FIO
do suspend;
for
execute statement 'select m.id, m.fio from menegers m where m.id in (1,3,4,5) order by id'
on external 'office:base' as user 'SYSDBA' password 'masterkey'
into :ID, :FIO
do suspend;
WHEN ANY do exit;
end
Каким образом можно сортировать/группировать или сделать distinct результирующему набору данных?
Re: Сортировка результата EXECUTE BLOCK
Добавлено: 17 авг 2010, 19:24
Delchiv
Пока делаю так:
Код: Выделить всё
/*
create global temporary table temp$table(ID INTEGER, FIO VARCHAR(50));
*/
execute block
returns ( ID TYPE OF COLUMN menegers.ID, FIO TYPE OF COLUMN menegers.FIO)
as
begin
for
execute statement 'select m.id, m.fio from menegers m where m.id in (1,3,4,5) order by id'
into :ID, :FIO
do begin
insert into temp$table ( ID, FIO) VALUES ( :ID, :FIO);
end
for
execute statement 'select m.id, m.fio from menegers m where m.id in (1,3,4,5) order by id'
on external 'office:base' as user 'SYSDBA' password 'masterkey'
into :ID, :FIO
do begin
insert into temp$table ( ID, FIO) VALUES ( :ID, :FIO);
end
for
select distinct * from temp$table into :ID, :FIO
do suspend;
WHEN ANY do begin
for select distinct * from temp$table into :ID, :FIO
do suspend;
end
end
Но, IMHO, не самое красивое решение
Re: Сортировка результата EXECUTE BLOCK
Добавлено: 17 авг 2010, 19:47
hvlad
GTT - нормальное решение, когда оно оправдано.
А почему нельзя процедуру написать вместо EXEC BLOCK ?
Re: Сортировка результата EXECUTE BLOCK
Добавлено: 17 авг 2010, 20:19
Delchiv
А почему нельзя процедуру написать вместо EXEC BLOCK ?
IMHO, так вмешательство в базу - минимальное.
Есть проект на Delphi (управление производством). В нем достаточно много запросов, и чтоб не переписывать их все - вешаю на BeforeOpen обработчик,
который родной запрос заменит подстановкой оного в соответствующий шаблон.
Только вот тут другая проблема возникает - если одновременно работает несколько запросов, то для каждого нужна своя temp$table. Сгенерить ее не проблема, но уж больно много их плодится
И еще не знаю, как они (temp$table), себя поведут, если несколько пользователей запустит одни и те же запросы?
Re: Сортировка результата EXECUTE BLOCK
Добавлено: 18 авг 2010, 00:01
kdv
TClientDataSet
http://edn.embarcadero.com/article/29272
с сортировкой еще проще. Там же есть еще несколько статей про ClientDataSet этого же автора.
Re: Сортировка результата EXECUTE BLOCK
Добавлено: 18 авг 2010, 14:08
Dimitry Sibiryakov
Лично меня больше всего занимает вопрос: а нафига вообще обращаться к удалённой базе, если локальная доступна всегда?..
Re: Сортировка результата EXECUTE BLOCK
Добавлено: 18 авг 2010, 15:03
Delchiv
В том и проблема, что
всегда, а должна быть часть, которую в любой момент можно рубануть
.
Re: Сортировка результата EXECUTE BLOCK
Добавлено: 27 авг 2010, 15:39
Delchiv
Нашел более изящное решение:
создал процедуру, которая объединяет (если есть такая возможность) данные
Код: Выделить всё
create procedure UNITE$TBL
returns (
ID integer,
FIO varchar(100)
)
as
begin
for
execute statement 'select m.id, m.fio from menegers m where m.id in (1,3,4,5) order by id'
into :ID, :FIO
do suspend;
for
execute statement 'select m.id, m.fio from menegers m where m.id in (1,3,4,5) order by id'
on external 'office:base' as user 'SYSDBA' password 'masterkey'
into :ID, :FIO
do suspend;
WHEN ANY do begin
end
end
создал вьюху:
Код: Выделить всё
CREATE OR ALTER VIEW TEMP$TBL AS select * from unite$tbl
и при помощи триггеров обеспечил взаимодействие с реальными таблицами.
Остается только в запросах поменять TBL на TEMP$TBL.