2
votes

Utilisation du crédit de débit à procédure stockée

J'essaie d'effectuer un débit et un crédit en utilisant des procédures stockées et de mettre à jour les soldes de compte.

Mon code SQL ressemble à ceci

EXEC DebitCr
@AccountNumber1 = '0023889098',
@AccountNumber2 = '0023889133',
@balance = 165000,
@amount = 15000

Maintenant, pour exécuter la procédure stockée, je fais ceci:

ALTER PROCEDURE DebitCr

@AccountNumber1 varchar(50) = null,
@AccountNumber2 varchar(50) = null,
@balance money = null, 
@amount money = null

AS 
BEGIN

SET NOCOUNT ON;

UPDATE account_Balances SET @balance = @balance - @amount WHERE @AccountNumber1 = @AccountNumber1
UPDATE account_Balances SET @balance = @balance + @amount WHERE @AccountNumber2 = @AccountNumber2

END
GO

Pour certaines raisons pour lesquelles il ne met pas à jour efficacement les soldes de compte, qu'est-ce que j'ai mal compris?


3 commentaires

Vous avez besoin de COALEACE (@balance, 0), COALESCE (@amount, 0) avant de faire quoi que ce soit.


Arrêtez-vous et réfléchissez d'abord. Il n'y a aucune raison - ZERO - pour votre procédure d'accepter une valeur de paramètre nulle. Au contraire, votre procédure doit rejeter les valeurs nulles soit directement, soit via des contraintes sur la table affectée. N'encouragez pas le codage paresseux et ne cachez pas les erreurs des utilisateurs de procédures qui ne fournissent pas les informations correctes.


@SMor, en fait, j'ai commencé à apprendre les procédures stockées aujourd'hui. alors merci encore une fois.


4 Réponses :


0
votes

Vous devez changer le paramètre en nom de colonne comme indiqué ci-dessous dans l'instruction de mise à jour.

UPDATE account_Balances SET balance = ISNULL(@balance, 0) - ISNULL(@amount,0) WHERE AccountNumber1 = @AccountNumber1
UPDATE account_Balances SET balance = ISNULL(@balance, 0) + ISNULL(@amount,0) WHERE AccountNumber2 = @AccountNumber2

Pour gérer la valeur null , vous pouvez utiliser ISNULL code>.


0 commentaires

1
votes

Les valeurs

NULL causent les problèmes:

UPDATE account_Balances 
       SET balance = COALESCE(@balance, 0) - COALESCE(@amount, 0)
WHERE AccountNumber1 = @AccountNumber1

UPDATE account_Balances 
       SET balance = COALESCE(@balance, 0) + COALESCE(@amount, 0) 
WHERE AccountNumber2 = @AccountNumber2


0 commentaires

1
votes

Je ne comprends pas pourquoi vous transmettez le solde à la procédure stockée. Il est stocké dans la table. Je pense que le montant est la seule chose nécessaire:

ALTER PROCEDURE DebitCr (
    @AccountNumber1 varchar(50) = null,
    @AccountNumber2 varchar(50) = null,
    @amount money = null

) AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE account_Balances
        SET balance = COALESCE(balance, 0) - COALESCE(@amount, 0)
        WHERE AccountNumber = @AccountNumber1;

    UPDATE account_Balances
        SET balance = COALESCE(balance, 0) + COALESCE(@amount, 0)
        WHERE AccountNumber = @AccountNumber2;
END;
GO

Cela dit, vous voudrez probablement réfléchir à la façon de rendre la procédure "sûre". Voici quelques idées:

  • Effectuez les mises à jour dans une seule instruction ou encapsulez-les dans une transaction afin qu'elles prennent effet "en même temps".
  • Vérifiez que les deux comptes sont valides avant de modifier les valeurs.
  • Vérifiez que le premier compte dispose d'un solde suffisamment important avant de modifier les valeurs.

D'autres contrôles peuvent également être nécessaires, en fonction des besoins réels de l'entreprise.


3 commentaires

Je pense que la condition où est WHERE '@ AccountNumber1' = @ AccountNumber1 '; le côté gauche doit être AccountNumber1 et non "@ AccountNumber1".


Ne soustrait pas le débit et le crédit. Tout est toujours pareil


@SurajKumar. . . Je vous remercie!



1
votes

Ok merci pour la mise en garde. J'ai suivi ce que @Suraj Kumar et Gordon Linoff ont dit et sa déduction est bien maintenant. Merci à tous

Le code source SQL pour le crédit de débit est donné ainsi:

EXEC DebitCr
@AccountNumber1 = '0023889098',
@AccountNumber2 = '0023889133',
@amount = 15000

Maintenant, je fais quelque chose comme ceci:

ALTER PROCEDURE DebitCr (
    @AccountNumber1 varchar(50) = null,
    @AccountNumber2 varchar(50) = null,
    @amount money = null

) AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE account_Balances
        SET balance = COALESCE(balance, 0) - COALESCE(@amount, 0)
        WHERE AccountNumber = @AccountNumber1;

    UPDATE account_Balances
        SET balance = COALESCE(balance, 0) + COALESCE(@amount, 0)
        WHERE AccountNumber = @AccountNumber2;
END;
GO

Fonctionne bien, merci encore.


0 commentaires