| Benutzung von Cursor Expression |
|
|
| Dienstag, 13. Oktober 2009 um 16:59 | ||||
|
Die PL/SQL-Welt ist gross, in den vorangegangenen Lektionen habt ihr einen grossen Teil dieser Welt kennengelernt und damit einen grossen Teil des täglichen Handwerkzeugs vermittelt bekommen. Langsam wird es speziell. Cursor Expressions sind bspw. ein Feature, das man nicht alltäglich benutzt. Eine Cursor-Expression ist ein Cursor, der Teil eines anderen Cursor ist. Er ist damit ein idealer Kandidat, um 1:n-Beziehungen speicherplatzsparend aufzulösen und z.B. an einen Aufrufer zurückzuliefern. Nehmen wir folgendes Beispiel: Ich benötige eine Prozedur, die mir für eine gegebene Mitarbeiternummer den dazugehörigen Namen zurückliefert (mittlerweile für alle hier ein leichtes Spiel). Aber sie soll mir auch die Kollegen des Mitarbeiters zurückliefern. Am liebsten in Form eines Cursors, schliesslich sollen die Schnittstellen schlank bleiben. Ich stelle mir den Aufruf ungefähr so vor: declare Nichts leichter als das. Wir kennen die dafür notwendige Technik ja bereits. Dann müsste nämlich die aufgerufene Prozedur implementiert werden wie folgt: create or replace procedure gib_name Gut, das funktioniert,Bulinski. So what? Wo ist jetzt der Benefit? Schauen wir uns mal folgende Idee an, die Prozedur zu implementieren: create or replace procedure gib_name Schauen wir uns den Wunsch an: Wir wollen einen Mitarbeiternamen erhalten und einen Cursor auf die Kollegen des Mitarbeiters. Der Alias "kollegen" wäre hier nicht unbedingt notwendig, soll aber zeigen, dass es sich einmal um ein Element handelt, nämlich den Mitarbeiternamen, im Falle der Kollegen aber um eine Menge. Der Cursor C1 liefert also sowohl einen skalaren Wert zurück wie auch eine Menge, bekannt gemacht durch die Funktion CURSOR. Also müssen wir beim Fetch auch entspr. Variablen bereitstellen. Einmal eine skalare Variable, um den Mitarbeiternamen aufzunehmen, einmal einen REF Cursor, um einen Pointer auf dessen Kollegen aufzunehmen. Na dann müsste ja der Aufrufer gar nicht verändert werden. Im letzten Beispiel liefern wir ja im Grunde das gleiche zurück: einen skalaren Wert und einen Pointer auf eine Menge von Werten. Wer jetzt meint, das ginge, der irrt... Es will partout nicht gelingen, eine cursor expression als OUT Argument an den Aufrufer zurückzugeben. (Wer eine Lösung hat, nur her damit!). Das ist meiner Ansicht nach kein Auskriterium für Cursor Expressions. Sie erlauben ja immer noch sehr viel saubereren Code. Ein Workaround ist z.B. create or replace type emp_name_Tab is table of varchar2(20); Wo liegen nun praktische Verwendungsmöglichkeiten von Cursor-Expressions? Naja, Abstraktion ist sicherlich ein erstes Argument. Denn ich kann zwar (nach meiner Kenntnis) keine Cursor Expression zurückliefern, aber sehr wohl einer Funktion übergeben. Beispiel: Vorstellbar ist natürlich eine Funktion quersumme, die wie folgt benutzt wird:
declare Wieviel schöner wäre allerdings eine Funktion, die wie folgt aufgerufen wird: begin Oder noch besser: select quersumme(cursor(select sal from emp where deptno=10)) from dual;
Sie müssen sich registrieren, um den Artikel ganz zu lesen
|
||||
| Aktualisiert ( Donnerstag, 14. Oktober 2010 um 17:39 ) | ||||

