logo

Hva er markør i SQL?

Markør er et midlertidig minne eller en midlertidig arbeidsstasjon. Den er tildelt av Database Server på tidspunktet for utførelse av DML (Data Manipulation Language)-operasjoner på bordet av brukeren. Markører brukes til å lagre databasetabeller.

Det er 2 typer markører: implisitte markører og eksplisitte markører. Disse er forklart som følger nedenfor.

  1. Implisitte markører: Implisitte markører er også kjent som standardmarkører for SQL SERVER. Disse markørene tildeles av SQL SERVER når brukeren utfører DML-operasjoner.
  2. Eksplisitte markører: Eksplisitte markører lages av brukere når brukeren krever dem. Eksplisitte markører brukes for å hente data fra tabell på rad-for-rad-måte.

Hvordan lage eksplisitt markør?

  1. Angi markørobjekt

Syntaks:



DECLARE cursor_name MARKØR FOR SELECT * FRA tabellnavn

Spørsmål:

DECLARE s1 CURSOR FOR SELECT * FROM studDetails>

2. Åpne markørtilkobling

fineste smilet i verden

Syntaks:

OPEN cursor_connection

Spørsmål:

OPEN s1>

Hent data fra markøren Det er totalt 6 metoder for å få tilgang til data fra markøren. De er som følger:

  1. FØRST brukes til å hente kun den første raden fra markørtabellen.
  2. SISTE brukes til å hente bare den siste raden fra markørtabellen.
  3. NESTE brukes til å hente data i retning fremover fra markørtabellen.
  4. I FORKANT brukes til å hente data bakover fra markørtabellen.
  5. ABSOLUTT n brukes til å hente den nøyaktige nthrad fra markørtabellen.
  6. RELATIV n brukes til å hente dataene på en inkrementell måte så vel som en dekrementell måte.

Syntaks:

HENT NESTE/FØRSTE/SISTE/FØR/ABSOLUTT n/RELATIV n FRA cursor_name

Spørsmål:

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>
  • Lukk markørforbindelsen

Syntaks:

CLOSE cursor_name

Spørsmål:

CLOSE s1>
  • Tildel markørminne

Syntaks:

DEALLOCATE cursor_name

Spørsmål:

DEALLOCATE s1>

Hvordan lage en implisitt markør?

En implisitt markør er en markør som automatisk opprettes av PL/SQL når du utfører en SQL-setning. Du trenger ikke å deklarere eller åpne en implisitt markør eksplisitt. I stedet administrerer PL/SQL markøren for deg bak kulissene.

For å lage en implisitt markør i PL/SQL, trenger du bare å utføre en SQL-setning. For eksempel, for å hente alle rader fra EMP-tabellen, kan du bruke følgende kode:

Spørsmål:

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 opptrer SETT INN , OPPDATER eller SLETT operasjoner, opprettes en implisitt markør automatisk. Denne markøren holder dataene som skal settes inn eller identifiserer radene som skal oppdateres eller slettes. Du kan referere til denne markøren som SQL-markøren i koden din. Denne SQL-markøren har flere nyttige attributter.

  1. %FOUND er sant hvis den siste SQL-operasjonen påvirket minst én rad.
  2. %NOTFOUND er sant hvis det ikke påvirket noen rader.
  3. %ROWCOUNT returnerer antall berørte rader.
  4. %ISOPEN sjekker om markøren er åpen.

I tillegg til disse attributtene er %BULK_ROWCOUNT og %BULK_EXCEPTIONS spesifikke for FORALL-setningen, som brukes til å utføre flere DML-operasjoner samtidig. %BULK_ROWCOUNT returnerer antall rader som er påvirket av hver DML-operasjon, mens %BULK_EXCEPTION returnerer ethvert unntak som oppstod under operasjonene.

Spørsmål:

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;>

Produksjon:

img1

Dette programmet oppdaterer en tabell ved å øke lønnen til hver ansatt med 1500. Etter oppdateringen brukes SQL%ROWCOUNT-attributtet for å finne ut hvor mange rader som ble påvirket av operasjonen.

Spørsmål:

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

Produksjon:

5 Emp selected PL/SQL procedure successfully completed.>

SQL-markørunntak

Hver gang vi utfører en SQL-spørring, er det mulighet for en feil som er uventet. Markøren går gjennom hvert sett med rader for å returnere i en SQL-spørring.

Det er noen veldig populære unntak:

  1. Duplikatverdi: Denne typen feil oppstår når markøren prøver å sette inn en post eller tuppel som allerede eksisterer i databasen. denne typen feil kan unngås ved å håndtere riktig feilkonf
  2. Ugyldig markørstatus: Når markøren er i en ugyldig tilstand, vil denne typen feil vises som en feil.
  3. Lås tidsavbrudd: Dette skjer når markøren prøver å få en lås på en rad eller tabell, men låsen er allerede holdt av en annen transaksjon.

Behov for markør i en SQL-server

  1. Markører lar oss behandle data rad for rad, noe som kan være nyttig når vi skal utføre komplekse beregninger eller transformasjoner på dataene.
  2. Markører lar oss iterere over et resultatsett flere ganger, noe som kan være nyttig når vi trenger å utføre flere operasjoner på samme data.
  3. Markører kan være nyttige når vi trenger å slå sammen flere tabeller med komplekse relasjoner, for eksempel når vi behandler hierarkiske datastrukturer eller når vi utfører rekursive spørringer.
  4. Markører lar oss utføre operasjoner som å oppdatere, slette eller sette inn poster basert på noen betingelse eller kriterier.
  5. Markører er spesielt nyttige når du behandler data fra flere tabeller der relasjonene ikke er enkle.

SQL Server-markørbegrensninger

Siden en markør har noen begrensninger, bør den kun brukes når det ikke er noe annet valg. Disse begrensningene inkluderer:

  1. Ved behandling av data pålegger den låser på en delmengde eller hele tabellen.
  2. Markøren oppdaterer tabellposter én rad om gangen, noe som reduserer ytelsen.
  3. Selv om løkker er tregere enn markører, har de mer overhead.
  4. En annen faktor som påvirker markørhastigheten er antallet rader og kolonner som bringes inn i markøren.

FAQ:

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

Svar:

Markørenes primære funksjon er rad-for-rad-tabellnavigering. Følgende er noen enkle metoder for å unngå markører:

Q.2 Hvordan bruke Mens Loop i SQL-markøren?

Svar:

Å bruke en while-løkke, som gjør det mulig å sette inn et resultatsett i den midlertidige tabellen, er den enkleste måten å unngå behovet for en markør.

Q.3 Hva er brukerdefinerte funksjoner i SQL Cursor?

Svar:

Noen ganger beregnes det resulterende radsettet ved hjelp av markører. Vi kan oppnå dette ved å bruke en brukerdefinert funksjon som samsvarer med spesifikasjonene.

Q.4 Bruk av Joins med SQL Cursor?

Svar:

I tilfeller der store poster må behandles, reduserer join antallet kodelinjer ved å behandle bare de kolonnene som oppfyller den angitte betingelsen.