Nehmen wir so ein
Package:
SQL-Code:
create or replace
package EinPackage
is
type TTestCursor
is ref
cursor return Test%RowType;
subtype TId
is Test.Id%Type;
function TestProc(id
in TId)
return TTestCursor;
end;
create or replace
package body EinPackage
is
function TestProc(id
in TId)
return TTestCursor
is
Result TTestCursor;
begin
open Result
for
SELECT *
FROM Test t
WHERE t.Id = id;
return Result;
end;
end;
Du könntest es als normales AdoCommand absetzen:
begin :cursor := EinPackage.TestProc(:Id); end;
Oder als SProc mit "EinPackage.TestProc" als CommandText.
Ich habe keinerlei
IDE hier und meine Erfahrungen mit dem alten,
OLe-basierten
ADO halten sich in Grenzen, aber so hätte ich es versucht und hätte auch erwartet dass es geht.
Es ist aber gut möglich, dass
ADO keine Entsprechung für eine Cursor referenz hat.
Dann müsstest du ein wenig umbauen:
SQL-Code:
create or replace
package EinPackage
is
type TTestEntry
is Test%RowType;
type TTestEntryList
is table of TTestEntry;
subtype TId
is Test.Id%Type;
function TestProc(id
in TId)
return TTestEntryList;
end;
create or replace
package body EinPackage
is
function TestProc(id
in TId)
return TTestEntryList
is
Result TTestEntryList;
begin
SELECT *
BULK COLLECT
INTO Result
FROM Test t
WHERE t.Id = id;
return Result;
end;
end;
Ausführen könntest du es so:
SQL-Code:
SELECT *
FROM table(EinPackage.TestProc(1111))
Das alte
ADO und Oracle ist aber wirklich eine ziemlich zickige und nervige Kombi (Du weißt, dass Ora XYZ kann, aber du weißt auch, dass
ADO zu blöd dafür ist
)