PL/SQL - Cursors: Dein Tor zur Datenmanipulation
Hallo da draußen, zukünftige Datenbank-Zauberer! Heute machen wir uns auf eine aufregende Reise in die Welt der PL/SQL-Cursors. Mach dir keine Sorgen, wenn du neu im Programmieren bist – ich werde dein freundlicher Führer sein, und wir werden dieses Thema Schritt für Schritt erkunden. Am Ende dieses Tutorials wirst du Cursors wie ein Profi einsetzen können!
Was sind Cursors?
Bevor wir eintauchen, lassen wir uns erst einmal anschauen, was Cursors sind. Stell dir vor, du bist bei einem Buffet (ich weiß, ich mache dich schon hungrig!). Du hast einen Teller (dein Programm) und schaust dir alle leckeren Gerichte (deine Datenbanktabellen) an. Ein Cursor ist wie deine Hand – er hilft dir, spezifische Gegenstände vom Buffet auf deinen Teller zu nehmen. In Datenbankterminologie ermöglicht ein Cursor das Abrufen und Manipulieren von Daten aus deiner Datenbank, eine Zeile nach der anderen.
Nun, lassen's uns die beiden Arten von Cursors in PL/SQL erkunden:
Implizite Cursors
Implizite Cursors funktionieren wie die automatischen Funktionen auf deiner Smartphone-Kamera – sie arbeiten im Hintergrund, ohne dass du viel tun musst. Oracle erstellt und verwaltet diese Cursors für dich, wenn du SQL-Anweisungen ausführst.
Schauen wir uns ein Beispiel an:
BEGIN
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 20;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE('Employees received a 10% raise!');
ELSE
DBMS_OUTPUT.PUT_LINE('No employees in department 20 found.');
END IF;
END;
/
In diesem Code:
- Wir aktualisieren das Gehalt der Mitarbeiter im Department 20.
-
SQL%FOUND
ist ein Attribut des impliziten Cursors, das TRUE zurückgibt, wenn das UPDATE einige Zeilen beeinflusst hat. - Wir verwenden dies, um eine appropriate Nachricht auszugeben.
Andere nützliche implizite Cursor-Attribute umfassen:
-
SQL%ROWCOUNT
: Anzahl der betroffenen Zeilen -
SQL%ISOPEN
: Gibt immer FALSE für implizite Cursors zurück -
SQL%NOTFOUND
: Das Gegenteil von SQL%FOUND
Explizite Cursors
Explizite Cursors sind wie der manuelle Modus auf deiner Kamera – du hast mehr Kontrolle, aber du musst sie selbst verwalten. Sie sind perfekt, wenn du Zeilen einzeln verarbeiten musst oder wenn du mehr Kontrolle über den Datenabruf haben möchtest.
Lassen's uns den Lebenszyklus eines expliziten Cursors durchgehen:
Deklaration des Cursors
Zuerst müssen wir unserem PL/SQL-Block mitteilen, mit welchen Daten wir arbeiten möchten. Das ist wie das Entscheiden, was du beim Buffet essen möchtest, bevor du anfängst, deinen Teller zu füllen.
DECLARE
CURSOR c_emp IS
SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 30;
Hier haben wir einen Cursor namens c_emp
deklariert, der Mitarbeiterdetails aus Department 30 abrufen wird.
Öffnen des Cursors
Nun, da wir entschieden haben, was wir möchten, ist es an der Zeit, uns dem Buffet (oder in unserem Fall, der Datenbank) zu nähern.
OPEN c_emp;
Diese Zeile weist Oracle an, den SELECT-Befehl auszuführen und den Ergebnissatz vorzubereiten.
Abrufen des Cursors
Dies ist der Moment, in dem wir tatsächlich anfangen, Essen auf unseren Teller zu legen – oder in Programmiersprache, Datenzeile für Zeile abzurufen.
DECLARE
v_emp_id employees.employee_id%TYPE;
v_first_name employees.first_name%TYPE;
v_last_name employees.last_name%TYPE;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO v_emp_id, v_first_name, v_last_name;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_emp_id || ' - ' || v_first_name || ' ' || v_last_name);
END LOOP;
CLOSE c_emp;
END;
/
In diesem Beispiel:
- Wir deklarieren Variablen, um unsere abgerufenen Daten zu speichern.
- Wir öffnen den Cursor.
- Wir verwenden eine SCHLEIFE, um Zeilen einzeln abzurufen.
- Wir beenden die Schleife, wenn keine weiteren Zeilen vorhanden sind (c_emp%NOTFOUND).
- Wir geben die Details jedes Mitarbeiters aus.
Schließen des Cursors
Genau wie du deinen Teller nach dem Essen zurückgeben würdest, müssen wir unseren Cursor schließen, wenn wir fertig sind.
CLOSE c_emp;
Dies gibt die mit dem Cursor verbundenen Ressourcen frei.
Cursor FOR-Schleifen: EinShortcut
Nun habe ich ein kleines Geheimnis für dich. Es gibt eine Möglichkeit, die Arbeit mit Cursors noch einfacher zu machen – es heißt Cursor FOR-Schleife. Es ist, als hättest du einen helfenden Freund beim Buffet, der deinen Teller für dich füllt!
BEGIN
FOR emp_rec IN (SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 30) LOOP
DBMS_OUTPUT.PUT_LINE(emp_rec.employee_id || ' - ' ||
emp_rec.first_name || ' ' ||
emp_rec.last_name);
END LOOP;
END;
/
Diese magische Schleife erledigt alle Arbeit für dich:
- Sie deklariert eine Record-Variablen (
emp_rec
), um jede Zeile zu speichern. - Sie öffnet den Cursor, ruft jede Zeile ab und schließt den Cursor automatisch.
- Du musst nur darauf achten, was du mit jeder Zeile im Inneren der Schleife machst.
Cursor-Methoden: Dein praktisches Werkzeug
Lassen's uns die Methoden, die wir mit Cursors verwenden können, in einer übersichtlichen Tabelle zusammenfassen:
Methode | Beschreibung |
---|---|
DECLARE | Definiert den Cursor und sein SELECT-Anweisung |
OPEN | Führt die SELECT-Anweisung aus und bereitet den Ergebnissatz vor |
FETCH | Ruft die nächste Zeile aus dem Ergebnissatz ab |
CLOSE | Schließt den Cursor und gibt Ressourcen frei |
Denke daran, mit großer Macht kommt große Verantwortung. Schließe immer deine Cursors, wenn du fertig bist, um Ressourcen freizugeben!
Und da hast du es, meine lieben Schüler! Du hast gerade deine ersten Schritte in die Welt der PL/SQL-Cursors gemacht. Übe diese Konzepte, experimentiere mit verschiedenen Szenarien und bald wirst du deine Datenbanken mit der Grazie und Präzision eines erfahrenen Programmiers navigieren können.
Erinnere dich daran, im Programmieren, wie im Leben, ist der Schlüssel das ständige Lernen und Experimentieren. Also los, schreibe Code, mach Fehler und vor allem, habe Spaß! Wer weiß? Die nächste großartige Datenbankanwendung könnte gerade an deinen Fingertippen liegen. Viel Spaß beim Coden!
Credits: Image by storyset