【发布时间】:2021-11-12 05:23:59
【问题描述】:
给定:
create TYPE things IS VARRAY(1) OF THING_TYP NOT NULL;
还有一个 Oracle AQ 队列表和一个队列 @987654322@,使用 JDBC CallableStatement 调用 DBMS_AQ.ENQUEUE_ARRAY 会在 ojdbc.jar 内的专有 Oracle 代码深处产生一个 ArrayIndexOutOfBoundsException。下一个查询导致协议错误 - 似乎上一个错误导致驱动程序中的协议读取代码不同步,因为它没有完成。
但是,这种类型的调用最初在 SQL Developer 中确实有效!那么可能是队列或队列表进入了不良状态?
下面是一个简单的、未参数化的 PL/SQL 示例。运行这个 - 这与最初工作的调用相同 - 在 SQL Developer 中似乎也产生了相同的症状。虽然 SQL Developer 没有向用户显示 ArrayIndexOutOfBoundsException - 它只是没有显示任何输出 - 日志页面上有异常堆栈跟踪的片段,当我尝试刷新时它确实显示了后续协议错误左侧树视图中的队列列表。
DECLARE
enqueue_options DBMS_AQ.enqueue_options_t;
msg_prop_array DBMS_AQ.message_properties_array_t;
msg_prop DBMS_AQ.message_properties_t;
payload_array things := things(THING_TYP(IDENTIFIERVALUE => 'abc'));
msgid_array DBMS_AQ.msgid_array_t;
retval PLS_INTEGER;
BEGIN
msg_prop_array := DBMS_AQ.message_properties_array_t(msg_prop);
retval := DBMS_AQ.ENQUEUE_ARRAY(
queue_name => 'FOO_BAR',
enqueue_options => enqueue_options,
array_size => 1,
message_properties_array => msg_prop_array,
payload_array => payload_array,
msgid_array => msgid_array);
END;
我如何尝试诊断队列可能出了什么问题?
(一个可能的线索是,我之前在尝试调用相同的存储过程时创建并删除了一些临时 VARRAY 类型 - 由一条错误消息提示,指出消息数组的大小必须与消息属性数组。鉴于我的数组将具有不同的大小,我决定每次创建临时 VARRAY 类型并在加载数据后删除它们。但这可能无关紧要,因为 VARRAY 只能用作临时类型将数据传输到队列中的存储过程 - 它们不应用作队列或队列表本身的一部分。)
更新:看起来它没有最初工作,它只是看起来像它一样。在该队列表中创建一个新的队列表和一个新队列,然后针对新队列运行该 PL/SQL,会导致相同的问题 - 没有输出,然后在我尝试刷新队列列表时出现协议错误。
【问题讨论】:
标签: oracle jdbc oracle-sqldeveloper callable-statement oracle-aq