Страница 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.