我们创建具有各种属性的消息并将其排入队列,如下所示:
message := sys.aq$_jms_message.construct(0);
message.set_string_property('a', v_a));
message.set_int_property('b', v_b);
message.set_int_property('c', v_c);
message.set_string_property('d', v_d);
DBMS_AQ.ENQUEUE(queue_name => SOME_QUEUE,
enqueue_options => queue_options,
message_properties => message_properties,
payload => message,
msgid => message_id);
成功运行了很长时间后,我们突然得到
ORA-01426: numeric overflow ORA-06512: at "SYS.DBMS_AQ"
什么可能导致这种情况?使用新队列表对新创建的队列运行相同的排队代码会产生相同的结果。
原来这个问题与消息属性无关,甚至可能与消息本身无关。这里的原因实际上是 Oracle 中的一个错误,当值为
达到 2^31。实际上,Oracle 提供了相应的补丁:
补丁 14837395:当 DB 对象编号大于 2^31 时,AQ 调用失败并出现数字溢出