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.