# Oracle Stored Procedures



## NBOne (3. Mai 2007)

Hi,

ich bin gerade verzweifelt auf der Suche nach einem Tutorial über Stored Procedures in Oracle. Das soll einfach nur beschreiben wie ich eine Stored Procedure erstelle, wie ich mit Variablen umgehe, und wie ich Datensätze zurückgeben kann. Kann mir da villeicht jemand einen guten Link geben. Ich finde leider nichts gescheites.

Danke


----------



## lmarkus31 (3. Mai 2007)

Hallo,

kurz nach "PL/SQL Tutorial" gegoogelt, findest du viele Tutorials zu PL/SQL, der Sprache mit der Stored Procedures in Oracle neben Java implementiert werden können.

Hier der erste Treffer bei mir:

http://www.datenbank-plsql.de/funktionen.htm

Wobei ich auch die Oracle Documentation Library empfehlen kann, allerdings englischsprachig. Das sind Informationen aus 1.Hand.

http://download-uk.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_packages.htm#sthref761

Hoffe es hilft Dir als Einstieg,

Markus


----------



## NBOne (3. Mai 2007)

Hi, 

danke, hab mittlerweile auch gute Sachen gefunden, hab aber immer noch ein Problem. Ich bekomme es nicht hin meine Stored Procedure so zu schreiben dass sie einen Rückgabewert erhält den ich weiterverarbeiten kann.

Also ich möchte z.B. das meine Stored Procedure ein Update Query ausführt, und dann einfach eine Meldung "OK" zurückgibt. Das soll einfach ein Feld sein in dem OK steht. Wenn ich also aus Access per PassThrough Abfrage CALL funktion() mache, dann soll Access OK zurückbekommen.

Hat jemand ne Idee wie das funktionieren könnte?

Danke für eure Hilfe,

NBOne


----------



## lmarkus31 (3. Mai 2007)

Was du suchst ist wohl eine Stored Function etwas so:


```
CREATE OR REPLACE FUNCTION myFunc RETURN VARCHAR2
IS
BEGIN

UPDATE xyz 
   SET a=3;

 RETURN 'OK';
END;
```

Diese Funktion macht jetzt natürlich nicht wirklich Sinn, aber du solltest sie aufrufen können. Wenn du möchtest dass sie z.B. "Error" zurück gibt, sofern keine Datensätze upgedated wurden oder "Ok" falls mindestens ein Datensatz geändert wurde, müsstest du sie noch anpassen und mit Parametern versehen. 
Ob das ganze mit Access und PassThrough funktioniert müsstest du ausprobieren.

Hoffe ich konnte ein wenig weiterhelfen,

Markus


----------



## NBOne (4. Mai 2007)

Hi,

danke erstmal. Funktionen können leider keine Update Statements ausführen, deswegen muss es schon eine procedure sein. Kann mir jemand sagen wie ich genau die Funktion aus der Funktion im letzten Beitrag mit einer Procedure bewerkstelligen kann, welche ich dann mit einem normalen SQL Aufruf, beispielsweise einem Select Statement, aufrufen, und den Rückgabewert empfangen kann?


----------



## lmarkus31 (4. Mai 2007)

Hallo,

natürlich dürfen Funktionen in Oracle UPDATE-Statements ausführen (auch wenn es keine gute Sache ist). Das gleiche Problem hättest du ja, wenn deine Funktion eine Stored Procedure aufruft, die Daten verändert. Es kommt auf den Kontext an, in dem deine Funktion verwendet werden soll. Denn dieser anonyme PL/SQL-Block hier würde funktionieren:


```
declare
  funcResult varchar2(20);
begin
  funcResult := myfunc;
  dbms_output.put_line( funcResult );
end;
```

Du hast in dem Moment natürlich eine offene Transaktion.

Ein Problem wäre eher gegeben, wenn du die Funktion innerhalb von SQL verwernden möchtest.  Denn das geht so nicht, da geb ich Dir Recht:


```
select myfunc from dual;
```

Dann musst du entweder mit RESTRICT_REFERENCES oder mit autononem Transaktionen arbeiten, um dein Update dennoch durchführen zu können. Ob das erwünscht ist - keine Ahnung, aber du sagtest ja, du brauchst ja gerade eine Funktion, die das Update durchführt.

Wenn du das ganze nun aber als Stored Procedure lösen möchtest/musst
schreibst du den Code eben um und definierst einen OUT-Parameter.
Ob das von Access aus so funktioniert - keine Ahnung.


```
CREATE OR REPLACE PROCEDURE myProc (  errCode OUT VARCHAR2 ) IS
BEGIN
  UPDATE xyz
     SET a=3;

  errCode := 'OK';
END;
```

In SQL kannst du diese Prozedur nun nicht verwenden.
Du kannst sie natürlich aus anderem Kontext z.B. PL/SQL heraus aufrufen:


```
declare
  procErrcode VARCHAR2(20);
begin
  myProc ( procErrcode );
  dbms_output.put_line( procErrcode );
end;
```

Ob dir das ganze nun mit deinem Access-Problem hilft, müsstest du schauen. Die Lösung mit der autonomen Transaktion innerhalb einer Funktion kann ich Dir wie schon erwähnt noch vorschlagen, falls es unbedingt eine Stored Function sein muss.

Gruss,
Markus


----------



## NBOne (4. Mai 2007)

Hi Markus,

danke, mit den autonomen Transaktinen hat es funktioniert. Leider hab ich danach festgestellt das ich in Access einfach nur umstellen muss das die Pass Through Abfrage keine Datensätze zurückbekommen soll, dann stürtzt Access auch nicht mehr ab wenn ich das Update Statement einfach so per Pass Through losschicke  , naja, dafür weiß ich jetzt mehr über Stored Procedures ..

Danke und tschüss!


----------

