2010-12-14 12 views
0

Ich muss eine gespeicherte Prozedur schreiben, wo Sie den Monat angeben, und eine Kreditkartennummer, und es berechnet 1% für jede Transaktion in den ersten 10 Tagen des Monats, 2% für Transaktionen zwischen 10 und 20, und 3% für Transaktionen über 20. Und ich muss Cursor verwenden.Hilfe, gespeicherte Prozeduren und Cursor

ich diesen Code geschrieben, aber ich erhalte einige Fehler, wenn ich versuche, die 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 

, wenn ich das Verfahren i

EXEC cardP @minas = 5, erhalten rufen zu laufen @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 

Cursor Fetch: implizite Konvertierung von Datentyp dat etime to int ist nicht erlaubt.

danke :) ich jetzt die Zuordnung der Cursor am Ende der gespeicherten Prozedur und entfernt den Tag(). Jetzt möchte ich die pos + pos2 + pos3 ausdrucken. Ich benutze print pos + pos2 + pos3 aber es druckt nichts. Warum das ??

................ 
     set @[email protected]+1 
    end 
print @[email protected][email protected] 
close sinallages 



return 
DEALLOCATE sinallages; 

es scheint, wie hte Variablen po, pos2, pos3 null sind links ??

+1

Ich weiß, dies ist Hausaufgaben und Sie müssen den Cursor verwenden, aber Sie sollten verstehen, dass Cursor nicht etwas sind, das Sie normalerweise in Produktionscode schreiben möchten.Persönlich würde ich nicht in Erwägung ziehen, Cursor überhaupt zu unterrichten, außer in einer fortgeschrittenen Klasse von Leuten, die dbas sein wollen. Bitte überprüfen Sie diesen Link: http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them – HLGEM

+0

Ich möchte auch darauf hinweisen, dass Float eine schlechte Wahl ist, wenn Sie mathematische Genauigkeit wollen. Sie könnten dies zu Ihrem eigenen Lernzweck versuchen, indem Sie eine Fallanweisung anstelle eines Cursors neu schreiben. – HLGEM

Antwort

1

Ja, Sie müssen den Cursor nach dem Schließen freigeben. Wenn Ihre Anfrage vor dem Schließen des Cursors einen Fehler hatte, ist sie möglicherweise offen geblieben. Daher rate ich Ihnen, die Schritte CLOSE und DEALLOCATE auszuführen, bevor Sie die Prozedur erneut ausführen. Für Ihren zweiten Fehler verwenden Sie die Funktion DAY() über eine Variable vom Typ INT, ändern Sie if day(@mera)<=10 mit if @mera<=10. Update: Nun, da Sie die Probleme behoben haben, die Sie hatten, wenn Sie jede @pos Variable hinzufügen, folgt Ihrer Logik, eine von ihnen ist immer Null, also sollten Sie sie wie folgt hinzufügen: Print isnull (@ pos1,0) + isnull (@ pos2,0) + isnull (@ pos3,0)

+0

Vielen Dank für Ihre Hilfe :) – George

3

Andere haben die Verwendung von DEALLOCATE vorgeschlagen. Das Problem dabei ist, dass es in einigen Fehlersituationen nicht aufgerufen wird. Wenn Sie dann versuchen, dieselbe Verbindung zum Aufrufen dieses gespeicherten Procs zu verwenden, wird der Cursor weiterhin zugewiesen.

Ich würde stattdessen lieber declare the cursor as LOCAL, was bedeutet, es wird automatisch freigegeben, wenn der gespeicherte Proc beendet wird (ob normal oder nicht).