Je veux stocker un ensemble de résultats d'une requête dans un emplacement temporaire (entendu des curseurs), puis utilisez une boucle pour tester chaque colonne contre une valeur. J'ai essayé Je suis désolé si je vous ai confondu. Mon exigence est de vérifier si une colonne d'un ensemble d'enregistrements contient 0 si elle est nécessaire d'augmenter pour obtenir le nombre de lignes qui a 0 dans n'importe quelle colonne. Je peux faire la question, mais je vais devoir taper 200 colonnes et je cherche une alternative où je peux tester chaque enregistrement d'une requête SELECT pour vérifier si une colonne de n'importe quel enregistrement récupéré a 0. P> Désolé de ne pas poster correctement ma question. P> p>
4 Réponses :
Voici un modèle que je pense vous aidera:
DECLARE
cursor c1 is
select column1, column2 ... etc from mytable where column='20190103';
BEGIN
FOR r_rec in c1
LOOP
if r_rec.column_XYZ = something then
do_something;
end if;
END LOOP;
END;
Un curseur ne stocke pas les résultats, c'est vraiment un pointeur pour vous laisser itérair sur les résultats (comme @ted Shows in Action). Si vous souhaitez stocker les résultats dans votre bloc PL / SQL, vous pouvez utiliser une collection , que vous pouvez déclarer comme type correspondant à votre table à proximité de votre requête à une rangée dans un type d'enregistrement; et ensuite Bulk-Collect dans celui:
select count(*) from mytable where col1='20190103' and col2='Y'; -- whatever you need to test
Je suis désolé si je vous ai confondu. Mon exigence est de vérifier si une colonne d'un ensemble d'enregistrements contient 0 si elle est nécessaire d'augmenter pour obtenir le nombre de lignes qui a 0 dans n'importe quelle colonne. Je peux faire la question, mais je vais devoir taper 200 colonnes et je cherche une alternative où je peux tester chaque enregistrement d'une requête SELECT pour vérifier si une colonne de n'importe quel enregistrement récupéré a 0. Désolé de ne pas poster correctement ma question. .
Vous devez toujours taper tous les noms de colonne afin que vous puissiez les vérifier un par un à l'intérieur de la boucle. Ou vous pouvez utiliser dbms_sql code> pour automatiser cela, mais cela pourrait surcharger des choses. Avec une requête SQL SQL ou un bloc PL / SQL statique, vous pouvez générer la liste des colonnes via une requête sur le dictionnaire de données, pour vous enregistrer physiquement tous, si c'est votre seule objection. Mais vous devez toujours en quelque sorte identifier quelles colonnes à inclure - ou peut-être pour exclure, si c'est une liste plus courte.
Voici un moyen très simple de boucler via un résultat de requête:
J'ai modifié cette réponse de Rechercher tous Champs dans toutes les tables d'une valeur spécifique (Oracle)
à faire compter.
Il comptera des enregistrements pour chaque champ d'une table contenant 0.
Remplacez mon nom de table avec le vôtre. P>
Pourquoi n'utilisez-vous pas une instruction code> update code> avec un
où code> clause qui définit les lignes doit être mise à jour? Je ne comprends pas le besoin d'un curseur dans ce casSi vous testez une condition, pourquoi ne pas le faire dans le cadre de la requête au lieu d'une boucle? Que ferez-vous avec les lignes qui font et ne rencontrez pas la condition? Vous recherchez peut-être Collections , mais ce n'est pas clair ... Si vous comptez simplement le nombre de lignes correspondant à la condition, vous n'avez peut-être pas seulement besoin d'un simple nombre d'agrégats
(*) code>, ce qui n'a pas Il faut du tout à PL / SQL.