La déclaration dans la procédure:
DELETE FROM CUSTOMER WHERE CUSTOMER.CUS_ID = cus_id;
L'analyseur de requête doit identifier ce cus_id
est sur la droite. Si la table a une colonne de ce nom, c'est le premier choix. C'est pourquoi tout est supprimé. le RHS est interprété comme signifiant customer.cus_id
.
Si aucune colonne de ce type n'existe dans la table, la valeur seconde deviendrait une variable définie dans la procédure. Mais ce n'est que le deuxième choix, pas le premier.
La meilleure pratique consiste à utiliser des noms différents pour les variables de procédure, le préfixe peut-être le nom de la colonne avec p_
(pour le paramètre) ou i_
(pour l'entrée): p_cus_id
.
Vous pouvez utiliser le même nom pour votre variable de procédure, mais vous devez qualifier complètement dans l'instruction SQL:
where customer.cus_id = remove_customer.cus_id
En fait, vous n'avez pas besoin de se qualifier dans le gauche côté -hand ; cela fonctionnera:
where cus_id = remove_customer.cus_id
En revanche, ce que vous faites dans le bloc anonyme (lorsque vous appelez la procédure) ne pose pas de problème. Il est toujours une mauvaise pratique d'utiliser le nom de la colonne comme nom de la variable déclarée dans le bloc anonyme, mais lorsque vous appelez la procédure stockée du bloc anonyme, il ne peut y avoir de confusion quant à savoir quel CUS_ID est l'entrée de la mémoire stockée procédure; il ne peut pas s'agir d'un nom de colonne provenant d'une table et ne peut pas être la variable du SP (qui n'est "dans la portée" que dans le SP, elle n'est pas visible pour l'appelant - le bloc anonyme).