logo

Hvad er markør i SQL?

cursoren er en midlertidig hukommelse eller en midlertidig arbejdsstation. Det er tildelt af Database Server på tidspunktet for udførelse af DML (Data Manipulation Language) operationer på bordet af brugeren. Markører bruges til at gemme databasetabeller.

Der er 2 typer markører: implicitte markører og eksplicitte markører. Disse er forklaret som følgende nedenfor.



  1. Implicitte markører: Implicitte markører er også kendt som standardmarkører for SQL SERVER. Disse markører tildeles af SQL SERVER, når brugeren udfører DML-operationer.
  2. Eksplicitte markører: Eksplicitte markører oprettes af brugere, når brugeren har brug for dem. Eksplicitte markører bruges til at hente data fra tabel på række-for-række-måde.

Hvordan opretter man eksplicit markør?

  1. Erklærer markørobjekt

Syntaks:

DECLARE cursor_name CURSOR FOR SELECT * FRA tabelnavn

Forespørgsel:



DECLARE s1 CURSOR FOR SELECT * FROM studDetails>

2. Åbn markørforbindelse

typer af for loop

Syntaks:

OPEN cursor_connection



Forespørgsel:

OPEN s1>

Hent data fra markøren Der er i alt 6 metoder til at få adgang til data fra markøren. De er som følger:

  1. FØRST bruges til kun at hente den første række fra markørtabellen.
  2. SIDST bruges til kun at hente den sidste række fra markørtabellen.
  3. NÆSTE bruges til at hente data i en fremadgående retning fra markørtabellen.
  4. FORUD bruges til at hente data i en baglæns retning fra markørtabellen.
  5. ABSOLUT n bruges til at hente det nøjagtige nthrække fra markørtabellen.
  6. RELATIV n bruges til at hente dataene på en trinvis måde såvel som en dekrementel måde.

Syntaks:

FETCH NEXT/FIRST/LAST/PRIOR/ABSOLUTE n/RELATIVE n FRA cursor_name

Forespørgsel:

FETCH FIRST FROM s1 FETCH LAST FROM s1 FETCH NEXT FROM s1 FETCH PRIOR FROM s1 FETCH ABSOLUTE 7 FROM s1 FETCH RELATIVE -2 FROM s1>
  • Luk markørforbindelsen

Syntaks:

LUK cursor_name

Forespørgsel:

CLOSE s1>
  • Tildel markørhukommelse

Syntaks:

DEALLOCATE cursor_name

Forespørgsel:

DEALLOCATE s1>

Hvordan opretter man en implicit markør?

En implicit markør er en markør, der automatisk oprettes af PL/SQL, når du udfører en SQL-sætning. Du behøver ikke at erklære eller åbne en implicit markør eksplicit. I stedet styrer PL/SQL markøren for dig bag kulisserne.

For at oprette en implicit markør i PL/SQL skal du blot udføre en SQL-sætning. For at hente alle rækker fra EMP-tabellen kan du f.eks. bruge følgende kode:

Forespørgsel:

BEGIN FOR emp_rec IN SELECT * FROM emp LOOP DBMS_OUTPUT.PUT_LINE('Employee name: ' || emp_rec.ename); END LOOP; END;>

I PL/SQL, når vi optræder INDSÆT , OPDATERING eller SLET operationer, oprettes en implicit markør automatisk. Denne markør holder de data, der skal indsættes, eller identificerer de rækker, der skal opdateres eller slettes. Du kan henvise til denne markør som SQL-markøren i din kode. Denne SQL-markør har flere nyttige egenskaber.

  1. %FOUND er sand, hvis den seneste SQL-handling påvirkede mindst én række.
  2. %NOTFOUND er sandt, hvis det ikke påvirkede nogen rækker.
  3. %ROWCOUNT returnerer antallet af berørte rækker.
  4. %ISOPEN kontrollerer, om markøren er åben.

Ud over disse attributter er %BULK_ROWCOUNT og %BULK_EXCEPTIONS specifikke for FORALL-sætningen, som bruges til at udføre flere DML-operationer på én gang. %BULK_ROWCOUNT returnerer antallet af rækker, der er påvirket af hver DML-operation, mens %BULK_EXCEPTION returnerer enhver undtagelse, der opstod under operationerne.

