Oracle Streams: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

在生产过程中,我们不时会在消息出列时遇到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;
          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字符串中接收到的内容。它是否在某个地方插入了违反唯一约束的内容?