TOracleQueue and LOB

Bjarte

Member
Hi,

How can I retreive lob data using TOracleQueue.
Example taken from 10g documentation and DemoQueue project:

type:

CREATE TYPE aq.message AS OBJECT(id NUMBER,
subject VARCHAR2(100),
data BLOB,
trailer NUMBER);

enqueue:

CREATE OR REPLACE PROCEDURE blobenqueue(msgno IN NUMBER) AS
enq_userdata aq.message;
enq_msgid RAW(16);
enqopt DBMS_AQ.enqueue_options_t;
msgprop DBMS_AQ.message_properties_t;
lob_loc BLOB;
buffer RAW(4096);

BEGIN

buffer := HEXTORAW(RPAD('FF', 4096, 'FF'));
enq_userdata := aq.message(msgno, 'Large Lob data', EMPTY_BLOB(), msgno);
DBMS_AQ.ENQUEUE('aq.queue1', enqopt, msgprop, enq_userdata, enq_msgid);

--select the lob locator for the queue table
SELECT t.user_data.data INTO lob_loc
FROM qt1 t
WHERE t.msgid = enq_msgid;

DBMS_LOB.WRITE(lob_loc, 2000, 1, buffer );
COMMIT;
END;

delphi dequeue:

procedure TForm1.ReceiveQueueThreadDequeued(Sender: TOracleQueue);
var
LOB: TLOBLocator;
M: TMemoryStream;
begin
Display('Message received: ' + Sender.MessageProperties.Msgid);
Display('Message enqueued: ' + FormatDateTime('c', Sender.MessageProperties.EnqueueTime));
Display('Message subject : ' + Sender.Payload.GetAttr('subject'));
Display('');

M := TMemoryStream.Create;
LOB := TLOBLocator.Create(ReceiveSession, otBLOB);
try
LOB := Sender.Payload.LOBAttr('data');
M.CopyFrom(LOB, LOB.Size);
finally
LOB.Free;
M.Free;
end;
end;

The LOB.Size = 0 for this example.
What can be wrong?

Using plsql dequeue works fine.
The varchar2 subject attribute is displayed correctly.

Thanks in advance,

Bjarte
 
Back
Top