2011-09-08 7 views
1

J'ai ce curseur dans une procédure dans un paquet:Oracle curseur de la procédure stockée retourne toujours zéro lignes

PROCEDURE CANCEL_INACTIVE(IN_DAYS_OLD NUMBER) 
IS 
    CURSOR inactive IS 
      SELECT * FROM MY_TABLE 
      WHERE STATUS_CHANGED_DATE <= TRUNC(SYSDATE-IN_DAYS_OLD) 
      AND CANCEL_CD IS NULL; 

    rec inactive%ROWTYPE; 

BEGIN 
    OPEN inactive; 
    LOOP 
      FETCH inactive INTO rec; 
      EXIT WHEN inactive%NOTFOUND; 

      -- do an update based on rec.id 
    END LOOP; 
END; 

END CANCEL_INACTIVE; 

Chaque fois que je test ou exécuter la procédure, inactive a toujours aucune ligne. Cependant, lorsque je mets la même requête EXACT dans une fenêtre SQL, j'obtiens les lignes que je recherche.

Que diable?

+1

Comment savez-vous que le curseur n'a pas de lignes? –

+0

avez-vous testé la requête avec exactement le même IN_DAYS_OLD? –

+0

J'ai couru la fonction à travers l'application qui la consomme et je ne voyais pas les effets de la fonction. J'ai ensuite vérifié cela en compilant en mode debug et en utilisant un script de test pour parcourir le code avec l'IDE que j'utilise. –

Répondre

6

Il est probable que vous testiez des données non-validées.

Ou: vous ne validez pas votre mise à jour basée sur rec.id.

Ou: votre mise à jour ne fait rien. (la clause where n'est satisfaite par aucune ligne de la table cible)

+1

Je suis tellement embarrassé. C'était des données non engagées ... –

Questions connexes