Markörer är databasobjekt som gör att du kan komma åt och manipulera data en rad åt gången från en resultatuppsättning som returneras av en SQL -fråga. Tänk på dem som pekare som navigerar genom raderna i en resultatuppsättning.
Här är en uppdelning av vad de är och varför de används:
Nyckelkoncept:
* Resultatuppsättning: En samling rader som returnerades av en SQL -fråga. När du kör ett "Select" -uttalande genererar databaseservern en resultatuppsättning.
* Row-by-Row-bearbetning: Markörer gör det möjligt för dig att hämta och bearbeta varje rad i resultatet som ställs in individuellt. Detta i motsats till standard SQL -operationer som vanligtvis fungerar på hela resultatet på en gång.
* pekare/iterator: En markör fungerar i huvudsak som en pekare eller iterator som håller reda på den aktuella raden. Du kan flytta markören framåt för att komma åt efterföljande rader.
Varför använda markörer?
Markörer används vanligtvis när du behöver utföra komplexa operationer på varje rad i en resultatuppsättning som är svåra eller omöjliga att uppnå med standard SQL -uttalanden. Vanliga scenarier inkluderar:
* Villkorliga uppdateringar/tar bort: Du kan behöva uppdatera eller ta bort en rad baserat på värden som finns i andra rader med samma resultatuppsättning eller i andra tabeller.
* Beräkningar baserade på tidigare rader: Du kan behöva beräkna ett totalt, rörligt medelvärde eller annat kumulativt värde som beror på värdena i föregående rader.
* Integrering med externa system: Du kan behöva hämta data från en databas och sedan använda dessa data för att interagera med externa applikationer eller API:er, bearbeta varje rad individuellt.
* Komplex logik inom lagrade procedurer: Markörer används ofta inom lagrade procedurer när du behöver implementera komplex affärslogik som kräver iterering genom en resultatuppsättning.
* Rapportering: Att generera anpassade rapporter eller utföra komplex dataformatering förlitar sig ofta på rad-för-radbehandling.
Hur markörer fungerar (förenklat):
1. Förklara markören: Du förklarar först en markör, som anger uttalandet "Select" som kommer att generera resultatet Set som markören kommer att arbeta med.
2. Öppna markören: Öppningen av markören kör uttalandet "Select" och skapar resultatuppsättningen. Markören är placerad före den första raden.
3. hämta rader: Du använder ett "hämta" -uttalande för att hämta data från den aktuella raden och flytta markören till nästa rad.
4. Process Data: Inuti en slinga bearbetar du data som hämtats från varje rad. Detta kan innebära att uppdatera andra tabeller, utföra beräkningar eller ringa externa procedurer.
5. Stäng markören: Efter att ha bearbetat alla rader stänger du markören och släpper resurserna den använde.
6. Dealocatera markören: Slutligen hanterar du markören.
Exempel (konceptuell - specifik syntax varierar beroende på databas):
`` `SQL
- förklara en markör
Förklara my_cursor -markören för
Välj Employee_ID, lön från anställda där avdelningen_id =10;
- Öppna markören
Öppna my_cursor;
- Hämta den första raden
Hämta nästa från my_cursor till @emp_id, @salary;
- slinga genom resultatuppsättningen
Medan @@ Fetch_status =0 - Kontrollera om hämtningen var framgångsrik
BÖRJA
- Behandla uppgifterna (exempel:höja lönen om under en tröskel)
Om @salary <50000
BÖRJA
Uppdatera anställda Ställ in lön =lön * 1.10 där anställd_id =@emp_id; - öka lönen med 10%
AVSLUTA;
- Hämta nästa rad
Hämta nästa från my_cursor till @emp_id, @salary;
AVSLUTA;
- Stäng markören
Stäng my_cursor;
- Dealocate the Cursor
Dealococate My_Cursor;
`` `
Viktiga överväganden och nackdelar:
* Prestandapåverkan: Markörer kan vara betydligt långsammare än SET-baserade SQL-operationer, särskilt när de hanterar stora resultatuppsättningar. Rad-för-rad-bearbetning är i sig mindre effektiv än att bearbeta data i satser. När det är möjligt, försök att uppnå önskat resultat med standard SQL -frågor.
* Komplexitet: Markörer kan göra din kod mer komplex och svårare att underhålla.
* låsningsproblem: Markörer kan hålla lås på databasresurser under längre perioder, vilket potentiellt kan leda till stridighet och prestandaproblem.
* Alternativ: Innan du tar till markörer ska du utforska alternativ som:
* Setbaserade SQL-operationer: Ofta kan du uppnå samma resultat med en smart SQL -fråga.
* lagrade procedurer med tillfälliga tabeller: Skapa en tillfällig tabell för att hålla mellanresultatuppsättningen och sedan utföra operationer på den tillfälliga tabellen.
* Använda applikationskod (t.ex. Python, Java) för att behandla data: Hämta hela resultatet i din applikation och utför rad-för-radbehandlingen där. Detta kan ibland vara mer effektivt än att använda markörer.
Sammanfattningsvis är markörerna ett kraftfullt men ofta mindre effektivt verktyg för rad-för-radbehandling i databaser. Använd dem endast när det är nödvändigt och överväg noggrant prestationskonsekvenserna. Sträva efter att använda setbaserade SQL-operationer när det är möjligt.