2017-10-13 11 views
0

J'ai créé une procédure stockée dans Oracle - voir ci-dessousOracle avec le paramètre de procédure stockée dans le numéro

create or replace PROCEDURE REMOVE_CUSTOMER 
 
(
 
    cus_id IN NUMBER 
 
) 
 
AS 
 
BEGIN 
 
    DELETE FROM CUSTOMER WHERE CUSTOMER.CUS_ID = cus_id; 
 
END;

J'exécutaient comme ci-dessous.

DECLARE 
 
    CUS_ID NUMBER; 
 
BEGIN 
 
    CUS_ID := 192981; 
 
    REMOVE_CUSTOMER(CUS_ID => CUS_ID); 
 
END;

Il suppose de supprimer le client 192981 uniquement. Cependant, tous les clients de la table ont été supprimés. Quelqu'un peut-il me dire ce qui n'allait pas avec le pl/sql?

Répondre

1

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).