Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Auf PL/SQL Variablen zugreifen (Oracle) (https://www.delphipraxis.net/37279-auf-pl-sql-variablen-zugreifen-oracle.html)

ak1 3. Jan 2005 20:22


Auf PL/SQL Variablen zugreifen (Oracle)
 
Hallo Leute,

ich habe in Oracle 10g folgende einfache PL/SQL-Prozedur (anonymer Block):

Code:
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;
Wie kann ich nun auf dem Client die Werte aus v_Vorname und v_Nachname verarbeiten?
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ß

Bernhard Geyer 4. Jan 2005 07:12

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 Core Lab zu verwenden. Sind direkt auf Oracle zugeschnitten und erfordern keine zusätzliche Installation eine Oracle-ADO-Treibers.

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.

ak1 4. Jan 2005 09:10

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ß

Bernhard Geyer 4. Jan 2005 11:10

Re: Auf PL/SQL Variablen zugreifen (Oracle)
 
Zitat:

Zitat von ak1
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

Um diesen Problemen aus dem Weg zu gehen nehme ich immer native Treiber (auch wenn sie ein paar € kosten).

Zitat:

Zitat von ak1
Kannst du mir bitte mal ein Beispiel nennen wie ich so eine ADO-StoredProcedure richtig definiere?

Leider nein. Selbst verwende ich keine SP's bzw. hatte das letzte mal vor ein paar Jahren mit MS SQL mit SP's zu tun. Falls hier kein weiterer User ein Beispiel hat, so würde ich mal googeln.

Robert_G 4. Jan 2005 11:37

Re: Auf PL/SQL Variablen zugreifen (Oracle)
 
Zitat:

Zitat von ak1
Wie kann ich nun auf dem Client die Werte aus v_Vorname und v_Nachname verarbeiten?
Ich verwende Delphi 6 Professional und die Ado-Komponenten. Ich bin auf Ado beschränkt.

Das beißt sich gegenseitig.
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:
create or replace type TDozent as object
(
  Vorname Scott.Dozent.d_Vorname%Type,
  Nachname varchar2(20)
)
Und eine passende Collection:
SQL-Code:
create or replace type TDozenten as table of TDozent
Copy & Paste von deinem Block mit ein paar Änderungen:
SQL-Code:
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;
Aber nur per OCI könntest du die Collection an deinen Client binden. ;)
Delphi-Quellcode:
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;
BTW: Der ADO Provider von MS ist scheußlich und sollte aufgrund von Menschenrechtsverletzungen verboten werden. ;)
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:

ak1 4. Jan 2005 11:54

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 :-)

ak1 4. Jan 2005 21:44

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:
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;
Nun habe ich die Komponente "stored1: TADOStoredProc" welche ich mit der Adoconnection im OI verbinde.
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:
  //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);
Es erscheint ein Fenster mit der korrekten Datensatzanzahl.
Ich muss mal wieder eingestehen, dass Delphi seinen Ruf als RAD-Tool zurecht hat.

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz