PL/SQL Anweisung an Oracle Server senden



  • Hallo zusammen,

    ich möchte gerne von Borland aus ein PL/SQL Kommando an einen Oracle-Server senden und die zurückgelieferten Daten dann in C++ bearbeiten.

    Für eine reine SQL-Anweisung ist das kein Problem, Verbindungsaufbau und SQL-Befehl senden funktioniert mit den Komponenten der ADOConnection bzw. auch der SQLConnection (mit jeweiligen Command bzw. DataSet dazu).
    Wenn ich aber z.B. dem SQLDataSet1->CommandText einen PL/SQL-Befehl übergebe, kommt ein Fehler zurück.
    Auch beim Ändern des CommandTyps tritt der Fehler immer wieder auf.

    Ich habe die Vermutung das im Hintergrund nicht eine SQLplus Session sondern eine reine SQL Session geöffnet wird, die natürlich kein PL/SQL kennt...!?

    Habe hier die gesamte FAQ durchwühlt, leider nichts genaues gefunden. Kann mir jemand weiter helfen?

    Vielen Dank für Eure Hilfe!

    Mirko



  • Hallo,

    mein Problem hat sich soweit erledigt, man kann mit ADOConnection und ADOCommand sowohl SQL als auch PL/SQL Befehle zum Oracle-Server senden.

    Nur ist mir noch unklar, wie ich jetzt an die Daten aus ADOCommand, die zurückgeliefert wurden, abrufen kann?

    Kann mir hier vielleicht jemand weiter helfen?

    Danke!

    Mirko



  • dafür benötigst du ein ADODataSet, welches wie folgt verwendet wird:

    ADOCommand->CommandText = <dein_sql_befehl>;
    ADODataSet->Recordset = ADOCommand->Execute();
    

    dann kannst du mit den entsprechenden Methoden auf die einzelnen Daten/Datesätze zugreifen (z.B. First(), Next(), FieldByName ...)



  • Hi,

    ja danke, genau das habe ich auch aus der Hilfe raus bekommen und ausprobiert. Nur bekomme ich dann immer den Fehler: "Recordset noch nicht geöffnet!"

    Und an der Stelle bin ich dann nicht weiter gekommen...

    Danke für Deine Hilfe!



  • deine Anfrage liefert auch wirklich Ergebnisse zurück? Denn nur dann funktioniert die Übergabe an das DataSet, d.h. nur SELECT-Anfragen können damit verarbeitet werden.
    Wie sieht denn der CommandText aus?



  • Das ist wahrscheinlich genau das Problem, ich gebe kein reines SQL sondern PL/SQL im CommandText an (einfaches Beispiel):

    DECLARE
      i number(5);
    
    BEGIN
    
      SELECT employee_id INTO i 
      FROM employees 
      WHERE emp_name = 'KING';
      dbms_output.putline(i);     -- hier ist jetzt die Ausgabe die 
                                  -- wahrscheinlich nicht im ADODataSet 
                                  -- verarbeitet werden kann !??
    END;
    

    Das i kann jetzt natürlich auch eine große Datenstruktur o.ä. sein.
    Auf jedenfall wird mit ADOCommand->Execute() der Befehl zur Datenbank geschickt und ohne Fehler verarbeitet. Nur die Rückgabe ist mir ein Rätsel, zumindest mit einem PL/SQL Script. Mit reinem SQL funzt es ja...

    Mirko



  • das "dbms_output.putline(i);" gibt ja die Daten nur Zeilenweise aus, d.h. eigentlich solltest du das gleiche Ergebnis bekommen wenn du einfach nur das select verwendest:

    ADOCommand->CommandText = "SELECT employee_id FROM employees WHERE emp_name = 'KING';"
    ADODataSet->Recordset = ADOCommand->Execute();
    

    allerdings müstest du die Fehlerbehandlung hier selbst übernehmen, also z.B. wenn die Abfrage keine Werte liefert, eine entsprechende Meldung ausgeben

    da ich selbst nicht mit Oracle arbeite weis ich allerdings nicht wie komplex solche Abfragen werden können, aber eventuell bietet sich ja die Möglichkeit das ganze über Oracle-Proceduren zu machen



  • Ja, das ganze ist natürlich um einiges komplexer, der Code sollte nur ein Beispiel sein, das geht natürlich auch mit normalen SQL...

    Ich werde es mal über Prozeduren oder Functions probieren, vielleicht klappt das mit der Rückgabe dann ehr.

    Trotzdem vielen Dank!
    Mirko


Anmelden zum Antworten