Bạn có thể viết một thủ tục được lưu trữ và sắp xếp lại thư trong PL / SQL và chuyển đổi nó thành văn bản XML và trả về nó dưới dạng CLOB. Sau đó, bạn có thể gọi thủ tục được lưu trữ từ Java với JDBC. Tôi đã sử dụng một cách giải quyết tương tự trước đây khi API AQ thuần túy thiếu tính năng.
Ví dụ:
create or replace procedure dequeue_lcr(
p_queue_name varchar2,
p_consumer varchar2,
p_wait_seconds number,
p_lcr out clob) as
deq_lcr anydata;
deq_xml xmltype;
msgid raw(16);
deqopt dbms_aq.dequeue_options_t;
mprop dbms_aq.message_properties_t;
no_messages exception;
pragma exception_init (no_messages, -25228);
begin
deqopt.consumer_name := p_consumer;
deqopt.wait := p_wait_seconds;
deqopt.navigation := dbms_aq.first_message;
deqopt.dequeue_mode := dbms_aq.remove;
begin
dbms_aq.dequeue(
queue_name => p_queue_name,
dequeue_options => deqopt,
message_properties => mprop,
payload => deq_lcr,
msgid => msgid);
deq_xml := dbms_streams.convert_lcr_to_xml(deq_lcr);
p_lcr := deq_xml.getclobval();
commit;
exception
when no_messages then
p_lcr := null;
end;
end;
Điều này hoạt động khi tôi gọi nó từ PL / SQL với hàng đợi và người tiêu dùng thích hợp:
declare
v_clob clob;
begin
dequeue_lcr('aqtest.hcb_queue_any', 'LOCAL_AGENT', 5, v_clob);
if (v_clob is not null) then
dbms_output.put_line('Data: ' || v_clob);
else
dbms_output.put_line('No messages');
end if;
end;
Chỉ cần thực hiện cuộc gọi từ Java với CallableStatement với tham số đầu ra là clob và bạn đã sẵn sàng!