2

Oracle10.2.0.4.0で関数DBMS_AQ.DEQUEUE_ARRAYを使用しようとしています。キューの内容を参照します。メッセージ配列に使用するタイプを決定する方法はありますか?私が使用できる「一般的な」タイプはありますか?私が試みているのは次のとおりです。

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です。

管理者アカウントを使用できませんが、タイプと関数を作成する権限があります。この情報を特定する方法がない場合、この情報を特定できるように、管理者に実行を依頼する必要があるのはどのタイプのクエリですか。

ありがとう!

4

1 に答える 1

0

It's probable your queue was created with a payload type when CREATE_QUEUE_TABLE was run. You can therefore find out the type for the queue by performing this query:

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

Then your function can use this:

type I_NEED_THIS_TYPE is varray(100) of <OBJECT_TYPE>;
于 2012-02-09T10:17:22.083 に答える