Hello Alex,
AlexP wrote:You can use the following code to obtain the needed result:
Thanks a lot. With your code I'm receiving "something" during the dequeuing. "Something" means the "length" value is for example "14655", but the Payload is "" (empty). Any idea what's wrong here?
I really appreciate your feedback. Thanks in advance. M. Drück
my component "mom_out" as text:
Code: Select all
object mom_out: TMemo
Left = 0
Top = 40
Width = 784
Height = 344
Align = alBottom
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Courier New'
Font.Style = []
Lines.Strings = (
''
''
''
'q4de3msys11:7384cfc6:125feac3cf8:-7fe8'
'1.3'
'DATASET'
''
'op_turn'
'2011-07-20T00:00:00.000'
'2011-07-27T23:59:59.000'
''
'##timestamp##'
''
''
''
'')
ParentFont = False
TabOrder = 1
end
my component "OraSession1" as text:
Code: Select all
object OraSession1: TOraSession
Username = 'am'
Password = '*******'
Server = '******'
LoginPrompt = False
AfterConnect = OraSession1AfterConnect
BeforeConnect = OraSession1BeforeConnect
AfterDisconnect = OraSession1AfterDisconnect
BeforeDisconnect = OraSession1BeforeDisconnect
OnLogin = OraSession1Login
OnError = OraSession1Error
OnConnectionLost = OraSession1ConnectionLost
OnConnectChange = OraSession1ConnectChange
OnFailover = OraSession1Failover
OnInfoMessage = OraSession1InfoMessage
Left = 472
Top = 24
end
I altered your code for btnEnqueueNativeClick:
Code: Select all
procedure TForm1.btnEnqueueNativeClick(Sender: TObject);
var
OraSQl: TOraSQL;
s: AnsiString;
OldDateTimeFormat: string;
begin
OldDateTimeFormat := '' +
FormatDateTime('YYYY-MM-DD', Now) + 'T' +
FormatDateTime('hh:nn:ss.zzz', Now) +
'';
s := StringReplace(mom_out.Lines.Text, '##timestamp##', OldDateTimeFormat, [rfReplaceAll]);
OraSQl:= TOraSQL.Create(nil);
OraSQL.Session := OraSession1;
OraSQL.SQL.Text := 'declare' + #13 +
'msg SYS.AQ$_JMS_TEXT_MESSAGE;' + #13 +
'msg_hdr SYS.AQ$_JMS_HEADER;' + #13 +
'queue_options DBMS_AQ.ENQUEUE_OPTIONS_T;' + #13 +
'msg_props DBMS_AQ.MESSAGE_PROPERTIES_T;' + #13 +
'begin' + #13 +
'msg_hdr := SYS.AQ$_JMS_HEADER(null,null,null,null,null,null,null);' + #13 +
'msg := SYS.AQ$_JMS_TEXT_MESSAGE(msg_hdr,null,null,null);' + #13 +
'msg.text_vc := :text;' + #13 +
'msg.text_len := length(msg.text_vc);' + #13 +
'DBMS_AQ.ENQUEUE( queue_name => ''FARMSMQ.AQ_FROM_AM''' + #13 +
' , enqueue_options => queue_options' + #13 +
' , message_properties => msg_props' + #13 +
' , payload => msg' + #13 +
' , msgid => :msg_id);' + #13 +
':txt := msg.text_vc;' + #13 +
':ln := msg.text_len;' + #13 +
'end;';
OraSQL.Prepare;
OraSQL.ParamByName('text').DataType := ftString;
OraSQL.ParamByName('text').ParamType:= ptInput;
OraSQL.ParamByName('msg_id').DataType := ftString;
OraSQL.ParamByName('msg_id').ParamType := ptOutput;
OraSQL.ParamByName('txt').DataType := ftString;
OraSQL.ParamByName('txt').ParamType := ptOutput;
OraSQL.ParamByName('ln').DataType := ftInteger;
OraSQL.ParamByName('ln').ParamType := ptOutput;
OraSQL.ParamByName('text').AsString := s;
LogData(Format('SQL.Text:' + #13#10 + '[%s]', [OraSQL.SQL.Text]));
LogData('Start: OraSQL.Execute');
OraSQL.Execute;
LogData(Format('ENQUEUE:' + #13#10 + 'MsgId: [%s]' + #13#10 + 'Payload: [%s]' + #13#10 + 'Length: [%d]',
[OraSQL.ParamByName('msg_id').AsString, OraSQL.ParamByName('txt').AsString, OraSQL.ParamByName('ln').AsInteger]));
LogData('Stop: OraSQL.Execute');
end;
I altered your code for btnDequeueNativeClick:
Code: Select all
procedure TForm1.btnDequeueNativeClick(Sender: TObject);
var
OraQueue: TOraQueue;
ObjectPayload: TOraObject;
MsgId: string;
s: AnsiString;
begin
OraQueue := TOraQueue.Create(nil);
OraQueue.Session := OraSession1;
OraQueue.QueueName := 'FARMSMQ.AQ_TO_AM';
ObjectPayload := TOraObject.Create;
LogData('Start: OraQueue.Dequeue(ObjectPayload)');
MsgId := OraQueue.Dequeue(ObjectPayload);
LogData(Format('DEQUEUE:' + #13#10 + 'MsgId: [%s]' + #13#10 + 'Payload: [%s]' + #13#10 + 'Length: [%d]',
[MsgId, ObjectPayload.AttrAsString['text_vc'], ObjectPayload.AttrAsInteger['text_len']]));
LogData('Stop: OraQueue.Dequeue(ObjectPayload)');
end;
procedure TForm1.LogData(s: string);
begin
Memo1.Lines.Add(DateTimeToStr(now)+': '+s);
end;
the result in the Memo1 after executing "btnEnqueueNative" and "btnDequeueNative":
Code: Select all
21.07.2011 10:03:41: OraSession1BeforeConnect
21.07.2011 10:03:42: OraSession1ConnectChange
21.07.2011 10:03:42: OraSession1AfterConnect
21.07.2011 10:03:44: SQL.Text:
[declare
msg SYS.AQ$_JMS_TEXT_MESSAGE;
msg_hdr SYS.AQ$_JMS_HEADER;
queue_options DBMS_AQ.ENQUEUE_OPTIONS_T;
msg_props DBMS_AQ.MESSAGE_PROPERTIES_T;
begin
msg_hdr := SYS.AQ$_JMS_HEADER(null,null,null,null,null,null,null);
msg := SYS.AQ$_JMS_TEXT_MESSAGE(msg_hdr,null,null,null);
msg.text_vc := :text;
msg.text_len := length(msg.text_vc);
DBMS_AQ.ENQUEUE( queue_name => 'FARMSMQ.AQ_FROM_AM'
, enqueue_options => queue_options
, message_properties => msg_props
, payload => msg
, msgid => :msg_id);
:txt := msg.text_vc;
:ln := msg.text_len;
end;
]
21.07.2011 10:03:44: Start: OraSQL.Execute
21.07.2011 10:03:44: ENQUEUE:
MsgId: [A890CB3F6C170B17E0402B0A2F03059D]
Payload: [
q4de3msys11:7384cfc6:125feac3cf8:-7fe8
1.3
DATASET
op_turn
2011-07-20T00:00:00.000
2011-07-27T23:59:59.000
2011-07-21T10:03:44.687
]
Length: [651]
21.07.2011 11:13:22: Stop: OraSQL.Execute
21.07.2011 11:13:22: Start: OraQueue.Dequeue(ObjectPayload)
21.07.2011 11:13:24: DEQUEUE:
MsgId: [A86BCC80E5E9AD9DE0402B0A2F034FB6]
Payload: []
Length: [14655]
21.07.2011 11:13:24: Stop: OraQueue.Dequeue(ObjectPayload)