Thema: Delphi Geschwindigkeitsproblem

Einzelnen Beitrag anzeigen

Robert_G
(Gast)

n/a Beiträge
 
#7

Re: Geschwindigkeitsproblem

  Alt 6. Aug 2005, 23:35
Zitat von jbg:
Das Aufrufen ist sicherlich nicht das Problem (TSQLStoredProc). Wie aber die TJbgItemList zurückkommt, dass wäre schon interessant. Und vor allem, wie man die IntegerList übergibt.
Da ich Ora & Delphi nur mit DOA kenne, habe ich mir von DOA mal einen wrapper für das Package anlegen lassen (schnell installiert...):
Delphi-Quellcode:
type
(*
package JbgTest is

  function FetchValues(aIds in TIntegerList) return TJbgItemList;

end JbgTest;
*)

  TJbgtest = class(TOracleCustomPackage)
  public
    function Fetchvalues(Aids: TOracleObject): TOracleObject;
  published
    property Name;
    property Session;
    property Cursor;
  end;

var
  DefaultPLSQLTableSize: Integer = 100; // Default size of a PL/SQL Table

implementation

// JBGTEST.FETCHVALUES
function TJbgtest.Fetchvalues(Aids: TOracleObject): TOracleObject;
begin
  Result := TOracleObject.Create(Session, '"TJBGITEMLIST"', '');
  ThreadAcquire;
  try
    GetQuery;
    OCPQuery.DeclareVariable('function_result', otObject);
    OCPQuery.SetComplexVariable('function_result', Result);
    OCPQuery.DeclareVariable('AIDS', otObject);
    OCPQuery.SetComplexVariable('AIDS', Aids);
    OCPQuery.SQL.Add('begin');
    OCPQuery.SQL.Add(' :function_result := "JBGTEST"."FETCHVALUES"(AIDS => :AIDS);');
    OCPQuery.SQL.Add('end;');
    OCPQuery.Execute;
  except
    ThreadRelease;
    Result.Free;
    raise;
  end;
  ThreadRelease;
end;
Wenn du/deine Firma öfter mit Delphi + Ora zu tun habt solltet ihr euch DOA wirklich genauer ansehen.
Man kann damit Probleme lösen, die ohne Objektbindung nicht möglich bzw zu langsam wären.

Und weil ich gerade Lust hatte noch eine kleine Konsolen App (Aber für try, finall hatte ich keine Lust ):
Delphi-Quellcode:
var
   OracleSession : TOracleSession;
   JbgItemList, IntegerList: TOracleObject;
   i, j : Integer;
begin
   OracleSession := TOracleSession.Create(nil);
        //hier wären connection strings...

   OracleSession.LogOn();

   IntegerList := TOracleObject.Create(OracleSession, 'TIntegerList', '');

   // 10´000 ZufallsIds
   FillWithRandoms(IntegerList, 10000);

   with TJbgTest.Create(nil) do
   try
      Session := OracleSession;
      JbgItemList := Fetchvalues(IntegerList);
   finally
      Free();
   end;

   for i := 0 to JbgItemList.ElementCount - 1 do
      with JbgItemList.ObjElements[i] do
      begin
         for j := 0 to AttrCount - 1 do
            Write(Attrs[j].Value, #9);
         WriteLn;
      end;

   ReadLn;
end.
Der springt auch bei 10000 so schnell über "JbgItemList := Fetchvalues(IntegerList);", dass man gar nicht mitkriegt was da passiert.

Zitat:
Gut das ich normalerweise nicht soviel mit Datenbanken am Hut habe und wenn, dann nur einfache Dinge.
Sehe ich mittlerweile auch nicht anders.
  Mit Zitat antworten Zitat