Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Еще раз вопрос об посылке сообщений / 13 сообщений из 13, страница 1 из 1
29.01.2003, 05:37
    #32097838
Ulba_2002
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз вопрос об посылке сообщений
Прочитал сообщения и рекомендации об использовании DBMS_PIPE и DBMS_ALERT и о способах отправки сообщений, но так и не разобрался, как сделать. Помогите. Задача: При работе в клиентской программе (написана на Delphi с использованием ODAC) под Oracle необходимо посылать сообщения другим клиентам работающим с такой же программой. (И заодно еще вопрос: а можно ли сделать так, чтобы сообщения посылались из этой программы любому пользователю, т.е. любой сессии не зависимо от того, какой программой он подцепился в данной БД и работает). Хотелось бы простой и понятный пример, можно по email
...
Рейтинг: 0 / 0
29.01.2003, 09:48
    #32097912
m_kus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз вопрос об посылке сообщений
Так как не имею примера, отвечаю на вопрос в скобках...
Чтобы сообщения уходили всем пользователям необходимо использовать DBMS_ALERT - он именно для того и предназначен, чтобы информация уходила в любую сессию (естественно независимо от программы), которая заявила о своём желании получать такие сообщения... То бишь можно...
...
Рейтинг: 0 / 0
29.01.2003, 10:30
    #32097940
Славик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз вопрос об посылке сообщений
Лови e-mail
...
Рейтинг: 0 / 0
29.01.2003, 13:53
    #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
29.01.2003, 13:56
    #32098158
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз вопрос об посылке сообщений
А зачем делать remove, а потом сразу register?
...
Рейтинг: 0 / 0
29.01.2003, 15:08
    #32098220
Oleg Afanasiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз вопрос об посылке сообщений
Там же написано _ТЕСТЫ_
;_))
...
Рейтинг: 0 / 0
29.01.2003, 15:18
    #32098236
Oleg Afanasiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз вопрос об посылке сообщений
2Ulba_2002:
А вообще там вместо перерегистрации нужно COMMIT поставить наче сообщение так и будет висеть
$_)
...
Рейтинг: 0 / 0
29.01.2003, 15:35
    #32098257
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз вопрос об посылке сообщений
Не будет он висеть. Алерт на то и алерт, чтобы его в сессии единожды получить, даже если он несколько раз послан до чтения. Ты проведи эксперимент, просигналь подряд несколько раз одним алертом, для наглядности с разными сообщениями, а потом в другой сессии прочитай. Так получишь только один раз, с последним сообщением. И коммита никакого не надо:)
...
Рейтинг: 0 / 0
31.01.2003, 13:08
    #32099502
Oleg Afanasiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз вопрос об посылке сообщений
Неа я проверял не один раз :-)
Если при приёме не поставить commit то все остальные разы так и будешь одно сообщение получать
...
Рейтинг: 0 / 0
31.01.2003, 13:25
    #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
31.01.2003, 17:36
    #32099807
Oleg Afanasiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз вопрос об посылке сообщений
да не о том я говорил
Если не сделать commit в принимающей сессии то будешь получать
одно и то же сообщение постоянно при вызове wait
тоесть
1 сессия : signal('CHANNEL','LALALALALa');
commit;

2 сессия: waitone(...)
сообщение:"LALALALALa"
2 сессия: waitone(...)
commit;
сообщение:"LALALALALa"
2 сессия: waitone(...)
сообщение:""
...
Рейтинг: 0 / 0
31.01.2003, 17:41
    #32099813
Oleg Afanasiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз вопрос об посылке сообщений
Что-то я совсем запутался ;-P
Для waitone commit не нужен-сообщение и так уничтожается
Для waitany commit не помогает...
да уж...
...
Рейтинг: 0 / 0
31.01.2003, 18:07
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Еще раз вопрос об посылке сообщений / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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