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

StackOverflow https://stackoverflow.com/questions/74010

  •  09-06-2019
  •  | 
  •  

Frage

Ich bin ein bisschen auf meinem Cursor Kauderwelsch in PL / SQL verrostet. Wer weiß das?

War es hilfreich?

Lösung

Eine implizite Cursor ist ein erstellt „automatisch“ für Sie von Oracle, wenn Sie eine Abfrage ausführen. Es ist einfacher zu codieren, leidet aber unter

  • Ineffizienz (der ANSI-Standard legt fest, dass es zweimal holen muss um zu überprüfen, ob es mehr als ein Datensatz ist)
  • Anfälligkeit für Datenfehler (wenn Sie jemals zwei Reihen bekommen, es wirft eine TOO_MANY_ROWS Ausnahme)

Beispiel

SELECT col INTO var FROM table WHERE something;

Eine explizite Cursor ist eine Sie selbst erstellen. Es ist mehr Code nimmt, aber mehr Kontrolle gibt - zum Beispiel, können Sie einfach Open-Fetch-nahe, wenn Sie nur den ersten Datensatz wollen und egal, ob es andere gibt.

Beispiel

DECLARE   
  CURSOR cur IS SELECT col FROM table WHERE something; 
BEGIN
  OPEN cur;
  FETCH cur INTO var;
  CLOSE cur;
END;

Andere Tipps

Eine explizite Cursor als solche in einem Deklarationsblocks definiert ist:

DECLARE 
CURSOR cur IS 
  SELECT columns FROM table WHERE condition;
BEGIN
...

ein impliziter Cursor wird direkt in einem Codeblock zuzurAufnahme:

...
BEGIN
   SELECT columns INTO variables FROM table where condition;
END;
...

1.CURSOR: Wenn PLSQL Fragen SQL-Anweisungen erstellt es privater Arbeitsbereich    analysieren und ausführen wird die SQL-Anweisung genannt Cursor.

2.IMPLICIT: Wenn ein PL / SQLexecutable Block-Ausgaben SQL-Anweisung.    PL / SQL erzeugt implizite Cursor und verwaltet automatisch bedeutet,    implcit Öffnen und Schließen erfolgt. Es wird verwendet, wenn SQL-Anweisung return    nur ein row.It hat 4 Attribute SQL% ROWCOUNT, SQL% gefunden,    SQL% NOTFOUND, SQL% ISOPEN.

3.EXPLICIT: Es wird erstellt und vom Programmierer verwaltet. Es muss jeder    Zeit ausdrücklich offen, holen und in der Nähe. Es wird verwendet, wenn SQL-Anweisung    liefert mehr als eine Zeile. Es hat auch 4 Attribute    CUR_NAME% ROWCOUNT, CUR_NAME% GEFUNDEN, CUR_NAME% NOTFOUND,    CUR_NAME% ISOPEN. Es Prozess mehrere Reihen von Schleife.    Der Programmierer kann den Parameter übergeben zu expliziten Cursor.

  • Beispiel: Explizite 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;

Eine explizite Cursor ist eine Sie erklären, wie:

CURSOR my_cursor IS
  SELECT table_name FROM USER_TABLES

Ein impliziter Cursor ist eine erstellt SQL jede in-line unterstützen Sie schreiben (entweder statisch oder dynamisch).

In der Antwort auf die erste Frage. Direkt von der Oracle Dokumentation

  

Ein Cursor ist ein Zeiger auf einen privaten SQL   Bereich, der Informationen speichert über   Verarbeiten eines spezifischen SELECT oder DML   Aussage.

Implizite Cursor erfordert anonymen Pufferspeicher.

Explizite Cursor erneut ausgeführt werden können und wieder durch ihre name.They Verwendung in benutzerdefinierter Speicherplatz gespeichert sind, anstatt in einem anonymen Pufferspeicher gespeichert werden und somit leicht danach zugegriffen werden.

Mit expliziten Cursor, haben Sie die volle Kontrolle darüber, wie Informationen in der Datenbank zuzugreifen. Sie entscheiden, wann Sie den Cursor zu öffnen, wenn Datensätze aus dem Cursor auf FETCH (und daher aus der Tabelle oder Tabellen in der SELECT-Anweisung des Cursors), wie viele Datensätze zu holen, und wenn Sie den Cursor zu schließen. Informationen über den aktuellen Zustand des Cursors ist durch Prüfung der Cursor-Attribute zur Verfügung.

Siehe http://www.unix.com.ua/ orelly / oracle / prog2 / ch06_03.htm .

Google ist dein Freund: http://docstore.mik.ua/ orelly / oracle / prog2 / ch06_03.htm

  

