Oracle: проблема с построением сообщения JMS
После некоторой борьбы с Oracle Advanced Queuing и пакетом dbms_aq я столкнулся с другой проблемой. Я скопировал код из учебников Oracle, но когда я скомпилировал этот код:
create or replace
procedure jms_test(msg varchar2)
is
id pls_integer;
message sys.aq$_jms_stream_message;
enqueue_options dbms_aq.enqueue_options_t;
message_properties dbms_aq.message_properties_t;
begin
message := sys.aq$_jms_stream_message.construct(0);
message.set_string_property('FROM', 'TEST');
id := message.clear_body(-1);
end;
жалуется на:
Error(9,40): PLS-00302: component 'CONSTRUCT' must be declared
Error(10,10): PLS-00302: component 'SET_STRING_PROPERTY' must be declared
Error(11,16): PLS-00302: component 'CLEAR_BODY' must be declared
Я думаю, что этот код работает вне тела процедуры, потому что я с успехом попробовал рецепты из Что в моей очереди JMS?
Моя версия Oracle: Oracle9i Enterprise Edition, выпуск 9.2.0.1.0 - Производство
Есть идеи, что может быть не так?
2 ответа
Похоже, проблема версии базы данных. AQ$_JMS_STREAM_MESSAGE имеет метод конструкции в 10G, но не в 9i. Какую версию Oracle Server вы используете?
Выглядит как гранты снова
GRANT EXECUTE ON SYS.aq$_jms_stream_message To <your-user>;
Имеет:
desc sys.aq$_jms_stream_message
работать в SQL*Plus с обеих схем SYS + вашей?
Обратите внимание, что SYS.AQ$_JMS_STREAM_MESSAGE является объектом / типом базы данных, тогда как SYS.DBMS_AQ является пакетом
РЕДАКТИРОВАТЬ
Хорошо... возможно тело ТИПА отсутствует / недействительно. Что значит:
SELECT owner, object_name, object_type, status
FROM dba_OBJECTS
WHERE OBJECT_NAME = 'AQ$_JMS_STREAM_MESSAGE'
вернуть?