Forespørgsel:

CREATE TABLE Emp( EmpID INT PRIMARY KEY, Name VARCHAR(50), Country VARCHAR(50), Age int(2), Salary int(10) ); -- Insert some sample data into the Customers table INSERT INTO Emp (EmpID, Name,Country, Age, Salary) VALUES (1, 'Shubham', 'India','23','30000'), (2, 'Aman ', 'Australia','21','45000'), (3, 'Naveen', 'Sri lanka','24','40000'), (4, 'Aditya', 'Austria','21','35000'), (5, 'Nishant', 'Spain','22','25000'); Select * from Emp;>

Produktion:

img1

Dette program opdaterer en tabel ved at øge lønnen for hver medarbejder med 1500. Efter opdateringen bruges SQL%ROWCOUNT-attributten til at finde ud af, hvor mange rækker der blev påvirket af operationen.

Forespørgsel:

DECLARE total_rows number; BEGIN UPDATE Emp SET Salary = Salary + 1500; total_rows := SQL%ROWCOUNT; dbms_output.put_line(total_rows || ' rows updated.'); END;>

Produktion:

5 Emp selected PL/SQL procedure successfully completed.>

SQL-markørundtagelser

Når vi udfører en SQL-forespørgsel, er der mulighed for en fejl, der er uventet. Markøren går gennem hvert sæt rækker for at returnere i en SQL-forespørgsel.

Der er nogle meget populære undtagelser:

  1. Dubletværdi: Denne type fejl opstår, når markøren forsøger at indsætte en post eller tuple, som allerede findes i databasen. disse typer fejl kan undgås ved at håndtere korrekt fejlkonf
  2. Ugyldig markørtilstand: Når markøren er i en ugyldig tilstand, vil denne type fejl blive vist som en fejl.
  3. Lås timeout: Dette sker, når markøren forsøger at opnå en lås på en række eller et bord, men låsen allerede er indeholdt af en anden transaktion.

Behov for markør i en SQL-server

  1. Markører giver os mulighed for at behandle data række for række, hvilket kan være nyttigt, når vi skal udføre komplekse beregninger eller transformationer på dataene.
  2. Markører giver os mulighed for at iterere over et resultatsæt flere gange, hvilket kan være nyttigt, når vi skal udføre flere operationer på de samme data.
  3. Markører kan være nyttige, når vi skal forbinde flere tabeller med komplekse relationer, såsom når vi behandler hierarkiske datastrukturer eller når vi udfører rekursive forespørgsler.
  4. Markører giver os mulighed for at udføre handlinger såsom opdatering, sletning eller indsættelse af poster baseret på nogle betingelser eller kriterier.
  5. Markører er især nyttige ved behandling af data fra flere tabeller, hvor relationerne ikke er ligetil.

SQL Server Cursor Begrænsninger

Da en markør har nogle begrænsninger, bør den kun bruges, når der ikke er andet valg. Disse begrænsninger omfatter:

  1. Når data behandles, pålægger det låse på en delmængde eller hele tabellen.
  2. Markøren opdaterer tabelposter en række ad gangen, hvilket sænker dens ydeevne.
  3. Selvom sløjfer er langsommere end markører, har de mere overhead.
  4. En anden faktor, der påvirker markørens hastighed, er antallet af rækker og kolonner, der bringes ind i markøren.

Ofte stillede spørgsmål:

Q.1 Hvordan kan markører undgås?

Svar:

Markørernes primære funktion er række-for-række tabelnavigation. Følgende er nogle enkle metoder til at undgå markører:

Q.2 Hvordan bruger man Mens Loop i SQL Cursor?

Svar:

Brug af en while-løkke, som muliggør indsættelse af et resultatsæt i den midlertidige tabel, er den enkleste måde at undgå behovet for en markør.

Q.3 Hvad er brugerdefinerede funktioner i SQL Cursor?

Svar:

Nogle gange beregnes det resulterende rækkesæt ved hjælp af markører. Det kan vi opnå ved at anvende en brugerdefineret funktion, der overholder specifikationerne.

Q.4 Brug af Joins med SQL Cursor?

Svar:

I tilfælde, hvor store poster skal behandles, reducerer join antallet af kodelinjer ved kun at behandle de kolonner, der opfylder den angivne betingelse.