2014-05-11 1 views
2

J'ai des variables dans la procédure stockée a un comportement que je ne comprends pas, les variables à l'intérieur d'une boucle conservent la valeur de la boucle précédente !!Varriable conserve la valeur assignée précédente dans une boucle

Voici la procédure stockée

v_no = 3; 
v_counter = 1; 
is_special = 1; 

    while (:v_counter <= :v_no) do begin 

    if (:is_special = 1) then begin 

     select tmaster.axis, tdetail.dim_val 
     from tdetail 
     right outer join tmaster on (tdetail.sp_id = tmaster.sp_id) 
     where (tmaster.sp_id = 17) And (tdetail.pos = :v_counter) 
     into :v_axis, :v_dim_val; /* variable retain previous loop values */ 

     /* ..... more code here */ 

    end 

    end 

J'ai ici deux tables, tmaster comme une table maître et tdetail comme table détail. Lors de l'exécution de la seule déclaration Select dans le code ci-dessus avec v_counter = 1,2, et 3 devrait aboutir à

axis dim_val 
---------------- 
X  14 
null null 
X  14 

mais quand v_counter = 2 I get 'X' pour axis et 14 pour dim_val !!, comme un travail autour de I définir les deux variables à null dans le premier de chaque boucle directement après l'instruction while, mais pourquoi les variables :v_axis et :v_dim_val n'a pas été affecté à null lorsque v_counter = 2 et pourquoi ils conservent les valeurs de boucle précédentes ??

Répondre

1

Je suppose que vous n'avez pas d'enregistrement dans tdetailpos = 2, n'est-ce pas? Ainsi, le résultat de la requête select est un resultset vide, et non une ligne où tous les champs sont NULL. Comme il n'y a pas de lignes dans le jeu de résultats, il n'y a rien à assigner aux variables (:v_axis, :v_dim_val) et donc ils conservent leurs valeurs.

+0

Oh oui pas d'enregistrement où pos = 2, existe-t-il un moyen de retourner null? – Wel

+0

Oui, vous pouvez écrire une requête qui renvoie "null row" mais IMO le code serait beaucoup plus difficile à lire/comprendre alors. Mieux vaut juste initialiser les variables à 'NULL' avant' select', c'est facile à suivre ... – ain

+0

oui mais juste pour information à quoi devrait ressembler cette requête? – Wel

Questions connexes