Запрос из нескольких баз стредствами SQL Firebird - Секреты программирования - Программирование в Delphi - Каталог статей - Отдел информационных технологий ГКБ №29
Пятница, 09.12.2016, 07:57
Приветствую Вас Гость | Регистрация | Вход

Отдел информационных технологий ГКБ №29 г.Новокузнецк

Меню сайта
Категории раздела
Секреты программирования [3]
Поиск
Наш опрос
Как Вы оцениваете качество материалов?
Всего ответов: 28
Полезные ссылки
  • Официальный блог
  • Сообщество uCoz
  • Технологии программирования
  • Сайт о здоровье
  • Друзья сайта
  • КМИАЦ Новокузнецка
  • Интернет университет
  • Дистанционное обучение
  • Статистика
    Деловая сеть Кемерово и Кемеровская область. Жёлтые страницы, телефонный справочник и каталог компаний, товаров и услуг. Rambler's Top100
    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Погода
    Яндекс.Погода

    Каталог статей

    Главная » Статьи » Программирование в Delphi » Секреты программирования

    Запрос из нескольких баз стредствами SQL Firebird
    Решил проработать этот вопрос и всё-таки сделать один запрос.
    Итак, воспользоваться в этом случае можно конструкцией FOR EXECUTE STATEMENT

    Конструкция его такова:
    [FOR]
    EXECUTE STATEMENT { | : } [ () ]
    [ON EXTERNAL [DATA SOURCE] ]
    [WITH { AUTONOMOUS | COMMON } TRANSACTION]
    [AS USER [PASSWORD ] ]
    [WITH CALLER PRIVILEGES]
    [INTO : [,: [,] ] ]
    [DO
    ;]

    Подробности в статье http://firebirdsql.su/doku.php?id=execute_statement

    Пример практического кода:

    execute block (fam1 varchar(50)=:fam1 ,im1 varchar(50)=:im1,ot1 varchar(50)=:ot1,dr1 date=:dr1)
    returns (fam varchar(50), im varchar(50),ot varchar(50),dr date,nnpo varchar(50),nstr varchar(50),
    house varchar(50),flat varchar(50),polis varchar(50),smo varchar(50),dred date,namebase varchar(50),uid integer)
    as
    declare variable strsql varchar(1000);
    begin
    strsql=',patient.uid,patient.fam, patient.im, patient.ot, patient.dr, n_npo.nnpo, n_str.nstr,
    patient.house, patient.flat, patient.polis, n_cmo.ncmo, patient.dred
    from patient inner join n_npo on patient.tawn=n_npo.npo
    inner join n_str on patient.street=n_str.str
    inner join n_cmo on patient.cmo=n_cmo.cmo
    where patient.fam='||chr(39)||:fam1||chr(39)||
    ' and patient.im='||chr(39)||:im1||chr(39)||
    ' and patient.ot='||chr(39)||:ot1||chr(39)||' and patient.dr='||chr(39)||:dr1||chr(39)||' order by dred';
    FOR EXECUTE STATEMENT ('select '||chr(39)||'Стационар'||chr(39)||:strsql)
    ON EXTERNAL DATA SOURCE '100.200.4.54:d:\ametist\db\ametist.GDB' AS USER 'sysdba' PASSWORD 'masterkey'
    INTO :namebase,:uid,:fam,im,ot,dr,nnpo,nstr,house,flat,polis,smo,dred
    DO SUSPEND;
    FOR EXECUTE STATEMENT ('select '||chr(39)||'Поликлиника №2'||chr(39)||:strsql)
    ON EXTERNAL DATA SOURCE '100.200.4.28:c:\PROGRAM FILES\ARENA\DB\ARENA.GDB' AS USER 'sysdba' PASSWORD 'masterkey'

    /*... тут идут подобные блоки*/
    FOR EXECUTE STATEMENT ('select '||chr(39)||'АТО №2'||chr(39)||:strsql)
    ON EXTERNAL DATA SOURCE '100.200.2.4:c:\PROGRAM FILES\ARENA\DB\ARENA.GDB' AS USER 'sysdba' PASSWORD 'masterkey'
    INTO :namebase,:uid,:fam,im,ot,dr,nnpo,nstr,house,flat,polis,smo,dred
    DO SUSPEND;
    WHEN ANY do begin
    end
    end

    Ну а дальше можно сделать хранимую процедуру для удобства использования
    Категория: Секреты программирования | Добавил: Admin5895 (02.07.2015)
    Просмотров: 108 | Рейтинг: 0.0/0
    Всего комментариев: 0
    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]