Autor Beitrag
TheEquinox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Do 07.07.11 14:01 
Hallo zusammen,

ich verwende Delphi 7 und die DOA Komponenten um mit einer Oracle Datenbank zu kommunizieren. Ich würde jetzt gerne eine Stored Procedure aufrufen, die mir einen Ref Cursor zurückgibt und die darin enthaltenen Daten in einem Datagrid anzeigen.

Ich habe dazu ein TOracleDataset angelegt, diesem die TOracleSession als Session zugeordnet. Unter SQL habe ich den Aufruf an die Stored Procedure eingetragen :

begin
COMMUNICATION.getDataComplete(:ref_cursor);
end;

Dann bin ich auf die Variables Eigenschaft des Datasets gegangen und habe Scan SQL ausgeführt, woraufhin mit der REF_Cursor in der Liste angezeigt wird. Diesem habe ich noch den Typ Cursor verpasst.

Als nächstes habe ich eine DataSource angelegt und diese mit dem Datasource verknüpft und dann zuletzt noch das Datagrid mit der DataSource verknüpft.

Wenn ich das Programm ausführe ist das Datagrid nach wie vor leer. Jetzt dachte ich, ok - wahrscheinlich muss ich noch die Felder auswählen. Also im Objekt-Browser auf OracleDataset1 -> Fields -> Alle Felder hinzufügen geklickt, doch dann kommt nur eine Fehlermeldung "Not logged on"

Wie kann ich mich denn einloggen ? Wenn ich auf die OracleSession im Objektbrowser klicke, kommt ein Login-Fenster. Wenn ich dort den Benutzernamen und Passwort eingebe, scheint es so als würde es funktionieren, zumindest kommt keine Fehlermeldung. Andere Kommunikation mit der DB funktioniert auch, also liegt es sehr sicher nicht an einem Konfigurationsfehler. Selbst nach diesem "Login" sagt mir die IDE beim Versuch, Felder zum Dataset hinzuzufügen aber weiterhin "Not logged on".

Kann mir jemand helfen und mir sagen, wo der Fehler liegt ?

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Vielleicht kann mir jemand grundsätzlich sagen, wie ich eine Refcursor variable, die eine Oracle Stored Procedure zurück gibt in ein Dataset in Delphi 7 bekomme ?

Ich denke dann wäre das Problem auch gelöst...
jaevencooler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 166
Erhaltene Danke: 6

MS-DOS,Win32, Win95, Win 98, Me,XP, Linux, NT4.0, NT 2000-2008, Vista, Windows 7
Turbo Pascal,D1 Enter,D2 Enter,D3 Enter,D5 Enter, Kylix, D2007, PL/SQL, MS/SQL, Delphi 2010, Delphi XE
BeitragVerfasst: Fr 08.07.11 09:43 
Moin, Moin,

also wenn Du die DOA Komponenten korrekt instaliert hast, findest Du in der IDE einen Menüeintrag der da Oracle heißt.
Dort kannst Du über dem Package Wizard Dein Package einlesen, und auf alle Variablen referenzieren die Du benötigst.

Ansonsten RTFM, die Doku von Allraound ist ziemlich gut.....



Beste Grüße
Michael

_________________
Wissen ist Macht, nichts wissen macht auch nichts...
TheEquinox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Mo 11.07.11 10:48 
Hallo Michael,

danke für die Antwort. Mittlerweile hatte ich es hingekriegt, die Package Procedures aufzurufen und auch den ref cursor zurück zu bekommen. Wenn ich allerdings versucht habe, die Ergebnisse in einem Grid anzuzeigen, blieb das Grid immer leer. Da ich nicht weiß, woran es liegt, hab ich es jetzt mal mit dem Package Wizard versucht.

Dort bekomme ich jetzt ein Query Objekt zurück, in dem so wie ich es verstehe, die Ergebnisse drin stehen. In meinem bisherigen Code erstelle ich bisher eine TOracleDataset Instanz, weise dieser mit mDS.ExternalCursor := mQuery die Query, die den Cursor beinhaltet zu und erstelle dann ein DataSource Objekt, welchem ich das Dataset reingebe. Diese Datasource verknüpfe ich dann über mGrid.Datasource := mDataSource mit dem Grid.

Irgendwo scheint es da aber zu haken, denn das Grid bleibt auch bei dem Aufruf der vom Wizard erstellten Funktionen leer.
Mache ich da noch irgendwas falsch ?

An den StoredProcedures kann es m.M.n. nicht liegen, da ich mittlerweile ca. 20 verschiedene ausprobiert habe, und die Datenbank auch von einer anderen Delphi Applikation, von der ich leider keinen Sourcecode habe, ohne Probleme verwendet wird.

Bin weiterhin für Hilfe dankbar...

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Ich habe gerade herausgefunden, dass es bei der Zuweisung des Cursors (TOracleQuery) zum Dataset schief geht. Wenn ich CursorQuery.Execute; aufrufe, ist die Query mit Daten gefüllt (FieldCount, RowCount sind ungleich 0). Wenn ich dann aber dem Dataset die CursorQuery mit mDataset.ExternalCursor := CursorQuery; zuordne und anschließend in das Dataset rein schaue, hat das Dataset einen FieldCount von 0.

Muss hier sonst noch irgendwas ausgeführt werden ?? So wie ich die DOA-Hilfe verstehe sollte es ausreichen, die CursorQuery als ExternalCursor ans Dataset zu hängen, dem scheint aber nicht so zu sein...

Hilfe :-(

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Hat sich erledigt, ich hab es hingekriegt. Man muss zusätzlich dem Dataset auch noch die Session zuordnen. Darauf bin ich nicht gekommen, da ich die Session ja eigentlich schon in der CursorQuery mit drin habe.