it-swarm-eu.dev

Was ist der Unterschied zwischen expliziten und impliziten Cursor in Oracle?

Ich bin auf meinem Cursor in PL/SQL ein bisschen verrostet. Weiß jemand das?

25
Brian G

Ein impliziter Cursor wird von Oracle automatisch erstellt, wenn Sie eine Abfrage ausführen. Es ist einfacher zu codieren, leidet aber darunter 

  • ineffizienz (der ANSI-Standard legt fest, dass er zweimal abrufen muss, um zu prüfen, ob es mehr als einen Datensatz gibt)
  • anfälligkeit für Datenfehler (wenn Sie jemals zwei Zeilen erhalten, wird eine TOO_MANY_ROWS-Ausnahme ausgelöst)

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;
39
Sten Vesterli

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;
...
16
stjohnroe

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.

  • Beispiel: Expliziter Cursor

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;
4
Ganesh Pathare

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.

3
prince
3
pablo

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.

3
Dave Costa

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.

3
Ian Carpenter

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.

2
Kristian

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; 
1
GOVIND DIXIT

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.

1
UltraCommit

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.

1
Derek Swingley

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.

1
shaiksyedbasha

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 .

1
Lalit Kumar B

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.

0
ropable

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 .

0
Vadzim