Der beste Weg, PL / SQL Package Cursoren von Pro * C zu verwenden,
-
26-09-2019 - |
Frage
Ich habe einen Cursor definiert in PL / SQL, und ich frage mich, was der beste Weg, um es von Pro zu verwenden C. Normalerweise für einen Cursor definiert in Pro C würden Sie tun:
EXEC SQL DECLARE curs CURSOR FOR SELECT 1 FROM DUAL;
EXEC SQL OPEN curs;
EXEC SQL FETCH curs INTO :foo;
EXEC SQL CLOSE cusr;
Ich hatte gehofft, dass die gleiche (oder ähnliche) Syntax für ein verpacktes Cursor funktionieren würde. Zum Beispiel habe ich ein Paket MyPack, mit einer Erklärung
type MyType is record (X integer);
cursor MyCurs(x in integer) return MyType;
Jetzt habe ich in meinem Pro * C-Code ein eher unbefriedigendes Stück eingebetteter PL / SQL, die den Cursor öffnet, funktioniert der Abruf usw., da ich nicht die erste Art von Syntax Arbeit bekommen konnte. Am Beispiel
EXEC SQL EXECUTE
DECLARE
XTable is table of MyPack.MyType;
BEGIN
OPEN MyPack.MyCurs(:param);
FETCH MyPack.MyCurs INTO XTable;
CLOSE MyPack.MyCurs;
END;
END-EXEC;
Wer weiß, ob es eine weitere "Pure" Pro * C Ansatz?
Lösung
Es wäre eigentlich nicht viel anders als Ihr erstes Beispiel, so stellen Sie sicher, dass Sie den Cursor Definition ist im Paket spec und nicht der Gehäusekörper. Nicht „declare“ es und gehen Sie einfach mit so etwas wie:
Datenbankobjekt:
create or replace package mypkg as
cursor mycur is
SELECT 1 FROM DUAL;
end;
Pro * C:
EXEC SQL OPEN schema.mypkg.mycur;
EXEC SQL FETCH schema.mypkg.mycur INTO :foo;
EXEC SQL CLOSE schema.mypkg.mycur;
Natürlich müsste das Paket an den Oracle-Benutzer zugänglich sein, die Sie anschließen, usw. Wenn das Paket im Besitz des Benutzers verbindet, oder es ist ein Synonym vorhanden, das „Schema“. ist nicht in der Pro * c Anrufe.
erforderlichAndere Tipps
Ja. Führen Sie eine Google-Suche auf den Begriff REF CURSOR und Sie sollten sehen, Beispiele dafür, was Sie tun möchten.