IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

lire une table une ligne à la fois


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut lire une table une ligne à la fois
    Bonjour

    J'ai une table X qui contient 10 enregistrements.

    J'aimerais lire la première ligne de la table X, faire un traitement, et après je lis la deuxième ligne, et faire le même traitement, ainsi de suite, jusqu'à ce que je lis les 10 lignes de cette table.

    Est-ce que vous avez des idées ?


    Merci d'avance.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    En SQL c'est impossible mais tu peux écrire une procédure stockée, ouvrir un curseur et là faire un traitement ligne à ligne.
    Attention ce genre de solution est généralement mauvaise notamment car elle plombe les perfs, mais bon pour 10 lignes on va dire que c'est ok.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 33
    Points
    33
    Par défaut
    Il me semble qu'avec oracle tu as un attribut "rownum" qui represente les numéros de ligne et tu peux faire un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select *
      from items
    where rownum = 6;

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    La condition directe sur le rownum ne fonctionnera pas.
    Le fait de ne vouloir selectionner qu'une ligne, celle dont le rownum est 6, fait que son rownum sera en fait égal à 1.
    Il faut passer par une sous-requete, sans oublier d'aliaser le rownum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select i.* from
    (
          select i.*, rownum as position from items i
    ) i
    where i.position = 6
    Ceci dit, il existe row_number, plus propice à ce genre de choses.

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Il faut passer par une sous-requete, sans oublier d'aliaser le rownum :
    Et ne pas oublier le ORDER BY dans la sous requête

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par Snipah Voir le message
    La condition directe sur le rownum ne fonctionnera pas.
    Le fait de ne vouloir selectionner qu'une ligne, celle dont le rownum est 6, fait que son rownum sera en fait égal à 1.
    Il faut passer par une sous-requete, sans oublier d'aliaser le rownum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select i.* from
    (
          select i.*, rownum as position from items i
    ) i
    where i.position = 6
    Ceci dit, il existe row_number, plus propice à ce genre de choses.
    POur faire sur, est-ce que i doit être changé par le nom de ma table ?

    si oui ca me donne une erreur sur items et aussi sur rownum

    Invalid column name 'rownum'
    Est-ce possible de me donner un exemple concret avec une table qui s'appelle TOTO et contient 10 lignes. avec la boucle correspondante
    For
    ou bien
    While
    .

    Merci.

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par DEV-10 Voir le message
    POur faire sur, est-ce que i doit être changé par le nom de ma table ?
    Non c'est items qui doit être remplacer par ta table.
    Citation Envoyé par DEV-10 Voir le message
    si oui ca me donne une erreur sur items et aussi sur rownum
    rownum c'est uniquement pour oracle.
    Citation Envoyé par DEV-10 Voir le message
    Est-ce possible de me donner un exemple concret avec une table qui s'appelle TOTO et contient 10 lignes. avec la boucle correspondante ou bien .
    Le procédural n'a rien de standard, la syntaxe dépend donc entièrement de l'éditeur.
    Le mieux serait donc de déplacer ton post dans une sous-section procédure du forum dédié à ton éditeur.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Peut être, si vous nous dites la nature de votre SGBD, s'il y a un ordre quelconque pour traiter les lignes, éventuellement quel traitement vous souhaitez faire. Un peu d'infos quoi

    Et ne pas oublier le ORDER BY dans la sous requête
    C'est sûr, c'est préférable pour que ça ait du sens, mais pas nécessaire niveau syntaxique

    EDIT : devancé

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Non c'est items qui doit être remplacer par ta table.

    rownum c'est uniquement pour oracle.

    Le procédural n'a rien de standard, la syntaxe dépend donc entièrement de l'éditeur.
    Le mieux serait donc de déplacer ton post dans une sous-section procédure du forum dédié à ton éditeur.
    Mon SGBD est SQL SERVER 2000

    C'est quoi l'équivalent de rownum dans SQL SERVER 2000 ?

    Qu'est ce que ca veut dire i.*

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par Snipah Voir le message
    s'il y a un ordre quelconque pour traiter les lignes,
    Oui je veux les traiter de la première lignes à la dernière ligne.
    lire : ligne 1
    traitement
    lire

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Il n'y a pas de première ou de dernière ligne dans une table. L'ordre doit dépendre d'une ou plusieurs colonnes
    Si tu nous expliquais ce que tu as comme données et ce que tu veux en faire, ce serait peut être plus simple.

  12. #12
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par DEV-10 Voir le message
    C'est quoi l'équivalent de rownum dans SQL SERVER 2000 ?
    Il n'y a pas d'équivalent à proprement parler mais tu peux faire la même chose avec row_number (qui fait partit de la norme)
    Citation Envoyé par DEV-10 Voir le message
    Qu'est ce que ca veut dire i.*
    Ca veut dire que tu select toutes les colonnes de la table que tu as aliasser i

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Il n'y a pas d'équivalent à proprement parler mais tu peux faire la même chose avec row_number (qui fait partit de la norme)
    C'est dispo sur SQL Server 2000? Il me semblait avoir lu que c'était à partir de la version 2005 seulement.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Il n'y a pas de première ou de dernière ligne dans une table. L'ordre doit dépendre d'une ou plusieurs colonnes
    Si tu nous expliquais ce que tu as comme données et ce que tu veux en faire, ce serait peut être plus simple.
    Bon voilà

    Je cherche sur une table toutes les lignes qui répondent à une condition Z

    Mettons que ca me donne 10 lignes qui répondent à cette condition.

    Dans ces 10 lignes, je dois pendre ligne par ligne, et pour chaque ligne, en se basant sur un seul champ (clé primaire) faire des recherhces et des traitements dans d'autres tables.

    ce que je veux en fait c'est de sauvegarder un seul champ de chaque ligne dans des variables.

    si mes champs sont : X1, X2, X3

    je veux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select X1,X2,X3 from TOTO where condition Z
    qui va me retourner par exemple 10 lignes et dans ces 10 lignes je veux sauvegarder uniquement le champ X1

    Var_1 = X1 de la première lignes
    Var_2 = X1 de la deuxième lignes
    Var_3 = X1 de la troisième lignes
    .....
    Var_10 = X1 de la dixième lignes

    mais je ne sais pas d'avance le nombre de lignes que je vais avoir, alors je veux faire comme un tableau dynamique qui s'alonge au fur et à mesure.

    Sauf si vous voyez une autre facon de faire.

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Je n'ai jamais fait de transact sql, mais d'après le tutorial d'SQLPro à ce sujet, il n'existe pas de type "tableau", au moins pour la version 2000, et il faut plutot utiliser les tables temporaires.

    Dans ton cas, je pense qu'il suffit d'un curseur, en repompant sur le tuto ça doit donner ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    -- déclaration des variables de colonnes pour le curseur
    DECLARE @X1 TypeX1
     
    -- declaration du curseur
    DECLARE MyCursor CURSOR 
    FOR 
       SELECT X1
       FROM X
     
    -- ouverture du curseur
    OPEN MyCursor
     
    -- lecture du premier enregistrement
    FETCH MyCursor INTO @X1
     
    -- boucle de traitement
    WHILE @@fetch_Status = 0
    BEGIN
       traitement
    -- lecture de l'enregistrement suivant
       FETCH MyCursor INTO @X1
    END
     
    -- fermeture du curseur
    CLOSE myCursor
     
    -- libération de la mémoire
    DEALLOCATE myCursor
    N'hésite pas à lire le tutorial, je pense que tu y trouveras la plupart de tes réponses.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Je n'ai jamais fait de transact sql, mais d'après le tutorial d'SQLPro à ce sujet, il n'existe pas de type "tableau", au moins pour la version 2000, et il faut plutot utiliser les tables temporaires.

    Dans ton cas, je pense qu'il suffit d'un curseur, en repompant sur le tuto ça doit donner ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    -- déclaration des variables de colonnes pour le curseur
    DECLARE @X1 TypeX1
     
    -- declaration du curseur
    DECLARE MyCursor CURSOR 
    FOR 
       SELECT X1
       FROM X
     
    -- ouverture du curseur
    OPEN MyCursor
     
    -- lecture du premier enregistrement
    FETCH MyCursor INTO @X1
     
    -- boucle de traitement
    WHILE @@fetch_Status = 0
    BEGIN
       traitement
    -- lecture de l'enregistrement suivant
       FETCH MyCursor INTO @X1
    END
     
    -- fermeture du curseur
    CLOSE myCursor
     
    -- libération de la mémoire
    DEALLOCATE myCursor
    N'hésite pas à lire le tutorial, je pense que tu y trouveras la plupart de tes réponses.
    Merci bien Snipah, je vais utiliser les curseurs et je te donnerais des nouvelles au besoin.

    Entre temps, si quelqu'un d'autres aura une autre idée géniale, ca serait apprécié.

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par DEV-10 Voir le message
    Merci bien Snipah, je vais utiliser les curseurs et je te donnerais des nouvelles au besoin.

    Entre temps, si quelqu'un d'autres aura une autre idée géniale, ca serait apprécié.
    Est-ce qu'on peut faire un curseur dans un autre curseur (curseurs imbriqués) ? si oui, comment différencier la variable @@fetch_Status des deux ciurseurs imbriquées ?

    Merci.

  18. #18
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

    La variable @@fetch_STATUS est associée à la dernière opération FETCH d'un curseur ouvert. Vous pouvez donc ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    DECLARE C_1 CURSOR FOR
    ...
     
    OPEN C_1
    FETCH NEXT FROM C_1 TO ...
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
          DECLARE C_2 CURSOR FOR
          ...
     
          OPEN C_2
          FETCH NEXT FROM C_2 TO ...
     
          WHILE @@FETCH_STATUS = 0
          BEGIN
               // TRAITEMENT A EFFECTURE        
     
               FETCH NEXT FROM C_2 TO ...
          END
     
          CLOSE C_2
          DEALLOCATE C_2
     
          FETCH NEXT FROM C_1 TO ...
     
    END
     
    CLOSE C_1
    DEALLOCATE C_1
    ++

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    Bonjour,

    La variable @@fetch_STATUS est associée à la dernière opération FETCH d'un curseur ouvert. Vous pouvez donc ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    DECLARE C_1 CURSOR FOR
    ...
     
    OPEN C_1
    FETCH NEXT FROM C_1 TO ...
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
          DECLARE C_2 CURSOR FOR
          ...
     
          OPEN C_2
          FETCH NEXT FROM C_2 TO ...
     
          WHILE @@FETCH_STATUS = 0
          BEGIN
               // TRAITEMENT A EFFECTURE        
     
               FETCH NEXT FROM C_2 TO ...
          END
     
          CLOSE C_2
          DEALLOCATE C_2
     
          FETCH NEXT FROM C_1 TO ...
     
    END
     
    CLOSE C_1
    DEALLOCATE C_1
    ++
    Qu'est ce qui doit suivre le TO du FETCH ?

    Voulait-tu dire INTO @variable1, @variable2,....

    Peux t-on déclarer deux même varibles pour les deux curseurs ?

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/02/2007, 14h26
  2. Réponses: 2
    Dernier message: 26/01/2007, 15h28
  3. Deux lignes en une dans une table
    Par jeanchcom dans le forum Access
    Réponses: 2
    Dernier message: 21/08/2006, 13h50
  4. Lire et modifier une table avec plusieurs TQuery
    Par Alyx² dans le forum Bases de données
    Réponses: 4
    Dernier message: 18/08/2006, 13h09
  5. Requete sur une table qui pointe 2 fois sur une autre
    Par Satch dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/01/2006, 08h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo