1

Тема: Допоможіть з курсорами, будь-ласочка^^

Здорів. Завдання взагалі от таке.

Прихований текст

Не використовуючи операції MIN, MAX і AVG знайти мінімальне, максимальне й середнє значення поля на вибір таблиці Books. Послідовність дій, які необхідно виконати у процедурі:
o        оголосити необхідні змінні
o        створити курсор
o        відкрити курсор
o        зчитати перший запис із курсору
o        у циклі перебрати всі рядки з курсору для пошуку потрібного значення; умовою закінчення циклу буде перевірка на наявність рядків у наборі
o        вивести результати роботи процедури на екран
o        зарити курсор після використання
o        звільнити пам'ять з-під курсору

А от мій недокід

BEGIN
declare @min numeric(18,0);
declare @max numeric(18,0);
declare @avg numeric(18,0);   
declare @tmp numeric(18,0);

set @min=10000;
set @max=-10000;
set @avg=0;

declare my_cursor cursor
for select price from Books;

OPEN my_cursor

fetch next from my_cursor into @tmp;

while @@fetch_status=0
BEGIN

    if @tmp>@max
    begin
    set @max=@tmp;
    end
select @max;
end
close my_cursor;
deallocate my_cursor;
select @max;
END

Проблема виникла з зупинкою цикла, я не знаю, як перевірити наявність рядків у наборі, тому подивився приклади на МСДН і зробив так, як там написано

while @@fetch_status=0

але воно не спрацьовує, мій цикл, чомусь, працює вічно, аж 100 разів значить працює, потім автоматично вимикається. В чому проблема? Що не так? Чому @@fetch_status завжди повертає 0, якщо він мав би повернути -1, як тільки вийшов за межі отриманої таблички?

2 Востаннє редагувалося koala (23.10.2013 20:28:25)

Re: Допоможіть з курсорами, будь-ласочка^^

Внесіть

fetch next from my_cursor into @tmp;

в цикл, і буде вам щастя.
Крім того, не раджу ставити перше значення максимуму маленьким, а ставити його першим зі значень.

Подякували: FakiNyan1

3

Re: Допоможіть з курсорами, будь-ласочка^^

koala написав:

Внесіть

fetch next from my_cursor into @tmp;

в цикл, і буде вам щастя.
Крім того, не раджу ставити перше значення максимуму маленьким, а ставити його першим зі значень.

а як то зробити?

4

Re: Допоможіть з курсорами, будь-ласочка^^

Перше - за допомогою технології Copy-Paste. Друге - робите

set @max=@tmp;
Подякували: FakiNyan1

5 Востаннє редагувалося FakiNyan (23.10.2013 22:44:39)

Re: Допоможіть з курсорами, будь-ласочка^^

koala написав:

Перше - за допомогою технології Copy-Paste. Друге - робите

set @max=@tmp;

і це робити в циклі??? в мене ж спочатку ці змінні не мають ніякого значення, я, звичайно, відразу подумав, що краще присвоїти змінній max значення, котре є в тій таблиці, але як його присвоїти я хз.
Якщо в циклі робити, то все втрачає сенс, тому що в циклі я маю перевіряти, чи змінна tmp більша за змінну max, а як по іншому те зробити?... ну я зара погуглю, як взяти перше значення якогось поля якоїсь таблички.
аааа, я зрозумів, от я довбень хД треба зробити fetch не в циклі, і після цього присвоїти значення, а потім вже робити в циклі хД
upd: от дописав все, як вам??

BEGIN
declare @min numeric(18,0);
declare @max numeric(18,0);
declare @avg numeric(18,0);   
declare @tmp numeric(18,0);
declare @cnt numeric(18,0);
declare @sum numeric(18,0);

declare my_cursor cursor
for select price from Books;

OPEN my_cursor

fetch next from my_cursor into @tmp;

set @max=@tmp;
set @min=@tmp;
set @avg=@tmp;
set @cnt=1;
set @sum=@tmp;

while @@fetch_status=0
BEGIN
fetch next from my_cursor into @tmp;
    if @tmp>@max
    begin
    set @max=@tmp;
    end
    if @tmp<@min
    begin
    set @min=@tmp;
    end
    set @cnt=@cnt+1;
    set @sum=@sum+@tmp;
end
close my_cursor;
deallocate my_cursor;
set @avg = @sum/@cnt;
print 'max ='+STR(@max);
print 'min ='+STR(@min);
print 'avg ='+STR(@avg);
END

6

Re: Допоможіть з курсорами, будь-ласочка^^

Яка різниця, як воно мені - головне, як воно вам...
Хоча одна дрібничка непокоїть - а як бути, якщо в таблиці немає записів?

7

Re: Допоможіть з курсорами, будь-ласочка^^

koala написав:

Яка різниця, як воно мені - головне, як воно вам...
Хоча одна дрібничка непокоїть - а як бути, якщо в таблиці немає записів?

ну воно не виконається, фетч статус буде -1 і цикл не виконається

8

Re: Допоможіть з курсорами, будь-ласочка^^

Ну то цикл не виконається, а що піде в @max?

9

Re: Допоможіть з курсорами, будь-ласочка^^

koala написав:

Ну то цикл не виконається, а що піде в @max?

нічо, я вже перевірив, там просто пуста стрічка

10

Re: Допоможіть з курсорами, будь-ласочка^^

Якщо це вас влаштовує... Good for you!

11

Re: Допоможіть з курсорами, будь-ласочка^^

koala написав:

Якщо це вас влаштовує... Good for you!

причому тут мене влаштовує. В завданні нічого про це не сказано. Так що все ок.