intro to tsql unit 13

Post on 14-Dec-2014

602 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

Introduction To SQLUnit 13

Modern Business Technology

Introduction To TSQLUnit 13

Developed by

Michael Hotek

Cursors

• A cursor is a name that is associated with a select statement

• SQL is a set oriented language which means that an operation is performed on all rows that meet a qualification

• Sometimes, due to business rules, you must process a result set one row at a time

• A cursor gives you this ability

Cursors

• Cursor consist of two parts– cursor result set - result set of the

associated select statement– cursor position - a pointer to the current

row in the result set

• A cursor allows a program to perform an action row by row on a result set instead of on the entire result set

• Provides the ability to delete or update a row based on cursor position

• Bridges the set orientation of an RDBMS and row oriented programming

Cursors

• There are four types of cursors– Language - declared in a batch– Server - declared in a stored procedure– Client - declared in an open client app– Execute - declared in an open client app

• Cursors are handled by SQL Server differently based on the type of cursor

• To the user, the effect of a cursor is the same regardless of type

Cursors

• There are five steps to using a cursor– Declare the cursor for the select

statement you are using– Open the cursor– Fetch each row into the cursor, repeating

until the entire result set has been processed

– Close the cursor– Deallocate the cursor to free up system

resources

Cursors

• The last step is generally forgotten by most developers. Make sure you deallocate any cursors when you have finished with them.

• A cursor is one of the most expensive operation that can be performed in terms of resource usage

• If a cursor is not deallocated, all of the resources that it used are still taken and are not available to any other processes

Declaring Cursors

declare cursor_name cursor for select_statement [for {read only | update [of column_list]}]

declare mycursor cursor for

select * from titles

for read only

• The declare cursor can be the only statement in a batch

• The cursor can have two modes– read only– for update

Declaring Cursors

• The cursor name must be a valid name

• The select statement can consist of any number of clauses

• The select– Must contain a from clause– Can not contain a compute, for browse,

or into– The column_list is the list of columns

defined as updateable

Declaring Cursors

• A cursor that is in read only mode does not allow deletes or updates

• For update is the default mode, but you should always explicitly state what mode the cursor is for

• Regardless of mode, the cursor will be placed in read only mde if the select statement contains– distinct– group by– aggregate functions– unions

Opening Cursors

• After declaring a cursor, the next step is to open the cursor

• Opening the cursor causes the select statement to be executed, make the result set available for processing, and positions the cursor pointer to the first row

declare mycursor cursor for

select * from titles

for read only

open mycursor

Fetching Rows

• Once the cursor is opened, you are ready to begin fetching rows

declare mycursor cursor for

select * from titles

for read only

open mycursor

fetch mycursor

• The cursor determines which row can be updated or deleted based on the cursor position

Fetching Rows

• When you fetch rows, there are two global variables that are important– @@rowcount– @@fetch_status (MS SQL Server)– @@sqlstatus (Sybase)

• As you fetch rows, the value in @@rowcount increases

Fetching Rows

• @@sqlstatus can have three values– 0 successful fetch– 1 error in fetch– 2 no more to fetch

• @@fetch_status can also have three values– 0 successful fetch– -1 error in fetch or no more rows– -2 fetched row doesn't exist

Fetching Rows

• To add to the flexibility, you can fetch the data into variables

fetch cursor_name [into fetch_list]

• The list of variables must match the column list in the select statement

declare @title_name varchar(80)

declare mycursor cursor for select title from titles for read only

open mycursor

fetch mycursor into @title_name

Close and Deallocate

• When you are done with the cursor, close and deallocate it

close cursor_name

deallocate cursor_name

declare mycursor cursor for select title from titles for read only

go

declare @title_name varchar(80)

open mycursor

fetch mycursor into @title_name

close mycursor

deallocate mycursor

Close and Deallocate

• SQL Server will close a cursor when you– exit the session– return from a stored procedure that

declared the cursor

• Do not rely on this to clean up your cursors

• You can reopen a cursor after it has been closed without declaring it again only if you do not deallocate it

open mycursor...

close mycursor

open mycursor…

close mycursor

deallocate mycursor

Example

--The below code will display business books at an 8% increase

declare @title_id char(6),

@type char(12),

@price money

--Declare cursor and perform initial fetch

declare curbooks cursor for select title_id, title, price from titles where type = ‘mod_cook’ for read only

open curbooks

fetch curbooks into @title_id, @type, @price

--Loop through all of the rows

while @@fetch_status = 0

begin

select @title_id, @type, convert(money,@price*1.08)

--Subsequent fetches

fetch curbooks into @title_id, @type, @price

end

close curbooks

deallocate curbooks

--The code below is equivalent to the cursor

select title_id, type, convert(money, price*1.08)

from titles

where type = ‘mod_cook’

Data Modification

• You can delete a row based on the cursor position

• Declare the cursor for update

declare mycursor … for update

open mycursor

fetch mycursor

delete … where current of mycursor

Data Modification

• For data modification based on cursor position, the table requires a unique index

• Even if a cursor is declared for update, you can not delete a row if the cursor's select statement contains a join clause or references a multi-table view

Data Modification

• You can also update data based on cursor position

declare mycursor … for update

open mycursor

fetch mycursor

update … where current of mycursor

Data Modification

• An update does not move the cursor position

• The same row can be updated more than once until the next fetch is performed

• You can update a multi-table view or joined tables only if the update is being performed on one table

Cautions

• Always specify for read only or for update

• Do not leave cursors open for a long time

• If the same operation is performed on every row in the result set, do not use a cursor

• Always close and deallocate your cursors

Unit 13 Review

• Cursor allow you to perform an operation one row at a time

• Cursors can have two modes:– for read only– for update

• The steps to using a cursor are:– declare– open– fetch– close– deallocate

• @@rowcount and @@sqlstatus or @@fetch_status will give you information about your fetch operations

• For more flexibility, you can fetch data into variables

• You can delete or update data by using the where current of cursor_name clause

• Always close and deallocate your cursors

Unit 13 Exercises

• Time allotted for exercises is 1/2 hour

top related