Cursore è una memoria temporanea o una stazione di lavoro temporanea. È assegnato da Banca dati Server al momento dell'esecuzione di operazioni DML (Data Manipulation Language) sulla tabella da parte dell'utente. I cursori vengono utilizzati per memorizzare le tabelle del database.
Esistono 2 tipi di cursori: cursori impliciti e cursori espliciti. Questi sono spiegati come segue.
- Cursori impliciti: I cursori impliciti sono noti anche come cursori predefiniti di SQL SERVER. Questi cursori vengono allocati da SQL SERVER quando l'utente esegue operazioni DML.
- Cursori espliciti: I cursori espliciti vengono creati dagli utenti ogni volta che l'utente li richiede. I cursori espliciti vengono utilizzati per recuperare i dati dalla tabella in modo riga per riga.
Come creare un cursore esplicito?
- Dichiarare l'oggetto cursore
Sintassi:
DECLARE nome_cursore CURSOR FOR SELECT * FROM nome_tabella
Domanda:
DECLARE s1 CURSOR FOR SELECT * FROM studDetails>
2. Apri connessione cursore
data e ora del dattiloscritto
Sintassi:
APRI connessione_cursore
Domanda:
OPEN s1>
Recupera i dati dal cursore Esistono 6 metodi in totale per accedere ai dati dal cursore. Sono i seguenti:
- PRIMO viene utilizzato per recuperare solo la prima riga dalla tabella dei cursori.
- SCORSO viene utilizzato per recuperare solo l'ultima riga dalla tabella dei cursori.
- PROSSIMO viene utilizzato per recuperare i dati in una direzione in avanti dalla tabella del cursore.
- PRIMA viene utilizzato per recuperare i dati in una direzione all'indietro dalla tabella del cursore.
- ASSOLUTO n viene utilizzato per recuperare il n esattothriga dalla tabella del cursore.
- PARENTE n viene utilizzato per recuperare i dati in modo incrementale e decrementale.
Sintassi:
FETCH NEXT/FIRST/LAST/PRIOR/ABSOLUTE n/RELATIVE n FROM nome_cursore
Domanda:
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>
- Chiudi la connessione del cursore
Sintassi:
CHIUDI nome_cursore
Domanda:
CLOSE s1>
- Deallocare la memoria del cursore
Sintassi:
DEALLOCATE nome_cursore
Domanda:
DEALLOCATE s1>
Come creare un cursore implicito?
Un cursore implicito è un cursore creato automaticamente da PL/SQL quando si esegue un'istruzione SQL. Non è necessario dichiarare o aprire esplicitamente un cursore implicito. Invece, PL/SQL gestisce il cursore per te dietro le quinte.
Per creare un cursore implicito in PL/SQL, è sufficiente eseguire un'istruzione SQL. Ad esempio, per recuperare tutte le righe dalla tabella EMP, puoi utilizzare il seguente codice:
Domanda:
BEGIN FOR emp_rec IN SELECT * FROM emp LOOP DBMS_OUTPUT.PUT_LINE('Employee name: ' || emp_rec.ename); END LOOP; END;> In PL/SQL, quando eseguiamo INSERIRE , AGGIORNAMENTO O ELIMINARE operazioni, viene creato automaticamente un cursore implicito. Questo cursore contiene i dati da inserire oppure identifica le righe da aggiornare o eliminare. Puoi fare riferimento a questo cursore come cursore SQL nel tuo codice. Questo cursore SQL ha diversi attributi utili.
- %FOUND è vero se l'operazione SQL più recente ha interessato almeno una riga.
- %NOTFOUND è vero se non ha interessato alcuna riga.
- %ROWCOUNT restituisce il numero di righe interessate.
- %ISOPEN controlla se il cursore è aperto.
Oltre a questi attributi, %BULK_ROWCOUNT e %BULK_EXCEPTIONS sono specifici dell'istruzione FORALL, utilizzata per eseguire più operazioni DML contemporaneamente. %BULK_ROWCOUNT restituisce il numero di righe interessate da ciascuna operazione DML, mentre %BULK_EXCEPTION restituisce qualsiasi eccezione che si è verificata durante le operazioni.
Domanda:
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;>
Produzione:
Questo programma aggiorna una tabella aumentando lo stipendio di ciascun dipendente di 1500. Dopo l'aggiornamento, l'attributo SQL%ROWCOUNT viene utilizzato per scoprire quante righe sono state interessate dall'operazione.
Domanda:
DECLARE total_rows number; BEGIN UPDATE Emp SET Salary = Salary + 1500; total_rows := SQL%ROWCOUNT; dbms_output.put_line(total_rows || ' rows updated.'); END;>
Produzione:
5 Emp selected PL/SQL procedure successfully completed.>
Eccezioni del cursore SQL
Ogni volta che eseguiamo una query SQL c'è la possibilità che si verifichi un errore inaspettato. Il cursore attraversa ogni serie di righe da restituire in una query SQL.
Ci sono alcune eccezioni molto popolari:
- Valore duplicato: Questo tipo di errore si verifica quando il cursore tenta di inserire un record o una tupla già esistente nel database. questi tipi di errori possono essere evitati gestendo la corretta configurazione degli errori
- Stato del cursore non valido: Ogni volta che il cursore si trova in uno stato non valido, questo tipo di errore verrà visualizzato come errore.
- Blocco Timeout: Ciò si verifica quando il cursore tenta di ottenere un blocco su una riga o tabella ma il blocco è già mantenuto da un'altra transazione.
Necessità del cursore in un server SQL
- I cursori ci consentono di elaborare i dati riga per riga, il che può essere utile quando dobbiamo eseguire calcoli o trasformazioni complessi sui dati.
- I cursori ci consentono di scorrere più volte un set di risultati, il che può essere utile quando dobbiamo eseguire più operazioni sugli stessi dati.
- I cursori possono essere utili quando dobbiamo unire più tabelle con relazioni complesse, come quando elaboriamo strutture di dati gerarchiche o quando eseguiamo query ricorsive.
- I cursori ci consentono di eseguire operazioni come l'aggiornamento, l'eliminazione o l'inserimento di record in base ad alcune condizioni o criteri.
- I cursori sono particolarmente utili quando si elaborano dati da più tabelle in cui le relazioni non sono semplici.
Limitazioni del cursore di SQL Server
Poiché il cursore presenta alcune limitazioni, dovrebbe essere utilizzato solo quando non c'è altra scelta. Queste restrizioni includono:
- Durante l'elaborazione dei dati, impone blocchi su un sottoinsieme o sull'intera tabella.
- Il cursore aggiorna la tabella registra una riga alla volta, il che ne rallenta le prestazioni.
- Anche se i loop sono più lenti dei cursori, hanno un sovraccarico maggiore.
- Un altro fattore che influenza la velocità del cursore è la quantità di righe e colonne portate nel cursore.
FAQ:
Q.1 Come si possono evitare i cursori?
Risposta:
La funzione principale dei cursori è la navigazione nella tabella riga per riga. Di seguito sono riportati alcuni semplici metodi per evitare i cursori:
Q.2 Come utilizzare il ciclo While nel cursore SQL?
Risposta:
L'utilizzo di un ciclo while, che consente l'inserimento di un set di risultati nella tabella temporanea, è il modo più semplice per evitare la necessità di un cursore.
Q.3 Che cosa sono le funzioni definite dall'utente nel cursore SQL?
Risposta:
A volte il set di righe risultante viene calcolato utilizzando i cursori. Possiamo raggiungere questo obiettivo utilizzando una funzione definita dall'utente che sia conforme alle specifiche.
Q.4 Utilizzo dei join con il cursore SQL?
Risposta:
Nei casi in cui è necessario elaborare record di grandi dimensioni, l'unione riduce il numero di righe di codice elaborando solo le colonne che soddisfano la condizione specificata.