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'

вернуть?

Другие вопросы по тегам