sql >> Database >  >> RDS >> Oracle

Wat is cursor in orakel

Wat is cursor in orakel

Oracle Gebruikt een werkgebied met de naam Private SQL-gebieden om SQL-statements uit te voeren en informatie op te slaan. Een Oracle Cursor is een PL/SQL-constructie waarmee u deze werkgebieden een naam kunt geven en toegang kunt krijgen tot hun opgeslagen informatie

Typen cursor in Oracle

  • Impliciete cursor in Oracle
  • Expliciete cursor in Oracle

Expliciete cursors

Expliciete cursors hebben de volgende fasen

1) Declareren:We declareren de naam van de cursor en definiëren de structuur van de query

2) Open:De open-instructie voert de query uit en bindt elke variabele waarnaar wordt verwezen. Rijen die door de query worden geïdentificeerd, worden actieve sets genoemd. En nu is dat beschikbaar om op te halen

Wat is actieve set: De reeks rijen die wordt geretourneerd door een zoekopdracht met meerdere rijen

De grootte is het aantal rijen dat aan uw zoekcriteria voldoet

3) Ophalen:in deze fase worden rijen opgehaald van de cursor en na elke ophaalactie test u de cursor op eventuele resterende rijen. Als er geen rijen zijn, gaat u verder met het sluiten van de cursor

4) Sluiten:de close-instructie geeft de actieve set rijen vrij en we kunnen de cursor opnieuw openen om de verversing van de actieve set op te halen

Stadiums in detail

Een cursor declareren

  • Cursornaam
  • Structuur van de zoekopdracht
Syntax:
 CURSOR  IS   :  It includes most of the usual clauses, but INTO Clause is not allowed
Example:
 DECLARE
 CURSOR cur1 is SELECT address,salary,emp_no,emp_name FROM emp WHERE region=’US’;
 ………………………………
 BEGIN
 ………………………………
 END;

Een cursor openen

Hier wordt het parseren en uitvoeren van query's uitgevoerd. Na het openen van de cursor zijn de rijen die door de query worden geretourneerd, beschikbaar om te worden opgehaald.

Syntax:
 Open <cursor name>
 This statement is used within the executable section of the block.
 It also establishes an active set of the rows
Example:
  OPEN cur1;
 DECLARE
 v_salary number;
 CURSOR cur1 is SELECT salary FROM emp WHERE region=’US’;
 BEGIN
 OPEN cur1;
 LOOP
 FETCH cur1 into v_salary;
 EXIT WHEN cur1%NOTFOUND;
 DBMS_OUTPUT.PUT_LINE (v_salary);
 END LOOP;
 CLOSE cur1;
 END;
 /

De cursor wijst nu naar de eerste rij in de actieve set.

De rijen ophalen

Nadat de cursor is geopend, wordt de huidige rij in variabelen geladen. De huidige rij is de rij waarnaar de cursor momenteel wijst Het ophalen van gegevens in PL/SQL-variabele of host

De variabele wordt gedaan via de FETCH-instructie

Syntax: 
 FETCH  INTO ;
  • Voor elke kolomwaarde die wordt geretourneerd door de query die is gekoppeld aan de cursor, moet er een
  • . zijn

overeenkomstige variabele in de INTO-lijst.

  • OOK hun datatypes moeten compatibel zijn

EEN CURSOR SLUITEN

Het sluit expliciet de cursor, zodat deze indien nodig opnieuw kan worden geopend.

Syntax:
 CLOSE <cursor-name>;
Example: 
 CLOSE cur1
Example of Using CLOSE <Cursor Name>
 DECLARE
 v_address emp.address%TYPE;
 CURSOR cur1 is select address from emp;
 BEGIN
 OPEN cur1;
 LOOP
 FETCH cur1 into v_address;
 EXIT WHEN cur1%NOTFOUND;
 DBMS_OUTPUT.PUT_LINE(v_address);
 END LOOP;
 CLOSE cur1;
 END;
 /

Expliciete cursorkenmerken

Kenmerk Type Beschrijving
%ISOPEN Booleaans Evalueert naar TRUE als de cursor open is
%NOTFOUND Booleaans Evalueert naar TRUE als de meest recente fetch geen rij retourneert
%FOUND Booleaans Evalueert naar TRUE als de meest recente fetch een rij retourneert
%ROWCOUNT NUMBER Evalueert tot het totale aantal tot nu toe geretourneerde rijen

Geavanceerd concept met Oracle-cursor

Oracle-cursor en records

1)We hebben al gelezen over PLSQL-records.

2) We kunnen de rijen van de actieve set verwerken door waarden ook op te halen in een PL/SQL-record

3) We kunnen ook een plsql-record definiëren op basis van de geselecteerde lijst met kolommen in de expliciete cursors ook

Voorbeeld

DECLARE 
 CURSOR dept_cursor is Select deptno,dept_name  FROM   dept;
 dept_record dept_cursor%rowtype;
 BEGIN
 OPEN dept_cursor;
 LOOP
 FETCH dept_cursor INTO dept_record;
 Insert into dept_temp (deptno, deptname) values (dept_record.deptno, dept_record.dept_name);
 EXIT WHEN dept_cursor%notfound;
 END LOOP;
 Commit;
 CLOSE dept_cursor;
 END;
 /

Cursor met parameters/geparametriseerde cursor in orakel

Syntax: 
 CURSOR cursor_name(parameter_name datatype,  )
 IS
 Select_statement;

1) Geef parameterwaarden door aan een cursor wanneer de cursor wordt geopend en de query wordt uitgevoerd

2) Open meerdere keren een expliciete cursor met elke keer verschillende actieve sets

Open cursor_name(parameter_value , ……);

Voorbeeld

DECLARE 
 CURSOR cur1(v_deptno number) is
 Select deptname,dept_loc,dept_pincode from dept where deptno=v_deptno;
 Dept_record      cur1%rowtype;
 l_deptno  number:=111;
 BEGIN
 OPEN  cur1(112);
 LOOP
 FETCH cur1 into dept_record;
 IF cur1%FOUND THEN
 Dbms_output.put_line(dept_record.deptname);
 ELSE
 Exit;
 END IF;
 END LOOP;
 CLOSE cur1;
 OPEN cur1(l_deptno);
 LOOP
 FETCH cur1 into dept_record;
 IF cur1%FOUND THEN
 Dbms_output.put_line(dept_record.deptname);
 ELSE
 Exit;
 END IF;
 END LOOP;
 CLOSE cur1;
 END;
 /

 Gerelateerde artikelen

Hoe te werken met datum in Oracle sql
Oracle PLSQL-tabellen
Alles over Oracle PLSQL-records
Meest gestelde 25 oracle plsql-interviewvragen
Oracle PLSQL-blokstructuur en Oracle PLSQL-variabele
Cursorattributen


  1. Group_concat Het equivalent van de MySQL-functie in Oracle

  2. SQL Row_Number() functie in Where-clausule

  3. Spotlight Cloud-ondersteuning voor Azure SQL DB-aankondiging (preview)

  4. Hoe de bindValue-methode toe te passen in de LIMIT-clausule?