powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
19 сообщений из 19, страница 1 из 1
Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
    #40080272
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Друзья, прошу помочь!
У самого нечего не получается.

Всевышний свел меня с FB. Стоит задача:
1. Обратиться с запросом в стороннюю БД;
2. Обратиться в свою БД;
3. Сопоставить результаты и записать в свою БД нужные строки.

Изучил у нас на форуме вопрос-1. Это получается. Далее пытаюсь создать структуру, массив или нечто иное, чтобы выгрузить туда результат запроса (результат запроса - небольшая таблица). Ищу-свищу и уже очень сильно сомневаюсь, что я задумал не ерунду в части архитектуры FB.

Как правильно решить эту задачу. Подскажите алгоритм. Более подробные данные предоставлю, какие будут нужны.
...
Рейтинг: 0 / 0
Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
    #40080274
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441Подскажите алгоритм.

Merge join. Открываешь два резалт-сета с нужной сортировкой, фетчишь по одной записи,
сравниваешь. По результатам сравнения выполняешь нужные операции. Повторять до конца обоих
выборок.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
    #40080279
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Спасибо! Но я спрошу немного подробнее.
"резалт-сет" - уточните, пож-та, это то, что я понимаю в своем тестовом фрагменте?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
EXECUTE BLOCK 
RETURNS( 
    uidArr integer, 
    pValueArr VARCHAR(32)
)
AS
--DECLARE VARIABLE uidArr integer;
--DECLARE VARIABLE pValueArr VARCHAR(32);

begin
    
  FOR
    EXECUTE STATEMENT 
        '
        SELECT uid, pValue
        FROM VTS_VALUES_NC_UID
        Where uid IN (201,202,203)
        ' 
      ON EXTERNAL 'C:\OptiRamp\DB\STCTRL2106.FDB'          
      WITH autonomous transaction AS USER 'SYSDBA' PASSWORD 'masterkey' WITH CALLER PRIVILEGES
    INTO :uidArr, :pValueArr
  DO 
    SUSPEND;
    
end
...
Рейтинг: 0 / 0
Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
    #40080280
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441"резалт-сет" - уточните, пож-та

резалт-сет (google "result set") это результат работы запроса SELECT. Набор записей,
получаемых по одной с помощью функции "fetch".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
    #40080281
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Про функцию fetch я прочел. Теперь знаю, спасибо!
Но, насколько я понял, для этого необходимо объявить курсор на запрос типа
Код: plsql
1.
DECLARE C CURSOR FOR (SELECT RDB$RELATION_NAME FROM RDB$RELATIONS);



Не могу понять, как в моем случае, когда запрос в стороннюю БД, установить на нее этот курсор.

Направьте далее, пож-та!
...
Рейтинг: 0 / 0
Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
    #40080284
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неявный курсор: FOR SELECT (FOR EXECUTE STATEMENT в твоём случае).

А вообще тебе стоило бы заранее обозначить язык в котором ты пытаешься это сделать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
    #40080288
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Про неявный курсор. Не могли бы Вы написать чуть подробнее для моего случая? Не складывается и примеров в инете я не нашел. Спасибо!

На каком языке я пытаюсь? У меня есть возможность только направлять запросы в БД FB. Отсюда и тот фрагмент, что я подготовил.
...
Рейтинг: 0 / 0
Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
    #40080291
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читай прикреплённые темы, там есть ссылка на Language Reference. На русском.

Запросы ты "направляешь" телепатически?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
    #40080300
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Удивительное дело! Вы мне ОЧЕНЬ помогаете и сегодня, в процессе консультаций с Вами, я уже почти нашел РАБОЧЕЕ решение.
Но, с другой стороны, я очень невнятно понимаю то, что Вы мне пишите. Но я буду продолжать консультации настойчиво) Т.к. процесс идет.

1. Я долго думал, но так и не понял, что такое "прикрепленные темы" и где там ссылки.

2. Запросы я направляю, конечно, "не телепатически", а из стороннего программного приложения (если Вы это имели в виду).
...
Рейтинг: 0 / 0
Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
    #40080304
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441

1. Я долго думал, но так и не понял, что такое "прикрепленные темы" и где там ссылки.

Это вот тут
https://www.sql.ru/forum/interbase

Первые ветки, с названиями:
Важно: ANN Руководство по языку SQL СУБД Firebird 2.5
Важно: ANN Руководство по языку SQL СУБД Firebird 3.0
Важно: ANN Руководство по языку SQL СУБД Firebird 4.0
Важно: ЧИТАТЬ__ВСЕМ,__КТО__ПРИШЕЛ__СЮДА__В__ПЕРВЫЙ__РАЗ!

Эти темы, и еще парочка, являются прикрепленными к верху списка сообщений, и не вытесняются со временем вниз.

Begimot441

2. Запросы я направляю, конечно, "не телепатически", а из стороннего программного приложения (если Вы это имели в виду).

Что бы давать вам советы которыми вы могли бы воспользоваться, нужно понимать какие возможности у вас есть.
"из стороннего программного приложения" нисколько не проясняет ситуацию.

Не все возможности могут быть доступны их любого произвольного приложения.
...
Рейтинг: 0 / 0
Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
    #40080305
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То что вы пытаетесь сделать - изнутри одной базы выполнить запрос к другой, потом чего-то там сравнить и сделать - является не типичным видом взаимодействия. Исходя из того что запрос в первой базе инициируется чем-то извне, в большинстве случаев удобнее выполнить запросы именно из той программы к обеим базам, и по результатам сравнения программа запишет нужные данные в нужную базу.

