powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Еще раз вопрос об посылке сообщений
13 сообщений из 13, страница 1 из 1
Еще раз вопрос об посылке сообщений
    #32097838
Ulba_2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитал сообщения и рекомендации об использовании DBMS_PIPE и DBMS_ALERT и о способах отправки сообщений, но так и не разобрался, как сделать. Помогите. Задача: При работе в клиентской программе (написана на Delphi с использованием ODAC) под Oracle необходимо посылать сообщения другим клиентам работающим с такой же программой. (И заодно еще вопрос: а можно ли сделать так, чтобы сообщения посылались из этой программы любому пользователю, т.е. любой сессии не зависимо от того, какой программой он подцепился в данной БД и работает). Хотелось бы простой и понятный пример, можно по email
...
Рейтинг: 0 / 0
Еще раз вопрос об посылке сообщений
    #32097912
m_kus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так как не имею примера, отвечаю на вопрос в скобках...
Чтобы сообщения уходили всем пользователям необходимо использовать DBMS_ALERT - он именно для того и предназначен, чтобы информация уходила в любую сессию (естественно независимо от программы), которая заявила о своём желании получать такие сообщения... То бишь можно...
...
Рейтинг: 0 / 0
Еще раз вопрос об посылке сообщений
    #32097940
Славик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лови e-mail
...
Рейтинг: 0 / 0
Еще раз вопрос об посылке сообщений
    #32098154
Фотография Oleg Afanasiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем вот мои тесты с сообщениями Всё работает.

Код: plaintext
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.
37.
38.
 --у админа код такой:
 
declare
begin
dbms_alert.signal('ADM000','òåñò!!'); --ñîîáùåíèå íå äîëæíî ïðåâûøàòü 1800 ñèìâîëîâ
 
commit;
end;
 --на клиенте такой код:
 
 --при коннекте к серверу регистрируем канал
 
declare
begin
dbms_alert.register('ADM000');
end;
 --далее слушаем только канал админа
 
declare
vsignal varchar2( 20 );
vmessage varchar2( 1800 ); --сообщение не должно превышать 1800 символов
 
vstatus number;
vtime number;
begin
vsignal:='ADM000';
vtime:= 0 ;
dbms_alert.waitone(vsignal,vmessage,vstatus,vtime);
if ltrim(rtrim(vmessage))<>' ' then
dbms_output.put_line(vmessage);
dbms_alert.remove('ADM000'); --перерегистрируем когда сообщение пришло
 
 --(это нужно сделать)
 
dbms_alert.register('ADM000');
end if;

end;
...
Рейтинг: 0 / 0
Еще раз вопрос об посылке сообщений
    #32098158
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем делать remove, а потом сразу register?
...
Рейтинг: 0 / 0
Еще раз вопрос об посылке сообщений
    #32098220
Фотография Oleg Afanasiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там же написано _ТЕСТЫ_
;_))
...
Рейтинг: 0 / 0
Еще раз вопрос об посылке сообщений
    #32098236
Фотография Oleg Afanasiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Ulba_2002:
А вообще там вместо перерегистрации нужно COMMIT поставить наче сообщение так и будет висеть
$_)
...
Рейтинг: 0 / 0
Еще раз вопрос об посылке сообщений
    #32098257
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не будет он висеть. Алерт на то и алерт, чтобы его в сессии единожды получить, даже если он несколько раз послан до чтения. Ты проведи эксперимент, просигналь подряд несколько раз одним алертом, для наглядности с разными сообщениями, а потом в другой сессии прочитай. Так получишь только один раз, с последним сообщением. И коммита никакого не надо:)
...
Рейтинг: 0 / 0
Еще раз вопрос об посылке сообщений
    #32099502
Фотография Oleg Afanasiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неа я проверял не один раз :-)
Если при приёме не поставить commit то все остальные разы так и будешь одно сообщение получать
...
Рейтинг: 0 / 0
Еще раз вопрос об посылке сообщений
    #32099519
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погоди.
1-я сессия:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
dan@oraspb>; create or replace procedure get_any_alert as
   2     v_name varchar2( 64 );
   3     v_message varchar2( 64 );
   4     v_status integer;
   5   begin
   6     dbms_output.enable( 20000 );
   7     dbms_alert.waitany(
   8         name => v_name
   9       , message => v_message
  10       , status => v_status
  11       , timeout =>  0 
  12     );
  13     if v_status =  0  then
  14       dbms_output.put_line('Alert occurred, name="'||v_name||'", message="'||v_message||'"');
  15     end if;
  16   end;
  17   /

