Ich bin auf meinem Cursor in PL/SQL ein bisschen verrostet. Weiß jemand das?
Ein impliziter Cursor wird von Oracle automatisch erstellt, wenn Sie eine Abfrage ausführen. Es ist einfacher zu codieren, leidet aber darunter
Beispiel
SELECT col INTO var FROM table WHERE something;
Ein expliziter Cursor wird von Ihnen selbst erstellt. Es erfordert mehr Code, gibt aber mehr Kontrolle - Sie können beispielsweise nur Öffnen, Abrufen und Schließen schließen, wenn Sie nur den ersten Datensatz wünschen und sich nicht darum kümmern, ob es noch andere gibt.
Beispiel
DECLARE
CURSOR cur IS SELECT col FROM table WHERE something;
BEGIN
OPEN cur;
FETCH cur INTO var;
CLOSE cur;
END;
Ein expliziter Cursor ist in einem Deklarationsblock als solcher definiert:
DECLARE
CURSOR cur IS
SELECT columns FROM table WHERE condition;
BEGIN
...
ein impliziter Cursor wird direkt in einem Codeblock eingefügt:
...
BEGIN
SELECT columns INTO variables FROM table where condition;
END;
...
1.CURSOR: Wenn PLSQL SQL-Anweisungen ausgibt, wird ein privater Arbeitsbereich erstellt Um die SQL-Anweisung zu analysieren und auszuführen, wird als Cursor bezeichnet.
2.IMPLICIT: Wenn ein PL/SQL-ausführbarer Block die SQL-Anweisung ..__ ausgibt. PL/SQL erstellt einen impliziten Cursor und verwaltet automatisch implcit open & close findet statt. Wird verwendet, wenn die SQL-Anweisung .__ zurückgibt. Nur eine Zeile. Es hat 4 Attribute SQL% ROWCOUNT, SQL% FOUND, SQL% NOTFOUND, SQL% ISOPEN.
3.EXPLICIT: Es wird vom Programmierer erstellt und verwaltet. Es braucht jeden Zeit explizit öffnen, holen & schließen. Wird verwendet, wenn die SQL-Anweisung gibt mehr als eine Zeile zurück. Es hat auch 4 Attribute CUR_NAME% ROWCOUNT, CUR_NAME% FOUND, CUR_NAME% NOTFOUND, CUR_NAME% ISOPEN. Es verarbeitet mehrere Zeilen mithilfe einer Schleife. Der Programmierer kann den Parameter auch an den expliziten Cursor übergeben.
declare
cursor emp_cursor
is
select id,name,salary,dept_id
from employees;
v_id employees.id%type;
v_name employees.name%type;
v_salary employees.salary%type;
v_dept_id employees.dept_id%type;
begin
open emp_cursor;
loop
fetch emp_cursor into v_id,v_name,v_salary,v_dept_id;
exit when emp_cursor%notfound;
dbms_output.put_line(v_id||', '||v_name||', '||v_salary||','||v_dept_id);
end loop;
close emp_cursor;
end;
Implizite Cursor benötigen anonymen Pufferspeicher.
Explizite Cursor können unter Verwendung ihres Namens immer wieder ausgeführt werden. Sie werden in einem benutzerdefinierten Speicherplatz gespeichert, anstatt in einem anonymen Pufferspeicher gespeichert zu werden, und können daher leicht darauf zugegriffen werden.
In diesen Tagen sind implizite Cursor effizienter als explizite Cursor.
http://www.Oracle.com/technology/oramag/Oracle/04-sep/o54plsql.html
http://asktom.Oracle.com/pls/asktom/f?p=100:11::::P11_QUESTION_ID:1205168148688
Ein expliziter Cursor wird von Ihnen deklariert, z.
CURSOR my_cursor IS
SELECT table_name FROM USER_TABLES
Ein impliziter Cursor ist für die Unterstützung von Inline-SQL (statisch oder dynamisch) erstellt worden.
Auf die erste Frage antworten. Direkt aus dem Oracle Dokumentation
Ein Cursor ist ein Zeiger auf eine private SQL Bereich, in dem Informationen zu .__ gespeichert werden. Verarbeitung einer bestimmten SELECT- oder DML-Datei Aussage.
Mit expliziten Cursors haben Sie die vollständige Kontrolle über den Zugriff auf Informationen in der Datenbank. Sie entscheiden, wann Sie den Cursor ÖFFNEN, wann Sie Datensätze vom Cursor abrufen (und damit aus der Tabelle oder den Tabellen in der SELECT-Anweisung des Cursors), wie viele Datensätze abgerufen werden sollen und wann Sie den Cursor schließen. Informationen zum aktuellen Status Ihres Cursors erhalten Sie durch Untersuchung der Cursor-Attribute.
Siehe http://www.unix.com.ua/orelly/Oracle/prog2/ch06_03.htm für Einzelheiten.
In PL/SQL ist ein Cursor ein Zeiger auf diesen Kontextbereich. Es enthält alle Informationen, die für die Verarbeitung der Anweisung erforderlich sind.
Implizite Cursor: Implizite Cursor werden von Oracle automatisch erstellt, wenn eine SQL-Anweisung ausgeführt wird, wenn kein expliziter Cursor für die Anweisung vorhanden ist. Programmierer können die impliziten Cursor und die darin enthaltenen Informationen nicht steuern.
Explizite Cursor: Explizite Cursor sind vom Programmierer definierte Cursor, um mehr Kontrolle über den Kontextbereich zu erlangen. Ein expliziter Cursor sollte im Deklarationsabschnitt des PL/SQL-Blocks definiert werden. Es wird in einer SELECT-Anweisung erstellt, die mehr als eine Zeile zurückgibt.
Die Syntax zum Erstellen eines expliziten Cursors lautet:
CURSOR cursor_name IS select_statement;
Ein Cursor ist ein SELECT-Fenster in einer Oracle-Tabelle. Dies bedeutet, dass eine Gruppe von Datensätzen in einer Oracle-Tabelle vorhanden ist und bestimmte Bedingungen erfüllt. Ein Cursor kann auch den gesamten Inhalt einer Tabelle AUSWÄHLEN. Mit einem Cursor können Sie Oracle-Spalten bearbeiten und im Ergebnis als Aliasing verwenden. Ein Beispiel für einen impliziten Cursor ist der folgende:
BEGIN
DECLARE
CURSOR C1
IS
SELECT DROPPED_CALLS FROM ALARM_UMTS;
C1_REC C1%ROWTYPE;
BEGIN
FOR C1_REC IN C1
LOOP
DBMS_OUTPUT.PUT_LINE ('DROPPED CALLS: ' || C1_REC.DROPPED_CALLS);
END LOOP;
END;
END;
/
Mit FOR ... LOOP ... END LOOP öffnen und schließen Sie den Cursor automatisch, wenn alle Datensätze des Cursors analysiert wurden.
Ein Beispiel für einen expliziten Cursor ist das Folgende:
BEGIN
DECLARE
CURSOR C1
IS
SELECT DROPPED_CALLS FROM ALARM_UMTS;
C1_REC C1%ROWTYPE;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO c1_rec;
EXIT WHEN c1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE ('DROPPED CALLS: ' || C1_REC.DROPPED_CALLS);
END LOOP;
CLOSE c1;
END;
END;
/
Im expliziten Cursor öffnen und schließen Sie den Cursor explizit, prüfen das Vorhandensein von Datensätzen und geben eine Beendigungsbedingung an.
Google ist dein Freund: http://docstore.mik.ua/orelly/Oracle/prog2/ch06_03.htm
PL/SQL gibt einen impliziten Cursor aus Immer wenn Sie eine SQL-Anweisung ausführen direkt in Ihrem Code, solange das Code verwendet keine explizite Mauszeiger. Es heißt "implizit" Cursor, weil Sie als Entwickler einen Cursor nicht explizit für .__ deklarieren. die SQL-Anweisung.
Ein expliziter Cursor ist ein SELECT explizit definierte Anweisung im Deklarationsteil Ihres Code und dabei eine Name. Es gibt keine expliziter Cursor für UPDATE, DELETE, und INSERT-Anweisungen.
Der implizite Cursor gibt nur einen Datensatz zurück und wird automatisch aufgerufen. Explizite Cursor werden jedoch manuell aufgerufen und können mehr als einen Datensatz zurückgeben.
Ich weiß, dass dies eine alte Frage ist, aber ich denke, es wäre gut, ein praktisches Beispiel hinzuzufügen, um den Unterschied zwischen den beiden aus Performance-Sicht darzustellen.
Aus Performance-Sicht sind implizite Cursor schneller.
Sehen wir uns den Leistungsunterschied zwischen den beiden an:
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2 l_loops NUMBER := 100000;
3 l_dummy dual.dummy%TYPE;
4 l_start NUMBER;
5
6 CURSOR c_dual IS
7 SELECT dummy
8 FROM dual;
9 BEGIN
10 l_start := DBMS_UTILITY.get_time;
11
12 FOR i IN 1 .. l_loops LOOP
13 OPEN c_dual;
14 FETCH c_dual
15 INTO l_dummy;
16 CLOSE c_dual;
17 END LOOP;
18
19 DBMS_OUTPUT.put_line('Explicit: ' ||
20 (DBMS_UTILITY.get_time - l_start) || ' hsecs');
21
22 l_start := DBMS_UTILITY.get_time;
23
24 FOR i IN 1 .. l_loops LOOP
25 SELECT dummy
26 INTO l_dummy
27 FROM dual;
28 END LOOP;
29
30 DBMS_OUTPUT.put_line('Implicit: ' ||
31 (DBMS_UTILITY.get_time - l_start) || ' hsecs');
32 END;
33 /
Explicit: 332 hsecs
Implicit: 176 hsecs
PL/SQL procedure successfully completed.
Ein deutlicher Unterschied ist also deutlich sichtbar.
Weitere Beispiele hier .
Mit jeder von der Oracle-Datenbank ausgeführten SQL-Anweisung ist ein Cursor verbunden. Hierbei handelt es sich um einen privaten Arbeitsbereich zum Speichern von Verarbeitungsinformationen. Implizite Cursor werden vom Oracle-Server implizit für alle DML- und SELECT-Anweisungen erstellt.
Sie können explizite Cursor deklarieren und verwenden, um den privaten Arbeitsbereich zu benennen und auf dessen gespeicherte Informationen in Ihrem Programmblock zuzugreifen.
Wie in anderen Antworten erwähnt, sind implizite Cursor einfacher zu bedienen und weniger fehleranfällig.
Und implizite vs. explizite Cursor in Oracle PL/SQL zeigt, dass implizite Cursor bis zu zweimal schneller sind als explizite.
Es ist seltsam, dass noch niemand Implicit FOR LOOP Cursor erwähnt hatte:
begin
for cur in (
select t.id from parent_trx pt inner join trx t on pt.nested_id = t.id
where t.started_at > sysdate - 31 and t.finished_at is null and t.extended_code is null
)
loop
update trx set finished_at=sysdate, extended_code = -1 where id = cur.id;
update parent_trx set result_code = -1 where nested_id = cur.id;
end loop cur;
end;
Ein weiteres Beispiel zu SO: PL/SQL FÜR LOOP IMPLICIT CURSOR .
Es ist viel kürzer als explizite Form.
Dies bietet auch eine nette Lösung für Aktualisieren mehrerer Tabellen aus CTE .