CURSORS
Cursor is the location in memory where SQL Server tables are
stored.
If memory location is created by SQLServer then it is called
as implicit cursor. Select statement will uses implicit cursors and it will
show all records in the table at a time as a set
If memory location is created by programmer then it is called
as an explicit cursor, the tables stored in an explicit cursor is
accessed row by row.
Cursor Life Cycle:
Declare:
In declare section of T-SQL program we are define cursor using
following syntax
Declare cursor-name cursor for select statement
Ex:
DECLARE cursor_emp CURSOR
FOR
SELECT *
FROM emp
Open:
Whenever we are opening the cursor automatically records are
fetched from table and store it into cursor memory area
Fetch:
We are fetching records from cursor and store it into T-SQL
variables
Syn: Fetch from cursorname into variable name
Close:
It closes the an opened cursor
Close cursorname
Deallocate:
Removes the cursor structure
Deallocate cursorname
@@fetch_status:
Retuns the state of the last cursor fetch statement
Return Values Description
0 The fetch statement was successful.
-1
The fetch statement was failed or row was beyond
the result set.
-2
The row fetched is missing.
Next:
Returns the result row immediately following the current row and increments the
row to the row returned.
First:
Returns the first row in the cursor and makes it the current row.
Last:
Returns the last row in the cursor and makes it current row.
WAP Cursor program to print employee names and their salaries?
DECLARE empcur CURSOR FOR
ELECT ename,sal
FROM emp
DECLARE @ename VARCHAR(20),
@sal MONEY
OPEN empcur
FETCH next FROM empcur INTO @ename, @sal
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'salary of' + @ename + 'is'
+ Cast(@sal AS VARCHAR)
FETCH next FROM empcur INTO @ename, @sal
END
CLOSE empcur
DEALLOCATE empcur
WA cursor to display emplyee monthly salry using global
cursor
DECLARE empcur CURSOR global FOR
SELECT ename,
sal,
comm
FROM emp
DECLARE @ename VARCHAR(50),
@sal MONEY,
@comm MONEY,
@totalsal MONEY
OPEN empcur
FETCH next FROM empcur INTO @ename, @sal, @comm
WHILE @@FETCH_STATUS = 0
BEGIN
SET @totalsal =@sal + Isnull(@comm, 0)
PRINT @ename + 'Earns' + Cast(@totalsal AS VARCHAR)
+ 'everymonth'
FETCH next FROM empcur INTO @ename, @sal, @comm
END
CLOSE empcur
Note: whenever we declare global cursor no need
to deallocate it can be used for further program purpose
DECLARE @ename VARCHAR(50),
@sal MONEY,
@comm MONEY,
@annualsal MONEY
OPEN empcur
FETCH next FROM empcur INTO @ename, @sal, @comm
WHILE @@FETCH_STATUS = 0
BEGIN
SET @annualsal=( @sal + Isnull (@comm, 0) ) * 12
PRINT @ename + 'Earns'
+ Cast(@annualsal AS VARCHAR) + 'Every Year'
FETCH next FROM empcur INTO @ename, @sal, @comm
END
CLOSE empcur
Ex: Cursor
to fetch alternate rows from emp table
DECLARE emp_cur scroll CURSOR FOR
SELECT empno,
ename
FROM emp
OPEN emp_cur
DECLARE @empno INT,
@ename VARCHAR(40)
FETCH next FROM emp_cur INTO @empno, @ename
WHILE @@FETCH_STATUS !=- 1
BEGIN
PRINT Cast(@empno AS VARCHAR) + ' ' + @ename
FETCH relative 2 FROM emp_cur INTO @empno, @ename
END
DEALLOCATE emp_cur
Ex: Write a cursor program which takes
backup of all databases into d:\backups folder except system dbs
DECLARE backup_cur CURSOR FOR
SELECT NAME
FROM sysdatabases
WHERE NAME NOT IN( 'master', 'model', 'msdb', 'tempdb' )
DECLARE @filename VARCHAR(50),
@filepath VARCHAR(200)
DECLARE @dbname VARCHAR(50)
OPEN backup_cur
FETCH next FROM backup_cur INTO @dbname
WHILE @@fetch_status <>- 1
BEGIN
SET @filename=@dbname + '_' + CONVERT(VARCHAR, Getdate(), 112)
+ '.bak'
SET @filepath='d:\backups\' + @filename
BACKUP DATABASE @dbname TO DISK=@filepath
FETCH next FROM backup_cur INTO @dbname
END
DEALLOCATE backup_cur
Its very informative . Thanks for posting this Article :)
ReplyDeleteWelcome.
ReplyDelete