Procedure created.

dan@oraspb>; exec dbms_alert.register('MY_ALERT');

PL/SQL procedure successfully completed.

2-я сессия:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
dan@oraspb>; exec dbms_alert.signal('MY_ALERT', 'My Message');

PL/SQL procedure successfully completed.

dan@oraspb>; commit;

Commit complete.

dan@oraspb>; 
dan@oraspb>; exec dbms_alert.signal('MY_ALERT', 'My Message2');

PL/SQL procedure successfully completed.

dan@oraspb>; commit;

Commit complete.

1-я сессия:
Код: plaintext
1.
2.
3.
4.
dan@oraspb>; exec get_any_alert;
Alert occurred, name= "MY_ALERT" , message= "My Message2" 

PL/SQL procedure successfully completed.

Заметь: Message2, первое куда-то испарилось. Commit не говорим.
2-я сессия:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
dan@oraspb>; exec dbms_alert.signal('MY_ALERT', 'My Message3');

PL/SQL procedure successfully completed.

dan@oraspb>; commit;

Commit complete.

1-я сессия:
Код: plaintext
1.
2.
3.
4.
dan@oraspb>; exec get_any_alert;
Alert occurred, name= "MY_ALERT" , message= "My Message3" 

PL/SQL procedure successfully completed.

Вот. Получили последнее сообщение. Commit'а в 1-й сессии не было:)
...
Рейтинг: 0 / 0
Еще раз вопрос об посылке сообщений
    #32099807
Фотография Oleg Afanasiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да не о том я говорил
Если не сделать commit в принимающей сессии то будешь получать
одно и то же сообщение постоянно при вызове wait
тоесть
1 сессия : signal('CHANNEL','LALALALALa');
commit;

2 сессия: waitone(...)
сообщение:"LALALALALa"
2 сессия: waitone(...)
commit;
сообщение:"LALALALALa"
2 сессия: waitone(...)
сообщение:""
...
Рейтинг: 0 / 0
Еще раз вопрос об посылке сообщений
    #32099813
Фотография Oleg Afanasiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я совсем запутался ;-P
Для waitone commit не нужен-сообщение и так уничтожается
Для waitany commit не помогает...
да уж...
...
Рейтинг: 0 / 0
Еще раз вопрос об посылке сообщений
    #32099832
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То ли это от версии оракла зависит, то ли еще от чего, но у меня безо всякого commita waitone принимает последний алерт:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create or replace procedure get_one_alert(p_alert varchar2) as
  v_message varchar2( 64 );
  v_status integer;
begin
  dbms_output.enable( 20000 );
  dbms_alert.waitone(
      name => p_alert
    , message => v_message
    , status => v_status
    , timeout =>  0 
  );
  if v_status =  0  then
    dbms_output.put_line('Alert occurred, name="'||p_alert||'", message="'||v_message||'"');
  end if;
end;
/

2-я сессия:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
dan@oraspb>; exec dbms_alert.signal('MY_ALERT', 'My Message');

PL/SQL procedure successfully completed.

dan@oraspb>; commit;

Commit complete.

1-я сессия:
Код: plaintext
1.
2.
dan@oraspb>;  exec get_one_alert('MY_ALERT');
Alert occurred, name= "MY_ALERT" , message= "My Message" 

Не делаем тут commit'а, а во 2-й сессии:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
dan@oraspb>; exec dbms_alert.signal('MY_ALERT', 'My Message2');

PL/SQL procedure successfully completed.

dan@oraspb>; commit;

Commit complete.

И смотрим на 1-ю:
Код: plaintext
1.
2.
dan@oraspb>;  exec get_one_alert('MY_ALERT');
Alert occurred, name= "MY_ALERT" , message= "My Message2" 

Все по-честному. Единственное отличие- если ты не зарегестрирован ни на один алерт, waitany возвращает exception, а waitone это безразлично.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Еще раз вопрос об посылке сообщений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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