Oracle Advanced Queuing — ORA-38818 — незаконная ссылка на отредактированный объект

#oracle #plsql #advanced-queuing

#Oracle #plsql #продвинутый -постановка в очередь #дополнительно -постановка в очередь

Вопрос:

Похоже, нужна некоторая помощь в этом вопросе. Я пытаюсь создать некоторую таблицу очередей на основе типа объекта в соответствии с приведенным ниже сценарием;

0.

 ...  
GRANT EXECUTE ON dbms_aq TO sch_utl  
/
GRANT EXECUTE ON dbms_aqadm TO sch_utl  
/
GRANT aq_administrator_role TO sch_utl  
/
BEGIN
  DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE(privilege => 'MANAGE_ANY'
                                ,grantee => 'sch_utl'
                                ,admin_option => FALSE);

END;
/    
  

1.

 create or replace type o_utl_q_log as object
(/*some variables*/   

constructor function o_utl_q_log return self as result,  

member procedure queue_enqueue, 

static function queue_dequeue(p_wait number default 0)
  return o_utl_q_log,
);
  

2.

 create or replace type body o_utl_q_log
(
  ...
);
  

Тип и его тело компилируются без ошибок, проблема возникает, когда;

3.

 begin
  dbms_aqadm.create_queue_table( queue_table => 't_utl_q_log'
                            , queue_payload_type => 'o_utl_q_log'
                            , sort_list => 'PRIORITY,ENQ_TIME'
                            , storage_clause => 'tablespace TS_UTL_Q_TABLE_LOG'
                            , comment => 'Log queue table') ;
end;
  

Я получаю это описание ошибки;
ORA-38818: незаконная ссылка на отредактированный объект SCH_UTL.O_UTL_Q_LOG
ORA-06512: в «SYS.DBMS_AQADM», строка 81
ORA-06512: в строке 2
38818. 00000 — «незаконная ссылка на отредактированный объект %s.%s»
* Причина: была предпринята попытка нарушить правило «Неотредактированный объект
не может зависеть от отредактированного объекта».

На всякий случай я работаю над XE 11g R2.

Большое спасибо всем за любую помощь!

Ответ №1:

По умолчанию типы доступны для редактирования. Попробуйте:

 create or replace noneditionable type o_utl_q_log as object...
  

вместо

 create or replace type o_utl_q_log as object...
  

Комментарии:

1. Мэтью, спасибо тебе за твой ответ. Похоже, что этот вариант не работает. Я попытался использовать предложение ‘noneditionable’ согласно приведенному ниже;

2. создайте или замените не подлежащий редактированию тип o_object_type как объект (номер attr) — но я получаю ora-00922 отсутствующий или недопустимый параметр. Есть еще идеи?

3. Ах … я вижу, вы на 11g. NONEDITIONABLE работает только в 12c. Извините. Единственное, что я могу предложить вам попробовать, — это создать тип под совершенно новым пользователем, у которого нет EDITIONS enabled.