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.
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 更新列列名];
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!