Сортировка результата EXECUTE BLOCK

Модераторы: kdv, CyberMax

Ответить
Delchiv
Сообщения: 5
Зарегистрирован: 17 авг 2010, 14:31

Сортировка результата EXECUTE BLOCK

Сообщение Delchiv » 17 авг 2010, 14:47

- Есть локальная и удаленная БД (удаленная - не всегда доступна)
- Есть запрос, который делает выборку из обеих баз, либо только из локальной, если удаленная недоступна.

Код: Выделить всё

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 результирующему набору данных?

Delchiv
Сообщения: 5
Зарегистрирован: 17 авг 2010, 14:31

Re: Сортировка результата EXECUTE BLOCK

Сообщение Delchiv » 17 авг 2010, 19:24

Пока делаю так:

Код: Выделить всё

/*
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, не самое красивое решение :(

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Сортировка результата EXECUTE BLOCK

Сообщение hvlad » 17 авг 2010, 19:47

GTT - нормальное решение, когда оно оправдано.
А почему нельзя процедуру написать вместо EXEC BLOCK ?

Delchiv
Сообщения: 5
Зарегистрирован: 17 авг 2010, 14:31

Re: Сортировка результата EXECUTE BLOCK

Сообщение Delchiv » 17 авг 2010, 20:19

А почему нельзя процедуру написать вместо EXEC BLOCK ?
IMHO, так вмешательство в базу - минимальное.
Есть проект на Delphi (управление производством). В нем достаточно много запросов, и чтоб не переписывать их все - вешаю на BeforeOpen обработчик,
который родной запрос заменит подстановкой оного в соответствующий шаблон.
Только вот тут другая проблема возникает - если одновременно работает несколько запросов, то для каждого нужна своя temp$table. Сгенерить ее не проблема, но уж больно много их плодится :( И еще не знаю, как они (temp$table), себя поведут, если несколько пользователей запустит одни и те же запросы?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Сортировка результата EXECUTE BLOCK

Сообщение kdv » 18 авг 2010, 00:01

TClientDataSet

http://edn.embarcadero.com/article/29272

с сортировкой еще проще. Там же есть еще несколько статей про ClientDataSet этого же автора.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Сортировка результата EXECUTE BLOCK

Сообщение Dimitry Sibiryakov » 18 авг 2010, 14:08

Лично меня больше всего занимает вопрос: а нафига вообще обращаться к удалённой базе, если локальная доступна всегда?..

Delchiv
Сообщения: 5
Зарегистрирован: 17 авг 2010, 14:31

Re: Сортировка результата EXECUTE BLOCK

Сообщение Delchiv » 18 авг 2010, 15:03

В том и проблема, что всегда, а должна быть часть, которую в любой момент можно рубануть :).

Delchiv
Сообщения: 5
Зарегистрирован: 17 авг 2010, 14:31

Re: Сортировка результата EXECUTE BLOCK

Сообщение Delchiv » 27 авг 2010, 15:39

Нашел более изящное решение:

создал процедуру, которая объединяет (если есть такая возможность) данные

Код: Выделить всё

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.

Ответить