Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / автоматическая передача программе новых записей / 25 сообщений из 26, страница 1 из 2
28.03.2002, 13:34
    #32026409
AlexG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
помогите решить проблему!
есть простенькая прога которая через SQL запрос выбирает данные из элементарной таблички Oracle.
просьба нарисовать пример: как реализовать чтобы Oracle сам инициировал передачу новообразованых записей данных в табличке клиентской проге (пример может быть для проги на C++ или Delphi)
...
Рейтинг: 0 / 0
29.03.2002, 04:47
    #32026450
alvako
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
Наверное надо известить клиента о появлении новых записей.
Можно попытаться сделать это из триггера after-insert через DBMS_PIPE или DBMS_ALERT.
...
Рейтинг: 0 / 0
29.03.2002, 09:28
    #32026471
AlexG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
а примера кода нету!!!
...
Рейтинг: 0 / 0
29.03.2002, 09:51
    #32026473
professional
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
ну вот так, сразу что в голову пришло....
короче можно так:
создать дополнительную таблицу.
на основную таблицу поставить триггер на вставку, так что бы
он сбрасывал все новые записи в доп. таблицу.
а из делфи при помощи таймера постоянно обращаться к новой таблице
(раз в минуту например) и в случае получения записей считывать их и удалять...
(ну это самый простой пример, его может сделать любой я уверен что и ты
без всякой помощи его сделаешь)
если не устроит тебя такой ответ то дай знать,
может че другое в голову придет..
...
Рейтинг: 0 / 0
29.03.2002, 13:01
    #32026490
alvako
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
2 AlexG
Читай документацию - там тебе и примеры будут.
...
Рейтинг: 0 / 0
29.03.2002, 13:11
    #32026493
AlexG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
про временную табличку мне сразу идея пришла, но это опять же - необходимо клиентской проге к Oracle периодически стукать, что крайне режелательно (что-то проскакивало в соседних конфах по ADO на счёт авто обновления по поводу новых записей для MS васика и С++ - киньте примером или ссылкой на исходняк если таковые у вас есть люди добрые)!!!
...
Рейтинг: 0 / 0
29.03.2002, 15:57
    #32026524
super professional
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
короче лучший вариант в это случае сделать так:
опять таки как говорил professional создать триггер на вставку записей...

затем написать DLL и подключить ее на сервере,
которая будет собирать информацию о вставленных записях и затем
будет передавать их клиеету
...
Рейтинг: 0 / 0
30.03.2002, 14:00
    #32026554
nick
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
зачем городить какие-то Dll. чем не устраивает DBMS_PIPE/DBMS_ALERT?
сначала говоришь серверу что хочешь получать сообшения, потом в тригер AFTER UPDATE и/или AFTER INSERT ставишь
посылку сообщения через DBMS_PIPE/DBMS_ALERT (в данном случае, на мой взгляд, лучше использовать DBMS_ALERT),
программа получает это сообщение и обновляет данные. Я именно так и делаю.
...
Рейтинг: 0 / 0
30.03.2002, 15:01
    #32026557
alvako
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
Единственная проблема которая может в данном случае возникнуть при использовании DBMS_PIPE/DBMS_ALERT - это то, что данный механизм межпроцессных коммуникации нетранзакционный. Т.е. срабатывать из триггера и оповещать клиента он будет после insert-a записей независимо от того зафиксирована была транзакция или была откатана.
...
Рейтинг: 0 / 0
30.03.2002, 15:07
    #32026558
alvako
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
+ клиент может полезть в базу за обновлениями до того как они будут зафиксированы.
таким образом делать оповещение через DBMS_PIPE/DBMS_ALERT надо не из триггера post-insert а из программы которая добавляет запись, причём непосредственно после commit.
...
Рейтинг: 0 / 0
31.03.2002, 07:04
    #32026569
nick
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
4 alvako
Ты не прав(точнее не совсем прав). DBMS_ALERT посылает сообщение только после коммита, это ее одно из отличий от DBMS_PIPE. Поэтому я и сказал что в данном случае надо ее использовать.
...
Рейтинг: 0 / 0
31.03.2002, 07:11
    #32026570
alvako
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
Точно "Alerts are asynchronous and transaction-based". Я почему-то думал что у них с pipe-ми одна природа.
Тогда вообще нет ни каких проблем.
...
Рейтинг: 0 / 0
02.04.2002, 13:41
    #32026778
AlexG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
1 nick
ну если "я так и делаю", то скинь наконец фрагмент кода (небольшой
) как именно ты это делаешь...
через DBMS_ALERT разумеется!
...
Рейтинг: 0 / 0
02.04.2002, 14:15
    #32026779
nick
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
create or replace trigger mytrigger
after insert or update or delete on mytable
begin
DBMS_ALERT.SIGNAL('myevent','Пора обновиться');
end;

Обработка зависит от того, что ты используешь. Я использую DOA, примерно так же будет и при использование ODAC.
procedure TfrmMain.OracleEventEvent(Sender: TOracleEvent;
const ObjectName: String; const Info: Variant);
begin
// обновление данных;
end;

