![]() |
Auf PL/SQL Variablen zugreifen (Oracle)
Hallo Leute,
ich habe in Oracle 10g folgende einfache PL/SQL-Prozedur (anonymer Block):
Code:
Wie kann ich nun auf dem Client die Werte aus v_Vorname und v_Nachname verarbeiten?
set serveroutput on;
--diese einfache pl/sql-procedure zeigt alle Dozenten an declare v_Vorname scott.dozent.d_Vorname%Type; --Datentyp aus der Datenbank übernehmen v_Nachname varchar2(20); --Datentyp selbst deklariert Cursor c_Dozenten is select d_Vorname, D_Nachname from scott.dozent; begin open c_Dozenten; loop fetch c_Dozenten into v_Vorname, v_Nachname; exit when c_dozenten%NOTFound; dbms_Output.put_line('Vorname: '||v_Vorname||' - Nachname: '||v_Nachname); end loop; end; Ich verwende Delphi 6 Professional und die Ado-Komponenten. Ich bin auf Ado beschränkt. Vielleicht könnt Ihr mir auch einen guten Link empfehlen in dem beschrieben ist wie ich PL/SQL in Delphi(ADO) handhabe. Gruß |
Re: Auf PL/SQL Variablen zugreifen (Oracle)
Wenn Du schon ADO verwenden willst: Hast Du wenigstens einen ADO-Treiber von Orlace besorgt (Der von M$ defaultmäßig installierte ist Schrott, wenn man etwas mehr machen will as ein Testprogramm). Ich würde dir aber empfehlen native-Komponenten wie von
![]() Wenn Du bei ADO bleibst und deine Stored Procedure richtig definiert hast, so sollte die ADOExpress-Komponente TADOStoredProc das gewünschte liefern. Auf Form ziehen, mit ADOConnection verbinden, Stored-Procedure auswählen und Ergebnis abholen. |
Re: Auf PL/SQL Variablen zugreifen (Oracle)
Hallo Bernhard,
ich habe derzeit noch den MS OLEDB für Oracle. Der andere OLEDB Provider für Oracle den ich auch in meiner Liste habe lies sich zwar beim konfigurieren der ADOConnection erfolgreich testen aber bei "Adoconnection.open" erscheint immer eine Fehlermeldung (ich kann diese Meldung mal heute abend posten, sie war aber nicht wirklich aussagekräftig). Ich denke mal, dass dies der Treiber von Oracle ist, da ich auch eine Oracle 10g DB und diverse Oracle-Tools auf meinem Rechner habe. Dieser Treiber wird glaube ich mitinstalliert Was mir aber wirklich wichtig ist: Kannst du mir bitte mal ein Beispiel nennen wie ich so eine ADO-StoredProcedure richtig definiere? Gruß |
Re: Auf PL/SQL Variablen zugreifen (Oracle)
Zitat:
Zitat:
|
Re: Auf PL/SQL Variablen zugreifen (Oracle)
Zitat:
Mit ADO kannst du keine komplexen Typen an deine Anwendung binden. Das geht nur über OCI. Nette Kapselungen dafpr sind DOA oder ORADAC (einfach mal hier danach suchen ;) ) Damit würdest du einen Typen erzeugen:
SQL-Code:
Und eine passende Collection:
create or replace type TDozent as object
( Vorname Scott.Dozent.d_Vorname%Type, Nachname varchar2(20) )
SQL-Code:
Copy & Paste von deinem Block mit ein paar Änderungen:
create or replace type TDozenten as table of TDozent
SQL-Code:
Aber nur per OCI könntest du die Collection an deinen Client binden. ;)
create or replace function getDozenten return TDozenten is
Dozenten TDozenten; Cursor cur$Dozenten is SELECT TDozent(d_Vorname ,D_Nachname) FROM Scott.Dozent; begin open cur$Dozenten; fetch cur$Dozenten bulk collect into Dozenten; close cur$Dozenten; if Dozenten.Count > 0 then for i in Dozenten.First .. Dozenten.Last loop dbms_Output.put_line('Vorname: '||Dozenten(i).Vorname|| ' - Nachname: '||Dozenten(i).Nachname); end loop; return Dozenten; else return null; end if; end;
Delphi-Quellcode:
BTW: Der ADO Provider von MS ist scheußlich und sollte aufgrund von Menschenrechtsverletzungen verboten werden. ;)
var
Dozenten :TOracleObject; begin Dozenten := TOracleObject.Create('SCOTT.TDOZENTEN', '', ''); with SomeQuery do begin SQL.Text := 'begin'+#10+ ' :oDozenten := getDozenten();'+#10+ 'end;'; Execute(); GetComplexVariable('oDozenten', otObject, Dozenten); end; end; Der von Oracle kann fast genauso verwendet werden. Alles ist nur aus den Fingern gesaugt mangels Delphi & Oracle. Also nagelt mich nicht darauf fest. :mrgreen: |
Re: Auf PL/SQL Variablen zugreifen (Oracle)
Danke für Eure Antworten, ich schaue mir das heute abend mal an.
P.S. da lobe ich mir doch JDBC :-) |
Re: Auf PL/SQL Variablen zugreifen (Oracle)
Für alle die es interessiert, hier mal "die Lösung":
Ich habe eine einfache PL/SQL-Funtion, welche mir die Datensatzanzahl einer Tabelle ermittelt. Dieser Funktion übergebe ich den Tabellennamen und erhalte als Rückgabewert die Datensatzanzahl. Diese funktion ist bereits in der Oracle-DB gespeichert:
Code:
Nun habe ich die Komponente "stored1: TADOStoredProc" welche ich mit der Adoconnection im OI verbinde.
create or replace function scott.Anzahl_Datensatze(v_ergebnis out number, v_Tabelle scott.dozent.d_Vorname%Type) return number
is v_return number; v_SQL varchar(300); begin v_SQL:='select count(*) from '|| v_Tabelle; execute immediate v_SQL into v_return; return v_return; end; Ich gebe im OI den Namen der Funktion an (Anzahl_Datensatze), wobei ich mir das "scott" sparen kann da ich sowieso als Scott angemeldet bin. Wenn ich nun im OI "Parameters" anklicke, dann erscheint ein Fenster in dem alle Parameter dieser Funktion drinstehen (wird von Delphi eingelesen und angezeigt.) Nun führe ich folgenden kurzen kommentierten Quelltext aus:
Code:
Es erscheint ein Fenster mit der korrekten Datensatzanzahl.
//dem Parameter v_Tabelle einen Tabellennamen übergeben
stored1.Parameters.ParamByName('v_Tabelle').Value:='DOZENT'; //PL/SQL-Funktion ausführen stored1.ExecProc(); //Das Ergebnis der Funktion anzeigen (Anzahl der Datensätze) showmessage(stored1.Parameters.ParamByName('RETURN_VALUE').Value); Ich muss mal wieder eingestehen, dass Delphi seinen Ruf als RAD-Tool zurecht hat. Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz