2010-12-14 4 views
0

Je dois écrire une procédure stockée, où vous donnez le mois, et un numéro de carte de crédit, et il calcule 1% pour chaque transaction effectuée dans les 10 premiers jours du mois, 2% pour transactions entre 10 et 20, et 3% pour les transactions supérieures à 20. Et je dois utiliser des curseurs.aide, procédures stockées et curseurs

j'ai écrit ce code, mais je reçois des erreurs lorsque je tente d'exécuter le 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 

quand j'appelle la procédure que je reçois

EXEC ACDRP @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 

extraction de curseur: conversion implicite de dat de type de données etime à int n'est pas autorisé. Merci :) Je libère maintenant le curseur à la fin de la procédure stockée et supprime le jour(). Maintenant, je veux imprimer le pos + pos2 + pos3. J'utilise print pos + pos2 + pos3 mais ça n'imprime rien. pourquoi donc ??

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



return 
DEALLOCATE sinallages; 

il semble que hte variables po, pos2, pos3 sont laissés nuls ??

+1

Je réalise que c'est un devoir et que vous devez utiliser le curseur, mais vous devez comprendre que les curseurs ne sont pas quelque chose que vous voudrez normalement écrire dans le code de production.Personnellement, je ne penserais pas du tout à enseigner des curseurs, sauf dans une classe avancée de personnes qui ont l'intention d'être des dbas. S'il vous plaît consulter ce lien: http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them – HLGEM

+0

Je tiens également à souligner que float est un mauvais choix si vous voulez une précision mathématique. Vous pourriez, pour votre propre apprentissage, essayer de réécrire ceci en utilisant une déclaration de cas au lieu d'un curseur. – HLGEM

Répondre

1

Oui, vous devez libérer le curseur après l'avoir fermé. En outre, si votre requête comportait une erreur avant de fermer le curseur, elle est peut-être restée ouverte. Je vous recommande donc d'exécuter le CLOSE et le DEALLOCATE avant d'exécuter à nouveau votre procédure. Pour votre deuxième erreur, vous utilisez la fonction DAY() sur une variable de type INT, modifiez if day(@mera)<=10 avec if @mera<=10. Mise à jour: Maintenant que vous avez corrigé les problèmes que vous avez rencontrés, lorsque vous ajoutez chaque variable @pos en suivant votre logique, l'un d'entre eux est toujours nul, vous devez donc les ajouter: Imprimer isnull (@ pos1,0) + isnull (@ pos2,0) + isnull (@ pos3,0)

+0

je vous remercie beaucoup de m'avoir aidé :) – George

3

D'autres ont suggéré d'utiliser DEALLOCATE. Le problème avec cela est que, dans certaines situations d'erreur, il ne sera pas appelé. Si vous essayez ensuite d'utiliser la même connexion pour appeler ce proc stocké, le curseur sera toujours alloué.

Je préférerais plutôt declare the cursor as LOCAL, ce qui signifie qu'il est automatiquement désaffecté lorsque le proc stocké est quitté (normalement ou non).