SQL Server/T-SQL/Cursor/Declare CURSOR
Cursor declaration syntax
DECLARE <cursor name> CURSOR
[LOCAL|GLOBAL]
[FORWARD_ONLY|SCROLL]
[STATIC|KEYSET|DYNAMIC|FAST_FORWARD]
[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
[TYPE_WARNING]
FOR <SELECT statement>
[FOR UPDATE [OF <column name >[,...n]]]
Declare a cursor
17> create table employee(
18> ID int,
19> name nvarchar (10),
20> salary int,
21> start_date datetime,
22> city nvarchar (10),
23> region char (1))
24> GO
1>
2> insert into employee (ID, name, salary, start_date, city, region)
3> values (1, "Jason", 40420, "02/01/94", "New York", "W")
4> GO
1> insert into employee (ID, name, salary, start_date, city, region)
2> values (2, "Robert",14420, "01/02/95", "Vancouver","N")
3> GO
1> insert into employee (ID, name, salary, start_date, city, region)
2> values (3, "Celia", 24020, "12/03/96", "Toronto", "W")
3> GO
1> insert into employee (ID, name, salary, start_date, city, region)
2> values (4, "Linda", 40620, "11/04/97", "New York", "N")
3> GO
1> insert into employee (ID, name, salary, start_date, city, region)
2> values (5, "David", 80026, "10/05/98", "Vancouver","W")
3> GO
1> insert into employee (ID, name, salary, start_date, city, region)
2> values (6, "James", 70060, "09/06/99", "Toronto", "N")
3> GO
1> insert into employee (ID, name, salary, start_date, city, region)
2> values (7, "Alison",90620, "08/07/00", "New York", "W")
3> GO
1> insert into employee (ID, name, salary, start_date, city, region)
2> values (8, "Chris", 26020, "07/08/01", "Vancouver","N")
3> GO
1> insert into employee (ID, name, salary, start_date, city, region)
2> values (9, "Mary", 60020, "06/09/02", "Toronto", "W")
3> GO
1>
2> select * from employee
3> GO
ID name salary start_date city region
----------- ---------- ----------- ----------------------- ---------- ------
1 Jason 40420 1994-02-01 00:00:00.000 New York W
2 Robert 14420 1995-01-02 00:00:00.000 Vancouver N
3 Celia 24020 1996-12-03 00:00:00.000 Toronto W
4 Linda 40620 1997-11-04 00:00:00.000 New York N
5 David 80026 1998-10-05 00:00:00.000 Vancouver W
6 James 70060 1999-09-06 00:00:00.000 Toronto N
7 Alison 90620 2000-08-07 00:00:00.000 New York W
8 Chris 26020 2001-07-08 00:00:00.000 Vancouver N
9 Mary 60020 2002-06-09 00:00:00.000 Toronto W
1>
2> DECLARE curEmployee INSENSITIVE CURSOR
3> FOR SELECT ID, Name FROM Employee
4> DECLARE @ID Int
5> DECLARE @Name VarChar(100)
6>
7> OPEN curEmployee
8> FETCH NEXT FROM curEmployee INTO @ID, @Name
9> WHILE @@Fetch_Status = 0
10> BEGIN
11> PRINT @Name
12> FETCH NEXT FROM curEmployee INTO @ID, @Name
13> END
14> CLOSE curEmployee
15>
16> DEALLOCATE curEmployee
17> GO
Jason
Robert
Celia
Linda
David
James
Alison
Chris
Mary
1>
2>
3> drop table employee
4> GO
1>
DECLARE CURSOR FOR
3> CREATE TABLE authors(
4> au_id varchar(11),
5> au_lname varchar(40) NOT NULL,
6> au_fname varchar(20) NOT NULL,
7> phone char(12) NOT NULL DEFAULT ("UNKNOWN"),
8> address varchar(40) NULL,
9> city varchar(20) NULL,
10> state char(2) NULL,
11> zip char(5) NULL,
12> contract bit NOT NULL
13> )
14> GO
1> insert authors values("1", "Joe", "Abra", "111 111-1111", "6 St.", "Berkeley", "CA", "11111", 1)
2> insert authors values("2", "Jack", "Majo", "222 222-2222", "3 St.", "Oakland" , "CA", "22222", 1)
3> insert authors values("3", "Pink", "Cherry", "333 333-3333", "5 Ln.", "Vancouver", "BC", "33333", 1)
4> insert authors values("4", "Blue", "Albert", "444 444-4444", "7 Av.", "Vancouver", "BC", "44444", 1)
5> insert authors values("5", "Red", "Anne", "555 555-5555", "6 Av.", "Regina", "SK", "55555", 1)
6> insert authors values("6", "Black", "Michel", "666 666-6666", "3 Pl.", "Regina", "SK", "66666", 1)
7> insert authors values("7", "White", "Sylvia", "777 777-7777", "1 Pl.", "Rockville", "MD", "77777", 1)
8> insert authors values("8", "Yellow","Heather","888 888-8888", "3 Pu", "Vacaville", "CA", "88888", 0)
9> insert authors values("9", "Gold", "Dep", "999 999-9999", "5 Av.", "Oakland", "CA", "99999", 0)
10> insert authors values("10", "Siler", "Dean", "000 000-0000", "4 Av.", "Oakland", "CA", "00000", 1)
11> GO
1>
2>
3>
4> CREATE TABLE titles(
5> title_id varchar(20),
6> title varchar(80) NOT NULL,
7> type char(12) NOT NULL,
8> pub_id char(4) NULL,
9> price money NULL,
10> advance money NULL,
11> royalty int NULL,
12> ytd_sales int NULL,
13> notes varchar(200) NULL,
14> pubdate datetime NOT NULL
15> )
16> GO
1>
2> insert titles values ("1", "Secrets", "popular_comp", "1389", $20.00, $8000.00, 10, 4095,"Note 1","06/12/94")
3> insert titles values ("2", "The", "business", "1389", $19.99, $5000.00, 10, 4095,"Note 2","06/12/91")
4> insert titles values ("3", "Emotional", "psychology", "0736", $7.99, $4000.00, 10, 3336,"Note 3","06/12/91")
5> insert titles values ("4", "Prolonged", "psychology", "0736", $19.99, $2000.00, 10, 4072,"Note 4","06/12/91")
6> insert titles values ("5", "With", "business", "1389", $11.95, $5000.00, 10, 3876,"Note 5","06/09/91")
7> insert titles values ("6", "Valley", "mod_cook", "0877", $19.99, $0.00, 12, 2032,"Note 6","06/09/91")
8> insert titles values ("7", "Any?", "trad_cook", "0877", $14.99, $8000.00, 10, 4095,"Note 7","06/12/91")
9> insert titles values ("8", "Fifty", "trad_cook", "0877", $11.95, $4000.00, 14, 1509,"Note 8","06/12/91")
10> GO
1>
2> CREATE TABLE titleauthor(
3> au_id varchar(20),
4> title_id varchar(20),
5> au_ord tinyint NULL,
6> royaltyper int NULL
7> )
8> GO
1>
2> insert titleauthor values("1", "2", 1, 60)
3> insert titleauthor values("2", "3", 1, 100)
4> insert titleauthor values("3", "4", 1, 100)
5> insert titleauthor values("4", "5", 1, 100)
6> insert titleauthor values("5", "6", 1, 100)
7> insert titleauthor values("6", "7", 2, 40)
8> insert titleauthor values("7", "8", 1, 100)
9> insert titleauthor values("8", "9", 1, 100)
10> GO
1>
2>
3> DECLARE @au_id char(11), @au_lname varchar(40), @title_id char(6),
4> @au_id2 char(11), @title_id2 char(6), @title varchar(80)
5>
6> DECLARE au_cursor CURSOR FOR
7> SELECT au_id, au_lname FROM authors ORDER BY au_id
8>
9> DECLARE au_titles CURSOR FOR
10> SELECT au_id, title_id FROM titleauthor ORDER BY au_id
11>
12> DECLARE titles_cursor CURSOR FOR
13> SELECT title_id, title FROM titles ORDER BY title
14>
15> OPEN au_cursor
16> FETCH NEXT FROM au_cursor INTO @au_id, @au_lname
17>
18> WHILE (@@FETCH_STATUS=0)
19> BEGIN
20> OPEN au_titles
21> FETCH NEXT FROM au_titles INTO @au_id2, @title_id
22>
23>
24> WHILE (@@FETCH_STATUS=0)
25> BEGIN
26>
27>
28> IF (@au_id=@au_id2)
29> BEGIN
30> OPEN titles_cursor
31> FETCH NEXT FROM titles_cursor INTO
32> @title_id2, @title
33>
34> WHILE (@@FETCH_STATUS=0)
35> BEGIN
36>
37> IF (@title_id=@title_id2)
38> SELECT @au_id, @au_lname, @title
39>
40> FETCH NEXT FROM titles_cursor INTO
41> @title_id2, @title
42> END
43> CLOSE titles_cursor
44> END
45> FETCH NEXT FROM au_titles INTO @au_id2, @title_id
46> END
47>
48> CLOSE au_titles
49> FETCH NEXT FROM au_cursor INTO @au_id, @au_lname
50> END
51> CLOSE au_cursor
52>
53> DEALLOCATE titles_cursor
54> DEALLOCATE au_titles
55> DEALLOCATE au_cursor
56> GO
----------- ---------------------------------------- --------------------------------------------------------------------------------
1 Joe The
----------- ---------------------------------------- --------------------------------------------------------------------------------
1 Joe The
----------- ---------------------------------------- --------------------------------------------------------------------------------
1 Joe The
----------- ---------------------------------------- --------------------------------------------------------------------------------
2 Jack Emotional
----------- ---------------------------------------- --------------------------------------------------------------------------------
2 Jack Emotional
----------- ---------------------------------------- --------------------------------------------------------------------------------
2 Jack Emotional
----------- ---------------------------------------- --------------------------------------------------------------------------------
3 Pink Prolonged
----------- ---------------------------------------- --------------------------------------------------------------------------------
3 Pink Prolonged
----------- ---------------------------------------- --------------------------------------------------------------------------------
3 Pink Prolonged
----------- ---------------------------------------- --------------------------------------------------------------------------------
4 Blue With
----------- ---------------------------------------- --------------------------------------------------------------------------------
4 Blue With
----------- ---------------------------------------- --------------------------------------------------------------------------------
4 Blue With
----------- ---------------------------------------- --------------------------------------------------------------------------------
5 Red Valley
----------- ---------------------------------------- --------------------------------------------------------------------------------
5 Red Valley
----------- ---------------------------------------- --------------------------------------------------------------------------------
5 Red Valley
----------- ---------------------------------------- --------------------------------------------------------------------------------
6 Black Any?
----------- ---------------------------------------- --------------------------------------------------------------------------------
6 Black Any?
----------- ---------------------------------------- --------------------------------------------------------------------------------
6 Black Any?
----------- ---------------------------------------- --------------------------------------------------------------------------------
7 White Fifty
----------- ---------------------------------------- --------------------------------------------------------------------------------
7 White Fifty
----------- ---------------------------------------- --------------------------------------------------------------------------------
7 White Fifty
1>