Мне нужно написать хранимую процедуру, в которой вы указываете месяц, номер кредитной карты, и она вычисляет 1% для каждой транзакции, сделанной в первые 10 дней месяца, 2% для транзакции между 10 и 20 и 3% для транзакций выше 20. И я должен использовать курсоры.помощь, хранимые процедуры и курсоры
я писал этот код, но я получаю некоторые ошибки, когда я пытаюсь запустить precedure
create procedure cardP
/* month ex 1,3,5 etc*/
@minas int,
@cardNo bigint
as
/* creating the cursor*/
DECLARE sinallages CURSOR
FOR SELECT cc_number,day([DateTime]),charged_amount FROM transactions
where [email protected] and month([DateTime])[email protected]
/* declaring local variables*/
declare @poso int,@karta bigint,@mera int,@pos float,@pos2 float,@pos3 float,
@count int,@counter int
open sinallages
set @count=(select count(cc_number) from transactions where [email protected] and month([DateTime])[email protected])
/* get 1st row*/
fetch sinallages into @karta,@mera,@poso
while (/*@@sqlstatus != 2*/@counter<@count)
begin
if day(@mera)<=10
set @pos [email protected]+ @poso * 0.01
else
if day(@mera)>10 and day(@mera)<=20
set @pos2 [email protected]+ @poso * 0.02
else
if day(@mera) > 20
set @pos3 [email protected]+ @poso * 0.03
fetch sinallages into @karta,@mera,@poso
set @[email protected]+1
end
close sinallages
return
, когда я вызвать процедуру я получить
EXEC cardP @minas = 5, @cardNo = 4929569752542450
Msg 16915, Level 16, State 1, Procedure cardP, Line 20
A cursor with the name 'sinallages' already exists.
Msg 16922, Level 16, State 1, Procedure cardP, Line 31
Курсор Выборка: неявное преобразование из типа данных DAT etime to int не допускается.
спасибо :) i теперь освободите курсор в конце хранимой процедуры и удалили день(). Теперь я хочу напечатать pos + pos2 + pos3. Я использую print pos + pos2 + pos3, но он ничего не печатает. почему это ??
................
set @[email protected]+1
end
print @[email protected][email protected]
close sinallages
return
DEALLOCATE sinallages;
похоже, что hte переменные po, pos2, pos3 остаются нулевыми?
Я понимаю, что это домашняя работа, и вы должны использовать курсор, но вы должны понимать, что курсоры - это не то, что вы обычно хотите записать в производственный код.Лично я бы не стал рассматривать курсоры вообще, кроме как в продвинутом классе людей, которые намереваются быть dbas. Пожалуйста, ознакомьтесь с этой ссылкой: http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them – HLGEM
Я также хочу указать, что float является плохим выбором, если вы хотите получить математическую точность. Вы можете в своих собственных целях попытаться перезаписать это, используя оператор case вместо курсора. – HLGEM