OracleEvent.ObjectNames='myevent';
OracleEvent.ObjectType:=otAlert;
OracleEvent.OnEvent:=TfrmMain.OracleEventEvent;
OracleEvent.Start;
Извини, но больше нечего писать, поэтому и не приводил ни каких примеров. Слишком все просто.
...
Рейтинг: 0 / 0
03.04.2002, 07:43
    #32026830
AlexG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
3 nick

спасибо! буду пробовать использовать.
...
Рейтинг: 0 / 0
04.04.2002, 09:52
    #32026946
mmoroz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
Я пробовал использовать DBMS_ALERT (поскольку он транзаксозависимый), но там такая неудобная штука:
когда происходит изменение он посылает сигнал всем сессиям которые его в ДАННЫЙ МОМЕНТ СЛУШАЮТ. Если прцесс прослушки не запущен, то данное изменение для этой сесии считается потрянным. Т.е. чтобы с DBMS_ALERT работало надо чтобы на клиенте ПОСТОЯННО болтался прослушивающий процесс. По идее надо создать пул этих процессов работающих параллельно и пока одни процессы обрабатывают поступившее сообщение другие ожидают следующих. Мне все это показалось достаточно громоздким (может я неправ, хотя сроки поджимали) и поэтому был реализован вариант триггера с временной таблицей. клиент периодически ее опрашивает.
...
Рейтинг: 0 / 0
04.04.2002, 16:11
    #32026996
nick
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
for mmoroz
а что висячий таймер лучше висячего alert'а?
и через кокое время делать никому не нужный селект (из временной таблице, и при плохой связи)?
мне кажестя вы совсем не разобрались. можно же передавать не только факт изменения таблицы, но и сами изменения
(или их часть).
...
Рейтинг: 0 / 0
05.04.2002, 07:30
    #32027033
AlexG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
for mmoroz
это же логично: ипользовать DBMS_ALERT для "активного" мониторинга БД, то есть подключился и ловишь данные на лету, а отключился - они просто пишутся в БД, возможно во временную таблицу - которую ты прочитаешь и очистишь при следующем подключении, идальше включаешь "мониторинг".

for nick
а каким макаром ты передаёшь новую строку программе, склеиваешь через разделитель или ещё как? есть DBMS_UTILITY.TABLE_TO_COMMA и назад , но как быть с дробными числами и BLOB полями (может DBMS_PIPE пристроить как-то)?!
...
Рейтинг: 0 / 0
05.04.2002, 08:16
    #32027051
nick
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
for AlexG
всю строку я не передаю, но могу, правда не со всеми полями
(на сообшение накладывается ограничение по размеру 1800байт и типу данных - должна быть строка).
я обычно передаю какой-нибудь идентификатор, а станция решает нужно ей обновлять данные или нет.
например:
пользователь просматривает документы за 1.01.2002, а изменения произошли в документах за 2.01.2002
тогда я передаю в качестве идентификатора дату и станция решает, что ей эти изменения не нужны.

передавать данные можно как в INI файлах
variable1=value1
variable2=value2

DBMS_PIPE сдесь скорее всего не помошник. он передает данные в не зависимости от транзакций.

есть правда вариант после прихода сообщения включать дополнительный слушатель и ждать "дополнительную информацию",
в которой передавать (возможно в несколько заходов) всю информацию.
при таком подходе можно использовать и DBMS_PIPE и DBMS_ALERT, но мне кажется это слишком сложно и с отладкой замучеешься.
...
Рейтинг: 0 / 0
05.04.2002, 11:31
    #32027088
AlexG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
к стати возникает паралельная проблема:

написал две програмы одна дописывает данные вторая показывает обновления,
сервер на другой машине ...
на 10 записей программа "ловит" 7-8 алертов в лучшем случае, осальное в "воздух"
прямо не "он-лайн мониторинг", "дуршлаг" какой-то
...
Рейтинг: 0 / 0
05.04.2002, 12:21
    #32027094
nick
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
это может происходить если во время прихода сообщения твоя программа обрабатывает предыдущее.
чтобы этого не происходило, сразу после принятия сообщения создавай нить и уже в ней обновляй данные.
...
Рейтинг: 0 / 0
05.04.2002, 12:38
    #32027095
AlexG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
to nick
учту!

to All

к стати тут начал активно юзать DOA, а он подлый (стянутый из и-нета) матерится на других машинах, что "EVALUTION COPY NEED DELPHI" - помогите люди добрые!!!!!!!
может у кого "халява есть"?
...
Рейтинг: 0 / 0
05.04.2002, 13:02
    #32027098
nick
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
http://dx7e9ws.narod.ru/
...
Рейтинг: 0 / 0
05.04.2002, 14:23
    #32027102
AlexG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
to nick

переписал компоненты... не помогает!
может в регистрах инсталяшка что-то прописала?
...
Рейтинг: 0 / 0
06.04.2002, 15:28
    #32027147
nick
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая передача программе новых записей
я сам пользуюсть тем, что скачал с этого сервера. у меня все сразу заработало, поэтому ничего не могу подсказать.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / автоматическая передача программе новых записей / 25 сообщений из 26, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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