Una cosa molto banale, dichiarare ed usare un cursore in una store procedure in Transact-SQL:
Supponiamo di avere una tabella con tre campi: (ID, CAMPO1, CAMPO2)
DECLARE @ID INTEGER
DECLARE @CAMPO1 VARCHAR(10)
DECLARE @CAMPO2 VARCHAR(10)
DECLARE c_curs CURSOR FOR
select * from tabella
OPEN c_curs
FETCH NEXT FROM c_curs
INTO @ID, @CAMPO1, @CAMPO2
WHILE @@FETCH_STATUS = 0
BEGIN
-- Faccio qualche cosa con i record della tabella
-- Passo al record successivo
FETCH NEXT FROM c_curs
INTO @ID, @CAMPO1, @CAMPO2
END
CLOSE c_curs
DEALLOCATE c_curs
La documentazione di mamma Microsoft: http://msdn.microsoft.com/it-it/library/ms180169(SQL.90).aspx
Ecco un esempio della store procedure sp_cursor_list, che restituisce tutte le informazioni relative ai cursori allocati:
DECLARE C_PIPPO CURSOR KEYSET FOR SELECT * FROM VENDITE
OPEN C_PIPPO
DECLARE C_TOPOLINO CURSOR STATIC FOR SELECT * FROM VENDITE
OPEN C_TOPOLINO
DECLARE C_PAPERINO CURSOR DYNAMIC FOR SELECT * FROM VENDITE
OPEN C_PAPERINO
DECLARE C_PLUTO CURSOR FAST_FORWARD FOR SELECT * FROM VENDITE
OPEN C_PLUTO
DECLARE @CURSORI CURSOR
EXEC master.dbo.sp_cursor_list @cursor_return = @CURSORI OUTPUT, @cursor_scope = 2
FETCH NEXT from @CURSORI
WHILE (@@FETCH_STATUS <> -1)
BEGIN
FETCH NEXT from @CURSORI
END
CLOSE @CURSORI
DEALLOCATE @CURSORI
CLOSE C_PAPERINO
DEALLOCATE C_PAPERINO
CLOSE C_TOPOLINO
DEALLOCATE C_TOPOLINO
CLOSE C_PLUTO
DEALLOCATE C_PLUTO
CLOSE C_PIPPO
DEALLOCATE C_PIPPO
Il risultato:
| reference_name |
cursor_name |
cursor_scope |
status |
model |
concurrency |
scrollable |
| open_status |
cursor_row |
fetch_status |
column_count |
row_count |
last_operation |
cursor_handle |
| C_PIPPO |
C_PIPPO |
2 |
1 |
1 |
1 |
1 |
| 1 |
16 |
-9 |
4 |
0 |
1 |
180150003 |
| C_TOPOLINO |
C_TOPOLINO |
2 |
1 |
1 |
1 |
1 |
| 1 |
16 |
-9 |
4 |
0 |
1 |
180150005 |
| C_PAPERINO |
C_PAPERINO |
2 |
1 |
3 |
3 |
1 |
| 1 |
-1 |
-9 |
4 |
0 |
1 |
180150007 |
| C_PLUTO |
C_PLUTO |
2 |
1 |
4 |
1 |
0 |
| 1 |
-1 |
-9 |
4 |
0 |
1 |
180150009 |
Indica lo stato del cursore (aperto, chiuso, chissà ). Esempio:
SELECT 'STATO CURSORE INESISTENTE: ' + CONVERT(VARCHAR, CURSOR_STATUS('global','C_NICOLA'))
DECLARE C_NICOLA CURSOR KEYSET FOR SELECT * FROM VENDITE
SELECT 'STATO CURSORE ALLOCATO: ' + CONVERT(VARCHAR, CURSOR_STATUS('global','C_NICOLA'))
OPEN C_NICOLA
SELECT'STATO CURSORE APERTO: ' + CONVERT(VARCHAR, CURSOR_STATUS('global','C_NICOLA'))
CLOSE C_NICOLA
SELECT 'STATO CURSORE CHIUSO: ' + CONVERT(VARCHAR, CURSOR_STATUS('global','C_NICOLA'))
DEALLOCATE C_NICOLA
Risultato:
STATO CURSORE INESISTENTE: -3
STATO CURSORE ALLOCATO: -1
STATO CURSORE APERTO: 1
STATO CURSORE CHIUSO: -1
Mamma Microsoft: http://msdn.microsoft.com/en-us/library/ms177609.aspx