Как определить тип полезной нагрузки для DBMS_AQ.DEQUEUE_ARRAY - PullRequest
2 голосов
/ 09 февраля 2012

Я пытаюсь использовать функцию DBMS_AQ.DEQUEUE_ARRAY в Oracle 10.2.0.4.0.просматривать содержимое очереди.Есть ли способ определить тип для использования в массиве сообщений?Есть ли какой-нибудь "универсальный" тип, который я мог бы использовать?Я пытаюсь сделать следующее:

CREATE or REPLACE TYPE I_NEED_THIS_TYPE AS ????
/

CREATE or REPLACE myFunction
  return pls_integer
IS

dequeue_options     DBMS_AQ.dequeue_options_t;
message_properties  DBMS_AQ.message_properties_t;
msgPropArray   DBMS_AQ.message_properties_array_t;
msgIdArray      DBMS_AQ.msgid_array_t;
msgArray        I_NEED_THIS_TYPE;
cMsgs pls_integer;

BEGIN

msgPropArray  := DBMS_AQ.message_properties_array_t();
msgIdArray     := dbms_aq.msgid_array_t();
msgArray       := I_NEED_THIS_TYPE();


--where SOME_NAME and SOME_QUEUE_TABLE I get from
--select owner,name from user_queues;
dequeue_options.CONSUMER_NAME := 'SOME_NAME.SOME_QUEUE_TABLE';
dequeue_options.DEQUEUE_MODE := DBMS_AQ.BROWSE;
dequeue_options.NAVIGATION := DBMS_AQ.FIRST_MESSAGE;
dequeue_options.VISIBILITY := DBMS_AQ.IMMEDIATE;
dequeue_options.WAIT := DBMS_AQ.NO_WAIT;
dequeue_options.MSGID := null;

   cMsgs := DBMS_AQ.DEQUEUE_ARRAY(
      queue_name          =>     'MY_QUEUE_NAME',
      dequeue_options     =>     dequeue_options,
      array_size          =>     30,
      message_properties  =>     msgPropArray,
      payload_array       =>     msgArray,
      msgid_array         =>     msgIdArray);

  return cMsgs;
END;
/

Я пробовал многочисленные комбинации

CREATE or REPLACE TYPE I_NEED_THIS_TYPE AS VARRAY(100) of CLOB;
CREATE or REPLACE TYPE I_NEED_THIS_TYPE AS VARRAY(100) of SYS.xmltype;
CREATE or REPLACE TYPE I_NEED_THIS_TYPE AS VARRAY(100) of xmltype;


CREATE or REPLACE TYPE I_NEED_THIS_TYPE AS OBJECT(
id NUMBER,
xmlData CLOB
)


DECLARE
TYPE assoc_array is TABLE OF CLOB index by pls_integer;
myData assoc_array;

Я могу использовать функцию DBMS_AQ.DEQUEUE, как и ожидалось, параметр сообщения дляэто SYS.xmltype.

Я не могу использовать учетную запись администратора, но у меня есть права доступа для создания типов и функций.Если нет способа определить эту информацию, какой тип запроса я должен попросить администратора выполнить, чтобы я мог определить эту информацию?

Спасибо!

1 Ответ

0 голосов
/ 09 февраля 2012

Вероятно, ваша очередь была создана с типом полезной нагрузки при запуске CREATE_QUEUE_TABLE.Поэтому вы можете узнать тип очереди, выполнив этот запрос:

select OBJECT_TYPE
  from DBA_QUEUE_TABLES
 where OWNER = 'SOME_NAME' and QUEUE_TABLE = 'SOME_QUEUE_TABLE';

Тогда ваша функция может использовать это:

type I_NEED_THIS_TYPE is varray(100) of <OBJECT_TYPE>;
...