Heim  >  Artikel  >  Datenbank  >  Was ist ein Oracle-Cursor?

Was ist ein Oracle-Cursor?

青灯夜游
青灯夜游Original
2022-02-23 11:35:0413285Durchsuche

In Oracle ist der Cursor ein Mechanismus, der das Schlüsselwort CURSOR verwendet, um einen von Oracle abgefragten Datensatz zu definieren. Der abgefragte Datensatz kann im Speicher gespeichert werden, und der Cursor zeigt dann über eine Schleife auf einen der Datensätze. Cursor erfüllen den Zweck, Datensätze zu durchlaufen.

Was ist ein Oracle-Cursor?

Die Betriebsumgebung dieses Tutorials: Windows 7-System, Oracle 11g-Version, Dell G3-Computer.

In Oracle sind Cursor ein Mechanismus, mit dem einer SELECT-Anweisung ein Name zugewiesen und die Informationen in dieser SQL-Anweisung verarbeitet werden können.

Oracle-Cursor definiert einen Satz von Datensätzen, die von Oracle über das Schlüsselwort CURSOR abgefragt werden. Ähnlich wie bei einem Array wird der abgefragte Datensatz im Speicher gespeichert, und dann wird der Cursor verwendet, um auf einen der Datensätze und das Rundschreiben zu zeigen Der Datensatz wird über den Schleifencursor erreicht.

Was macht der Cursor?

①Geben Sie die Position einer bestimmten Zeile im Ergebnissatz an.

②Rufen Sie eine Zeile oder mehrere aufeinanderfolgende Zeilen basierend auf der aktuellen Position der Ergebnismenge ab.

③ Ändern Sie die Daten in der Zeile an der aktuellen Position des Ergebnissatzes.

④ Definieren Sie unterschiedliche Empfindlichkeitsstufen für Datenänderungen anderer Benutzer.

⑤Auf die Datenbank kann programmgesteuert zugegriffen werden.

Typ des Oracle-Cursors?

1. Statischer Cursor: Ein Cursor, dessen Ergebnismenge bestätigt wurde (statisch definiert). Unterteilt in implizite und explizite Cursor

  • Impliziter Cursor: Alle DML-Anweisungen sind implizite Cursor, und SQL-Anweisungsinformationen können über das implizite Cursorattribut abgerufen werden.

  • Cursor anzeigen: Der Benutzer zeigt den deklarierten Cursor an, dh die angegebene Ergebnismenge. Wenn eine Abfrage mehr als eine Ergebniszeile zurückgibt, ist ein expliziter Cursor erforderlich.

2. REF-Cursor: ein temporäres Objekt, das die Ergebnismenge dynamisch zuordnet.

Welche Status haben Oracle-Cursor und wie werden Cursorattribute verwendet?

①Der Status des Cursors wird durch Attribute dargestellt.

  • %Gefunden: Der Ausführungsstatus der Fetch-Anweisung (Datensätze abrufen) ist „True“ oder „False“.

  • %NotFound: Ob der letzte Datensatz als „True“ oder „False“ extrahiert wird.

  • %ISOpen: Ob der Cursor geöffnet ist, wahr oder falsch.

  • %RowCount: Die Anzahl der Zeilen, die derzeit vom Cursor extrahiert werden.

②Verwenden Sie die Eigenschaften des Cursors.

Beispiel:

/* conn scott/tiger */
  Begin
   Update emp Set  SAL = SAL + 0.1  Where JOB = 'CLERK';
   If  SQL%Found  Then
    DBMS_OUTPUT.PUT_LINE('已经更新!');
   Else
    DBMS_OUTPUT.PUT_LINE('更新失败!');
   End  If;
  End;

Wie verwende ich den Anzeigecursor? Wie iteriere ich über einen Schleifencursor?

1. Verwenden Sie den Anzeigecursor

  • , um den Cursor zu deklarieren: Teilen Sie den Speicherbereich. Beachten Sie, dass die Select-Anweisung zu diesem Zeitpunkt nicht ausgeführt wird.

CURSOR 游标名( 参数 列表)   [返回值类型]   IS   Select 语句;
  • Öffnen Sie den Cursor: Führen Sie die Select-Anweisung aus, rufen Sie die Ergebnismenge ab und speichern Sie sie im Cursor. Zu diesem Zeitpunkt zeigt der Cursor auf den Kopf der Ergebnismenge, nicht auf den ersten Datensatz.

 Open 游标名( 参数 列表);
  • Datensatz abrufen: Bewegen Sie den Cursor, um einen Datensatz zu erhalten.

Fetch  游标名InTo  临时记录或属性类型变量;
  • Cursor schließen: Setzen Sie den Cursor in den Pufferpool, ohne die Ressourcen vollständig freizugeben. Kann wieder geöffnet werden.

Close  游标名;

2. Schleifencursor durchlaufen

  • Für Schleifencursor

