powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle Streams Advanced Queuing - не получается записать сообщение из очереди в таблицу
1 сообщений из 1, страница 1 из 1
Oracle Streams Advanced Queuing - не получается записать сообщение из очереди в таблицу
    #39401965
orarara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, пытаюсь ловить сообщения из очереди для последующей обработки:

1. Создаю пользователя со всеми (наверное?) необходимыми правами от имени SYS:

Код: plsql
1.
2.
3.
4.
CREATE USER aq IDENTIFIED BY aq;
GRANT CONNECT, RESOURCE, aq_administrator_role TO aq; 
GRANT EXECUTE ON dbms_aq TO aq; 
GRANT EXECUTE ON dbms_aqadm TO aq;



Код: plsql
1.
2.
3.
4.
5.
6.
begin 
dbms_aqadm.grant_system_privilege 
('ENQUEUE_ANY','AQ',FALSE); 
 dbms_aqadm.grant_system_privilege 
('DEQUEUE_ANY','AQ',FALSE); 
end; 



2. Перелогиниваюсь на созданного пользователя
3.Создаю тип
Код: plsql
1.
CREATE type aq.Message_typ as object ( subject VARCHAR2(30), text VARCHAR2(80)); 


4. Создаю очередь и связанную таблицу

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 begin 
DBMS_AQADM.CREATE_QUEUE_TABLE 
( queue_table => 'aq.objmsgs80_qtab', 
queue_payload_type => 'aq.Message_typ', 
multiple_consumers => TRUE ); 

DBMS_AQADM.CREATE_QUEUE 
( queue_name => 'MSG_QUEUE', 
queue_table => 'aq.objmsgs80_qtab'); 

DBMS_AQADM.START_QUEUE 
( queue_name => 'MSG_QUEUE'); 
 end; 



4.1 Таблицу, в которую я планирую писать сообщения

Код: plsql
1.
create table message_table( msg varchar2(4000) ); 



5. Создаю процедуры

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create procedure enqueue_msg( p_msg in varchar2 ) 
as 
enqueue_options dbms_aq.enqueue_options_t; 
message_properties dbms_aq.message_properties_t; 
message_handle RAW(16); 
message aq.message_typ; 
BEGIN 
message := message_typ('NORMAL MESSAGE', p_msg ); 
dbms_aq.enqueue(queue_name => 'msg_queue', 
enqueue_options => enqueue_options, 
message_properties => message_properties, 
payload => message, 
 msgid => message_handle); 
end; 



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create or replace procedure notifyCB( context raw, 
reginfo sys.aq$_reg_info, 
descr sys.aq$_descriptor, 
payload raw, 
payloadl number) 
as 
dequeue_options dbms_aq.dequeue_options_t; 
message_properties dbms_aq.message_properties_t; 
message_handle RAW(16); 
message aq.message_typ; 
BEGIN 
dequeue_options.msgid := descr.msg_id; 
dequeue_options.consumer_name := descr.consumer_name; 
DBMS_AQ.DEQUEUE(queue_name => descr.queue_name, 
dequeue_options => dequeue_options, 
message_properties => message_properties, 
 payload => message, 
msgid => message_handle); 
insert into message_table values 
( 'Dequeued and processed "' || message.text || '"' ); 
COMMIT; 
 END; 



Код: plsql
1.
2.
3.
4.
5.
begin 
dbms_aqadm.add_subscriber 
( queue_name => 'aq.msg_queue', 
subscriber => sys.aq$_agent( 'recipient', null, null ) ); 
end; 



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
BEGIN 
dbms_aq.register 
( sys.aq$_reg_info_list( 
sys.aq$_reg_info('AQ.MSG_QUEUE:RECIPIENT', 
DBMS_AQ.NAMESPACE_AQ, 
'plsql://AQ.notifyCB', 
HEXTORAW('FF')) ) , 1 ); 
end; 



6. Проверяю, есть ли записи в таблице, перед тем как толкнуть сообщение в очередь.
Код: plsql
1.
select * from message_table; 



Таблица соответственно пуста.

7. Отправляю сообщение

Код: plsql
1.
 exec enqueue_msg( 'This is a test....' ); 



Ну и делаю коммит, естественно. Затем проверяю таблицу снова:

Код: plsql
1.
select * from message_table; 



Она снова пуста. Но в очереди сообщение висит. Что может быть не так?

PS ORACLE 11g
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle Streams Advanced Queuing - не получается записать сообщение из очереди в таблицу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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