Для того что бы давать пригодные вам советы, нужно понимать из какого языка программирования вы это делаете, какие способы работы с сервером Firebird существуют для этого языка, какими из них вы пользуетесь, и почему именно этим.
...
Рейтинг: 0 / 0
Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
    #40080306
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И хорошо бы еще знать какая версия Firebird у вас используется.
Нет смысла давать вам советы которые работают только на новых версиях, если у вас старая.
...
Рейтинг: 0 / 0
Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
    #40080345
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,

Постараюсь указать все то, что понимаю. Тем более, что у меня не получилось реализовать то, что я задумал.

1. Версия FB 2.5.6.27020(x64)
2. ОС Win10 сборка 19041.1052
3. Изначально при работе с БД я использую FlameRobin 0.9.3.1186200. Но это не то "приложение" о котором я писал.

Немного о "приложении", которое должно вызывать запрос. Я его называть не буду, т.к. это очень специализированное и развивающее ПО. Оно умеет получать данные через SQL-запросы посредством ODBC-соединение. Через такое соединения я установил коннект к БД FB. Далее, в этом "приложении" есть "место для ввода SQL-запроса". Что-там происходит внутри этого "приложения" для меня закрыто.

Так вот сегодня я экспериментально понял, что это "приложение" не понимает, когда я в "поле запроса" (позвольте мне так называть) ставлю EXECUTE. Классические команды SQL-запросов он понимает и принимает (SELECT, INSERT и т.п.). Я немного почитал литературу, что вы мне советовали и предварительно сделал вывод, что это "приложение" не может работать с PSQL. Но я не уверен, что я прав, естественно, т.к. я не специалист, как вы понимаете, в БД вообще. Просто по работе столкнулся с такой вот необходимостью извернуться...

Еще раз немного о том, что я делаю и как я вижу результат. По сути, я пытаюсь расширить функциональность этого "приложения". Это "приложение" собственно и работает с БД FB, но использует ее только в определенных целях, а мне нужно больше. Вообще там несколько БД, т.е. несколько файлов .FBD
Важный момент - это производственная задача и мне крайне нежелательно вводить новые сущности (свои рукописные приложения, дополнительные БД и т.п.). Архитектура установлена не мной и обсуждать тему "как я все неоптимально, как лучше поменять архитектуру" смысла нет. Такой задачи я себе не ставлю.
Т.о., у меня есть план написать "запрос", который:
1. Прочитает данные из первой БД;
2. Прочитает данные из второй БД;
3. Сопоставит данные;
4. Запишет нужные данные во вторую БД.

Пока мои знания (которые растут с вашей помощью) и практические опыты выводят меня на следующую схему:
1. Во второй БД написать хранимую процедуру, которая, по сути и будет все делать, что я выше перечислил;
2. Эту хранимую процедуру вызывать из "приложения" через SELECT. Предварительно я попробовал, вроде, получается.

Таким образом мне не нужно плодить ничего постороннего в части "неродных" модулей, не нужно делать изменений.

Буду рад любым дальнейшим консультациям!
...
Рейтинг: 0 / 0
Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
    #40080359
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441,

что тут сложного?

1. Создать ХП внутри которой EXECUTE STATEMENT обращается к внешней БД и возвращает набор данных (это примерно твой EXECUTE BLOCK)
2. Написать MERGE запрос который делает SELECT к ХП и необходимые сравнения с целевой таблицей, если строк нет добавляет их, если есть, но они отличаются - обновляет

Собственно всё
...
Рейтинг: 0 / 0
Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
    #40080364
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисчто тут сложного?

Сложно понять зачем переливать данные из первой БД во вторую если приложение способно
обращаться к первой базе непосредственно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
    #40080384
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Симонов Денисчто тут сложного?

Сложно понять зачем переливать данные из первой БД во вторую если приложение способно
обращаться к первой базе непосредственно.


Друзья, тут ответ простой. "Приложение" тупенькое. Оно может запросить данные, показать их, цветом подкрасить. А обработка данных в "приложении" весьма ограничена. Вот я и выношу обработку данных их двух БД запрос внутри самой FB (ведь она у меня есть)
...
Рейтинг: 0 / 0
Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
    #40080387
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441

Оно может запросить данные, показать их, цветом подкрасить


Вытащи данные из обеих БД к себе и сравни. Дольше будешь гонять их "тудой-сюдой изнутря" какой либо СУБД. в 14-м году так сталкивал DB2 & Firebird.
...
Рейтинг: 0 / 0
Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
    #40080428
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант идеи, сделать все по-простому на сервере:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
EXECUTE BLOCK 
RETURNS( 
    uidArr    integer, 
    pValueArr VARCHAR(32),
    A         varchar(1)   -- чего мы сделали с записью из второй базы
)
AS
begin
    
  FOR
    EXECUTE STATEMENT 
        '
        SELECT uid, pValue
        FROM VTS_VALUES_NC_UID
        Where uid IN (201,202,203)
        ' 
      ON EXTERNAL 'C:\OptiRamp\DB\STCTRL2106.FDB'          
      WITH autonomous transaction AS USER 'SYSDBA' PASSWORD 'masterkey' WITH CALLER PRIVILEGES
    INTO :uidArr, :pValueArr
  DO BEGIN
       -----
       select нужные поля
         from  таблица/ы в текущей БД
         where (нужные условия, использующие :uidArr, :pValueArr )
         into :локальные переменные процедуры
       -----
       if (нужна ли запись в локальной бд) then begin
         insert into таблица values(:uidArr, :pValueArr);
         A = 'I';
       end else begin
         A = 'N';
       end;
       -----
       SUSPEND;
     END  
end
...
Рейтинг: 0 / 0
Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
    #40080639
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,

Благодарю, Вас!
Исчерпывающе.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выгрузка из запроса в массив, обработка, вставка строк. Помогите с алгоритмом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]