Der Schleifencursor öffnet implizit den Cursor, scrollt automatisch, um einen Datensatz zu erhalten, und erstellt automatisch eine temporäre Datensatztypvariable zum Speichern des Datensatzes. Der Cursor wird nach der Bearbeitung automatisch geschlossen.

     For  变量名  In  游标名 
     Loop
      数据处理语句;
     End Loop;
  • Loop-Loop-Cursor

     。。。
    Loop
     Fatch  游标名InTo  临时记录或属性类型变量;
     Exit  When   游标名%NotFound;
    End   Loop;
     。。。

Beispiel 1:

/* conn scott/tiger */
   Declare
     Cursor myCur is select empno,ename,sal from emp;
     vna varchar2(10);
     vno number(4);
     vsal number(7,2);
  Begin
     open myCur;
     fetch myCur into vno,vna,vsal;
     dbms_output.put_line(vno||'    '||vna||'    '||vsal);
     close myCur;
  End;
  /

Beispiel 2: Verwenden Sie eine Schleife, um den Cursor zu durchlaufen.

 /* conn scott/tiger */
  Declare
     Cursor myCur is select ename,job,sal,empno from emp;
     varE myCur%rowType;
  Begin
     if myCur%isopen = false then
        open myCur;
       dbms_output.put_line('Opening...');
     end if;
     loop
        fetch myCur into varE;
        exit when myCur%notfound;
        dbms_output.put_line(myCur%rowCount||'    '||vare.empno||'    '||vare.ename||'    '||vare.sal);
     end loop;
     if myCur%isopen then
        Close myCur;
        dbms_output.put_line('Closing...');
     end if;
  End;
  /

Beispiel 3: Verwenden einer For-Schleife zum Durchqueren des Cursors,

  /* conn scott/tiger */
  Declare
     Cursor myCur is select * from emp;
  Begin
     for varA in myCur
      loop
         dbms_output.put_line(myCur%rowCount||'    '||varA.empno||'    '||varA.ename||'  '||varA.sal);
      end loop;
  End;
  /

Wie aktualisiere und lösche ich Datensätze im angezeigten Cursor?

①Der WHERE CURRENT OF-Teilstring in der UPDATE- oder DELETE-Anweisung behandelt speziell die aktuellsten Daten, die aus der Tabelle abgerufen wurden, um UPDATE- oder DELETE-Vorgänge auszuführen.

Um diese Methode zu verwenden, müssen Sie beim Deklarieren des Cursors den FOR UPDATE-Teilstring verwenden. Wenn der Dialog den FOR UPDATE-Teilstring zum Öffnen eines Cursors verwendet,

Alle Datenzeilen im Rückgabesatz befinden sich auf Zeilenebene (ROW-). LEVEL) Exklusivmodus Gesperrt, andere Objekte können nur diese Datenzeilen abfragen,

kann keine UPDATE-, DELETE- oder SELECT...FOR UPDATE-Operationen ausführen.

Verwenden Sie bei Abfragen mit mehreren Tabellen die OF-Klausel, um eine bestimmte Tabelle zu sperren. Wenn die OF-Klausel ignoriert wird, werden die ausgewählten Datenzeilen in allen Tabellen gesperrt.

Wenn diese Datenzeilen durch andere Sitzungen gesperrt wurden, wartet ORACLE unter normalen Umständen, bis die Datenzeilen entsperrt werden. 🔜 Cursoraufzeichnung

   Cursor 游标名IS  SELECT 语句   For Update [ Of  更新列列名];
   Cursor 游标名IS  SELECT 语句   For Delete [ Of  更新列列名];

Was ist ein Anzeigecursor mit Parametern?

1. Ähnlich wie bei Prozeduren und Funktionen können Parameter an den Cursor übergeben und in Abfragen verwendet werden.

Der Parameter definiert nur den Datentyp, keine Größe (alle formalen Parameter in Oracle definieren nur den Datentyp, es wird keine Größe angegeben).

  与过程不同的是,游标只能接受传递的值,而不能返回值。

   可以给参数设定一个缺省值,当没有参数值传递给游标时,就使用缺省值。

  游标中定义的参数只是一个占位符,在别处引用该参数不一定可靠。

2、使用带参数的显示游标

  • 声明带参数的显示游标:

   CURSOR 游标名  [(parameter[,parameter],...)]    IS   Select语句;

参数形式:

1,参数名   数据类型  

2,参数名   数据类型  DEFAULT  默认值

   例子:

    /*conn scott/tiger
    Crate table  empa  Select * from scott.emp;
    */
    Declare
      Cursor MyCursor(pSal  Number  Default   800)  Select   JOB  From  empa Where  SAL >  pSal ;
      varA  MyCursor%ROWTYPE;
    Begin
      Loop
       Fetch  MyCursor  InTo  varA;
       Exit  When  MyCursor%NotFound;
       DBMS_OUTPUT.PUT_LINE(MyCursor%RowCount||'    '||varA.empno||'    '||varA.ename||'  '||varA.sal); 
      End    Loop;
    End;/

推荐教程:《Oracle教程

Das obige ist der detaillierte Inhalt vonWas ist ein Oracle-Cursor?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn