When TLobLocator.IsNull is true, TLobLocator.Free method raises Invalid Handle error.
Sample code is below
while True do
begin
Lob := FDbmsMetadata.FetchClob(Handle);
try
if Lob.IsNull then
Break;
//
finally
// Lob.Clear;
Lob.Free;
end;
end;
// DBMS_METADATA.FETCH_CLOB
function TDbmsMetadata.FetchClob(const AHandle: Variant): TLOBLocator;
begin
Result := TLOBLocator.CreateTemporary(Session, otCLOB, True);
try
GetQuery;
OCPQuery.DeclareVariable('function_result', otCLOB);
OCPQuery.SetComplexVariable('function_result', Result);
OCPQuery.DeclareVariable('HANDLE', otFloat);
OCPQuery.SetVariable('HANDLE', AHandle);
OCPQuery.SQL.Add('begin');
OCPQuery.SQL.Add(' :function_result := "DBMS_METADATA"."FETCH_CLOB"(');
OCPQuery.SQL.Add(' HANDLE => :HANDLE);');
OCPQuery.SQL.Add('end;');
OCPQuery.Execute;
except
Result.Free;
raise;
end;
end;
By invoking TLobLocator.Clear method before invoking TLobLocater.Free, I can avoid this error.
I always need to invoke Clear method before Free method??
DOA 4.0.7.1
Delphi 2005
Oracle 10.2.0.1.0