2016-07-21 5 views

Antwort

2

Wenn ein Cursor mehr als einmal in einer Programmeinheit verwendet wird, ermöglicht eine explizite Cursor Sie die SQL einmal zu kodieren, die für die Wartung gut ist.

+2

Wenn unser Code dasselbe SQL mehr als einmal verwendet, möchten wir vielleicht unser Design erneut in Betracht ziehen. – APC

+0

Aber mit der gleichen SQL mehr als einmal ist nicht notwendig, ein schlechtes Design. – user272735

2

Es gibt zwei klare Anwendungsfälle für explizite Cursor.

Die erste ist, wenn wir für die Existenz eines Datensatzes und zu handhaben, das Ergebnis in den Hauptstrom unseres Codes sondieren möchten:

open emp_cur (p_empno); 
fetch emp_cur into l_emp_rec; 
if emp_cur%notfound then 
    ... 

Dies könnte ordentlicheres dann

begin 
    select e.* into l_emp_rec 
    from emp e 
    where e.empno = p_empno; 
    .... 
exception 
    when no_data_found then 
     ... 

Apart von etwas anderem, was andere Teile unseres Programms könnten no_data_found schleudern?

Der andere Fall ist, wenn wir Bulk-Sammlung mit der LIMIT-Klausel (und mit ziemlicher Sicherheit wollen wir nutzen, um die LIMIT-Klausel, wenn wir Bulk-Sammlung zu tun) verwenden möchten. So

Explizite Cursor führen Overhead in unseren Code ein, so dass sie als klobig und ineffizient wahrgenommen werden. Aber das ist nicht immer der Fall. Wenn wir eine Bulk-Collect-Anweisung mit einem impliziten Cursor codieren, optimiert Oracle dies, um eine LIMIT-Klausel mit einem Wert von 100 zu verwenden. Das ist kein schlechter Standard, aber wahrscheinlich können wir mit einem höheren Wert 1000, 5000 bessere Leistung erzielen , sogar 10000. Die Kontrolle, die wir über den LIMIT-Wert erhalten, macht es also sinnvoll, den expliziten Cursor zu verwenden.

Kurz gesagt, sollten wir implizite Cursor verwenden, wenn wir glücklich sind, lassen Oracle Kontrolle Entscheidungen treffen (das ist ein großer Teil der Zeit ist, Oracle ziemlich smart). Aber wir sollten explizite Cursor verwenden, wenn wir Kontrolle über das Verhalten unseres Programms ausüben müssen.

+0

Ich bin bei dir hier - ich verwende fast immer explizite Cursor (das einzige Mal, wenn ich nicht bin, wenn ich den Code eines anderen aktualisiere und ich möchte einen konsistenten Stil beibehalten). Mir war jedoch nicht bewusst, dass Sie eine LIMIT-Klausel nur für einen expliziten Cursor verwenden können. Ich habe viele Beispiele gesehen, die * ein * LIMIT benutzen - meinst du, das Limit wird zugunsten des Default-Wertes ignoriert? –

+0

Sie erwähnte nicht explizit eine sehr praktische [rowtype] (http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/composites.htm#CIHHHGAE) -Attribut, die nur mit explizitem Cursor verwendet werden können, . I.e. 'l_emp_rec emp_cur% rowtype;'. – user272735

Verwandte Themen