Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Beispiele für PLSQL-Cursor - Explizite, implizite und Ref-Cursor

Ein Cursor fungiert logisch als Zeiger auf ein Ergebnis einstellen. Sie können den Cursor durch die Ergebnismenge bewegen und jede Zeile verarbeiten, bis Sie feststellen, dass Sie sich am Ende der Ergebnismenge befinden. Es gibt drei Arten von Syntax, die Cursorn zugeordnet sind:Erstellen des Cursors, Abrufen mit dem Cursor und Schließen des Cursors. Darüber hinaus gibt es eine Reihe von Attributen eines Cursors, die Sie in Ihren logischen Vergleichen verwenden können. Im Folgenden sind die Arten von Cursorn in Oracle aufgeführt:

Explizite Cursor

Explizite Cursor sind Cursor, die Sie deklarieren und verwenden.

Implizite Cursor

PL/SQL ermöglicht es Ihnen, SQL-Anweisungen, einschließlich SELECT-Anweisungen, als Teil Ihres Codes einzufügen, ohne einen Cursor zu deklarieren, der als impliziter Cursor bezeichnet wird.

Ref-Cursor

Ein Cursor verweist auf eine Ergebnismenge. Mit dem REF CURSOR können Sie eine Cursorreferenz von einer PL/SQL-Programmeinheit an eine andere übergeben. Mit anderen Worten, es ermöglicht Ihnen, eine Variable zu erstellen, die einen Cursor erhält und den Zugriff auf seine Ergebnismenge ermöglicht, aber in diesem Blog gebe ich Beispiele nur für explizite und implizite Cursor, ich werde Beispiele für Ref-Cursor und geben Dynamischer Cursor in einem anderen Blog .Ein Beispiel für einen expliziten Cursor:DECLARE nemployeeid NUMBER; Startdatum DATUM; Endedatum DATUM; sjobid VARCHAR2 (20); -- Deklarieren Sie den Cursor CURSOR curjob IS SELECT employee_id, start_date, end_date, job_id FROM hr.job_history;BEGIN OPEN curjob; LOOP FETCH curjob INTO nemployeeid, dstartdate, denddate, sjobid; BEENDEN, WENN curjob%NOTFOUND; DBMS_OUTPUT.put_line( 'Employee ' || nemployeeid || 'hatte Job ' || sjobid || ' für ' || (denddate - dstartdate) || ' Tage.'); SCHLEIFE ENDE; CLOSE curjob;END;/Dasselbe Beispiel wird unten für den expliziten Cursor gegeben, aber mit der For-Schleife sind die For-Schleifen-Cursor intelligenter, da keine Variablen deklariert werden müssen, um Werte in ihnen abzurufen, und keine Notwendigkeit, sie zu öffnen oder zu schließen oder zu prüfen, ob der Zeiger befindet sich am Ende des Cursors. Hier ist das Beispiel:DECLARE CURSOR curjob IS SELECT employee_id, start_date, end_date, job_id FROM hr.job_history;BEGIN FOR jh_rec IN curjob LOOP DBMS_OUTPUT.put_line( ''Employee ' || jh_rec.employee_id || ' had job ' || jh_rec .job_id || ' für ' || ( jh_rec.end_date - jh_rec.start_date || ' Tage.')); END LOOP;END;/Beispiel eines impliziten Cursors:DECLARE nempno NUMBER; CURSOR curjob IS SELECT employee_id, start_date, end_date, job_id FROM hr.job_history; BEGIN -- unterhalb der SQL-Abfrage ist der Typ des impliziten Cursors SELECT COUNT ( * ) INTO nempno FROM hr.job_history; DBMS_OUTPUT.put_line ( 'Es gibt ' || nempno || ' Aufzeichnungen der Mitarbeiterhistorie.'); FOR jh_rec IN curjob LOOP DBMS_OUTPUT.put_line( ''Employee ' || jh_rec.employee_id || ' hatte Job ' || jh_rec.job_id || ' for ' || ( jh_rec.end_date - jh_rec.start_date || ' days.' )); SCHLEIFE ENDE;ENDE;/