PL / SQL gibt einen impliziten Cursor   wenn Sie eine SQL-Anweisung ausführen   direkt im Code, solange das   Code verwendet keine explizite   Mauszeiger. Es wird eine „implizite“ genannt   Cursor, weil Sie, der Entwickler, tun   nicht explizit einen Cursor deklarieren für   die SQL-Anweisung.

     

Eine explizite Cursor ist ein SELECT   Anweisung, die explizit definiert ist,   im Deklarationsteil Ihrer   Code und in dem Prozess, zugeordnet a   Name. Es gibt nicht so etwas wie eine   explizite Cursor für UPDATE, DELETE,   und INSERT-Anweisungen.

Ein Cursor ist ein ausgewähltes Fenster auf einer Oracle-Tabelle, das bedeutet eine Gruppe von Datensätzen in einer Oracle-Tabelle, und befriedigende bestimmten Bedingungen. Ein Cursor kann den Inhalt einer Tabelle auswählen, auch. Mit einem Cursor können Sie Oracle-Spalten manipulieren, so dass sie im Ergebnis Aliasing. Ein Beispiel für implizite Cursor ist die 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 Sie öffnen und schließen Sie den Cursor authomatically, wenn die Datensätze des Cursors haben alle analysiert.

Ein Beispiel für explizite Cursor ist die 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;
/

In der expliziten Cursor Sie öffnen und den Cursor in expliziter Weise zu schließen, um das Vorhandensein von Aufzeichnungen überprüft und unter Angabe einer Ausgangsbedingung.

Implizite Cursor gibt nur einen Datensatz und wird automatisch aufgerufen. Allerdings sind explizite Cursor genannt manuell und kann mehr als einen Datensatz zurück.

Ich weiß, dass dies eine alte Frage ist aber, denke ich, es wäre gut, ein praktisches Beispiel hinzufügen, um den Unterschied zwischen den beide von einer Performance-Sicht zu zeigen.

Aus Performance-Sicht sind Implizite Cursor schneller.

Lassen Sie uns die Performance-Unterschied zwischen den beiden sehen:

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.

Also, ein signifikanter Unterschied ist deutlich sichtbar.

Weitere Beispiele hier .

In PL / SQL ist ein Cursor ein Zeiger auf diesen Kontextbereich. Es enthält alle Informationen, die für die Erklärung der Verarbeitung.

Implizite Cursor: Implizite Cursor werden automatisch von Oracle erstellt, wenn eine SQL-Anweisung ausgeführt wird, wenn es keine expliziten Cursor für die Anweisung. Programmierer können nicht die impliziten Cursor steuern und die darin enthaltenen Informationen.

Explizite Cursor: Explizite Cursor sind Programmierer definierte Cursor für mehr Kontrolle über das Kontextbereich zu gewinnen. Eine explizite Cursor sollte im Deklarationsteil des PL / SQL-Block definiert werden. Es basiert auf einem SELECT-Anweisung erstellt, die mehr als eine Zeile zurückgibt.

Die Syntax einen expliziten Cursor für die Erstellung ist:

CURSOR cursor_name IS select_statement; 

Jede SQL-Anweisung von der Oracle-Datenbank ausgeführt hat einen Cursor mit ihm verbunden, die ein privater Arbeitsbereich ist die Verarbeitung von Informationen zu speichern. Implizite Cursor werden vom Oracle-Server für alle DML und SELECT-Anweisungen implizit erstellt.

können Sie deklarieren und explizite Cursor verwenden den privaten Arbeitsbereich zu nennen, und Zugriff auf seine gespeicherten Informationen in Ihrem Programmblock.

Wie in anderen Antworten erwähnt, implizite Cursor sind einfacher zu verwenden und weniger fehleranfällig.

Und Implizite vs. Explizite Cursor in Oracle PL / SQL zeigt, dass implizite Cursor sind bis zu zwei mal schneller als explizit diejenigen zu.

Es ist seltsam, dass niemand noch erwähnt hatte Implizite FOR LOOP Cursor :

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 auf SO: PL / SQL FOR LOOP IMPLIZIT CURSOR .

Es ist viel mehr kürzer als explizite Form.

Dies bietet auch eine schöne Abhilfe für mehrere Tabellen von CTE zu aktualisieren.

Explicit ...

Cursor foo ist select * from blah; Start    offener Ausgang, wenn die Nähe Cursor yada Blabla

holen

Sie sie nicht verwenden, verwenden implizite

Cursor foo ist select * from blah;

n in foo loop    x = n.some_column Endschleife

Ich denke, man kann dies auch tun

n in (select * from bla) loop ...

Halten Sie

zu implizit, sie schließen sich, sie sind besser lesbar, sie machen das Leben einfach.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top