如何确定 DBMS_AQ.DEQUEUE_ARRAY 的负载类型
Posted
技术标签:
【中文标题】如何确定 DBMS_AQ.DEQUEUE_ARRAY 的负载类型【英文标题】:How to determine payload type for DBMS_AQ.DEQUEUE_ARRAY 【发布时间】:2012-03-01 08:43:20 【问题描述】:我正在尝试在 Oracle 10.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。
我无法使用管理员帐户,但有创建类型和功能的权限。如果无法确定此信息,我应该要求管理员运行哪种类型的查询,以便我可以确定此信息?
谢谢!
【问题讨论】:
【参考方案1】:运行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>;
【讨论】:
我想我更接近了。我实际上必须对 all_queue_tables 运行该查询。之后,类型为 SYS.xmltype。我添加了类型 myArrType 是 SYS.xmltype 的 varray(100);并制作了 msgArray := myArrType();创建函数时,我仍然收到 PLS-00306: wrong number or types of arguments in call to 'DEQUEUE_ARRAY' 在对DEQUEUE_ARRAY
的调用中使用参数名称message_properties_array
而不是message_properties
。以上是关于如何确定 DBMS_AQ.DEQUEUE_ARRAY 的负载类型的主要内容,如果未能解决你的问题,请参考以下文章