Code: Select all
procedure TTestOraParamXML.TestXML;
var
lXMLStr: String;
I: Integer;
lSession: TOraSession;
lProc: TOraStoredProc;
lXMLLob: TOraLob;
begin
lXMLStr := '123';
lSession := TOraSession.Create(nil);
try
lSession.LoginPrompt := False;
lSession.Options.Net := False;
lSession.Username := 'user';
lSession.Password := 'password';
lSession.Server := 'server';//some_server;//enter server address here;
lSession.Connect;
CheckTrue(lSession.Connected, 'connected');
lSession.ExecSQL(
'CREATE OR REPLACE FUNCTION RETURN_XML(ARG XMLTYPE) RETURN XMLTYPE IS ' + sLineBreak +
'BEGIN RETURN ARG; END; '
, []);
lProc := TOraStoredProc.Create(nil);
try
lProc.StoredProcName := 'RETURN_XML';
lProc.PrepareSQL;
// --- here lProc.ParamByName('ARG').AsXml is nil!!!
// --- lProc.ParamByName('ARG').DataType is dtADT, not dtXml!
with lProc.ParamByName('ARG').AsXml do begin
lXMLLob := TOraLob.Create(lSession.OCISvcCtx);
try
lXMLLob.CreateTemporary(ltClob);
lXMLLob.Write(0, Length(lXMLStr), PChar(lXMLStr));
lXMLLob.WriteLob;
AllocObject(lSession.OCISvcCtx, lXMLLob);
// --- here raises ACCESS VIOLATION Read of Address 000000. TOraXML Line:2836 'OraObjects'
finally
FreeAndNil(lXMLLob);
end;
end;
lProc.Execute;
finally
FreeAndNil(lProc);
end;
finally
FreeAndNil(lSession);
end;
end;