Oracle Streams:ORA-0001正在退出队列?
在生产过程中,我们不时会在消息出列时遇到ORA-0001错误。我们使用:Oracle Streams:ORA-0001正在退出队列?,oracle,stream,queue,Oracle,Stream,Queue,在生产过程中,我们不时会在消息出列时遇到ORA-0001错误。我们使用: Solaris 10 甲骨文10g C++应用程序 用于排队操作的带有dbms_aq包的PROC*C 具有XML负载的队列 我们处理大量消息(1K/分钟) 有没有线索说明为什么出列会导致ORA-0001(唯一约束)错误 更新:为每个请求添加代码 EXEC SQL EXECUTE DECLARE message_properties dbms_aq.message_properties_t; dequ
EXEC SQL EXECUTE
DECLARE
message_properties dbms_aq.message_properties_t;
dequeue_options dbms_aq.dequeue_options_t;
message_payload xmltype;
tmpclob clob;
dynamic_sql_string varchar2(512);
BEGIN
dequeue_options.wait := :iReadTimeout;
dequeue_options.dequeue_mode := dbms_aq.REMOVE;
dequeue_options.visibility := dbms_aq.ON_COMMIT;
IF :iBuffered = 1 then
dequeue_options.delivery_mode := dbms_aq.buffered;
dequeue_options.visibility := dbms_aq.immediate;
:iNavigationMode := 0;
END IF;
IF :iDequeueOnly = 1 and :iQueueType <> 1 THEN
dequeue_options.dequeue_mode := dbms_aq.REMOVE_NODATA;
dequeue_options.wait := dbms_aq.NO_WAIT;
dequeue_options.msgid := hextoraw(:pszDequeueMsgId);
ELSE
IF :iNavigationMode = 0 THEN
dequeue_options.navigation := dbms_aq.FIRST_MESSAGE;
ELSE
dequeue_options.navigation := dbms_aq.NEXT_MESSAGE;
END IF;
END IF;
dequeue_options.deq_condition := :pszDeqCondition;
dbms_aq.dequeue(queue_name => :pszQueueName,
message_properties => message_properties,
dequeue_options => dequeue_options,
payload => message_payload,
msgid => :msgid );
IF dequeue_options.dequeue_mode <> dbms_aq.REMOVE_NODATA THEN
EXECUTE IMMEDIATE dynamic_sql_string USING OUT tmpclob, IN message_payload;
:gpoXmlClob := tmpclob;
ELSE
:gpoXmlClob := message_payload.getclobval();
END IF;
END;
EXEC-SQL-EXECUTE
声明
消息属性dbms\u aq.message\u properties\t;
退出选项dbms\U aq.dequeue\U选项\t;
消息类型;
tmpclob-clob;
动态sql字符串varchar2(512);
开始
退出队列_options.wait:=:iReadTimeout;
dequeue_options.dequeue_mode:=dbms_aq.REMOVE;
dequeue_options.visibility:=dbms_aq.ON_COMMIT;
如果:iBuffered=1,则
dequeue_options.delivery_mode:=dbms_aq.buffered;
dequeue_options.visibility:=dbms_aq.immediate;
:iNavigationMode:=0;
如果结束;
如果:iDequeueOnly=1和:iQueueType 1,则
dequeue_options.dequeue_mode:=dbms_aq.REMOVE_NODATA;
dequeue_options.wait:=dbms_aq.NO_wait;
dequeue_options.msgid:=hextoraw(:pszdequeueumsgid);
其他的
如果:iNavigationMode=0,则
dequeue_options.navigation:=dbms_aq.FIRST_消息;
其他的
dequeue_options.navigation:=dbms_aq.NEXT_消息;
如果结束;
如果结束;
dequeue_options.deq_条件:=:pszDeqCondition;
dbms_aq.dequeue(queue_name=>:pszQueueName,
消息属性=>消息属性,
出列_选项=>出列_选项,
有效载荷=>消息\有效载荷,
msgid=>:msgid);
如果dequeue\U options.dequeue\U mode dbms\U aq.REMOVE\U NODATA
在消息负载中使用OUT tmpclob执行即时动态\u sql\u字符串;
:gpoXmlClob:=tmpclob;
其他的
:gpoXmlClob:=消息_payload.getclobval();
如果结束;
结束;
您可以共享任何相关代码吗?检查在特定情况下执行的动态sql字符串中接收到的内容。它是否在某个地方插入了违反唯一约束的内容?