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

PL/SQL Oracle Discussion :

N'utiliser que le 1er enregistrement?


Sujet :

PL/SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Portugal

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 2
    Points
    2
    Par défaut N'utiliser que le 1er enregistrement?
    Bonjour, et-il possible en plsql de ne sélectionner uniquement le premier

    enregistrement d'un tableau car mon programme recevra un tableau avec

    plusieurs enregistrements et devra les traiter 1 par 1. Pour sa j'ai pensé

    ne le faire agir que sur le premier enregistrement car quand il a enregistrer les

    données dont il a besoin il supprime l'enregistrement.

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 108
    Points : 83
    Points
    83
    Par défaut
    Bonjour
    il y a plusieurs solution merci de nous donner plus sur le traitement à faire et quel enregistrement il faut récupérer...
    exemple simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    declare
    first_a number;
    first_b number;
    first_c number;
     
    begin
     
    select a,b,c into first_a,first_b,first_c from matable where ... ;
     
    ton traitement pl/sql...
     
    end;

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Portugal

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 2
    Points
    2
    Par défaut
    Merci, j'ai trouvé la solution, il faut utiliser ROWNUM = 1 pour ne prendre en compte que le premier enregistrement.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Non c'est faux.
    Écrit simplement, ROWNUM = 1 vous renverra certes une ligne de votre requête, mais n'importe laquelle.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Portugal

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 2
    Points
    2
    Par défaut
    Ha... mais dans mon cas précis vus que âpres chaque traitement d'enregistrement il est supprimer cela ne me pose pas de problème mais merci du renseignement.
    Il existe une autre solution pour prendre le 1er enregistrement?

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Ça dépend, il vaut voir si vous parler d'une table relationnelle ou objet, et dans le premier cas définir ce qui signifie premier.
    Le mieux serait de poster une version simplifiée de votre contexte.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Portugal

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 2
    Points
    2
    Par défaut
    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
    31
    32
    33
    34
    35
    DECLARE
     
      caract1 number(2) := NULL;
      caract2 number(2) := NULL;
      chaine1 varchar2(50) := NULL;
      chaine2 varchar2(50) := NULL;
      chaine3 varchar2(50) := NULL;
      nomTable varchar2(40) := NULL;
      champPK varchar2(40) := NULL;
     
    BEGIN
     
      nomTable = (SELECT tablename FROM INT_QFS_DONNEES_REF WHERE rownum = 1;
      champPK = (SELECT recordkey FROM INT_QFS_DONNEES_REF WHERE rownum = 1;
     
      SELECT instr(champPK, '|', 1) INTO caract1 FROM dual;
      SELECT instr(champPK, '|', caract1 + 1) INTO caract2 FROM dual;
      IF (caract1 > 0) then
        SELECT substr(champPK, 1, caract1-1) INTO chaine1 FROM dual;
      end IF;
      IF (caract2 > 0) then
        SELECT substr(champPK, caract1 + 1, length(champPK) - caract2 - 1) INTO chaine2 FROM dual;
        SELECT substr(champPK, caract2 + 1, length(champPK)) INTO chaine3 FROM dual;
      ELSE
        SELECT substr(champPK, caract1 + 1, length(champPK)) INTO chaine2 FROM dual;
      end IF;
      dbms_output.put_line(chaine1); 
      dbms_output.put_line(chaine2); 
      dbms_output.put_line(chaine3); 
     
      IF (SELECT actiontype FROM INT_QFS_DONNEES_REF WHERE rownum = 1) = 'S' THEN
        delete (SELECT * FROM nomTable AND colonne1 = chaine1 AND colonne2 = chaine2;
     
     
    END;
    Voici le début de mon programme qui consiste à dégrouper les informations qui arrive dans une table générique pour les remettre dans leurs 9 tables d'origines. Je vous est joint un extré de ma table générique.
    Fichiers attachés Fichiers attachés
    • Type de fichier : txt doc.txt (575 octets, 84 affichages)

  8. #8
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    Un curseur sur ta table peut être?

    Il te ramènera ligne par ligne...

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Portugal

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 2
    Points
    2
    Par défaut
    Pour être honnête je n'ai vraiment aucune idée de ce qu'est un curseur, mon maître de stage est en vacances et m'a dit de faire ce programme alors que je n'avais jamais utilisé le langage pl/sql. A part le curseur, la syntaxe est-elle correcte ?

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Non, en toute honnêteté ce n'est pas terrible : vous êtes débutant, c'est donc une critique mais pas un reproche.

    À part le DELETE (et encore, dans votre fichier le code est D, dans votre code c'est S), je ne vois aucune opération.

    Qu'est-ce que votre programme est censé faire ?

  12. #12
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Portugal

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 2
    Points
    2
    Par défaut
    Le but de ce programme est de réduire le nombre de canaux d’interfaces entre 2 bases de données.
    Il dégroupera les informations envoyées par la 1er bd dans une table générique pour les remettre dans leurs 9 tables d’origines, donc la 2eme bd recevra les tables dans leurs structures originales.

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Portugal

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 2
    Points
    2
    Par défaut
    Je ne vous ai pas posté le "bon" code. Le voici
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    DECLARE
     
      caract1 number(2) := NULL;
      caract2 number(2) := NULL;
      chaine1 varchar2(10) := NULL;
      chaine2 varchar2(10) := NULL;
      chaine3 varchar2(10) := NULL;
      nomTable varchar2(40) := NULL;
      champPK varchar2(40) := NULL;
      champModifier varchar2(40) := NULL;
      champNum number(15,6) :=NULL;
      champCaract VARCHAR2(160 BYTE) := NULL;
     
    BEGIN
     
      nomTable = (SELECT tableName FROM INT_QFS_DONNEES_REF WHERE rownum = 1;
      champPK = (SELECT recordKey FROM INT_QFS_DONNEES_REF WHERE rownum = 1;
     
      SELECT instr(champPK, '|', 1) INTO caract1 FROM dual;
      SELECT instr(champPK, '|', caract1 + 1) INTO caract2 FROM dual;
      IF (caract1 > 0) then
        SELECT substr(champPK, 1, caract1-1) INTO chaine1 FROM dual;
      end IF;
      IF (caract2 > 0) then
        SELECT substr(champPK, caract1 + 1, length(champPK) - caract2 - 1) INTO chaine2 FROM dual;
        SELECT substr(champPK, caract2 + 1, length(champPK)) INTO chaine3 FROM dual;
      ELSE
        SELECT substr(champPK, caract1 + 1, length(champPK)) INTO chaine2 FROM dual;
      end IF;
      dbms_output.put_line(chaine1); 
      dbms_output.put_line(chaine2); 
      dbms_output.put_line(chaine3); 
     
      IF (SELECT actiontype FROM INT_QFS_DONNEES_REF WHERE rownum = 1) = 'D' THEN
        delete (SELECT * FROM nomTable AND colonne1 = chaine1 AND colonne2 = chaine2);
     
      champModifier = (SELECT fildName FROM INT_QFS_DONNEES_REF WHERE rownum = 1);
      champNum = (SELECT FIELDNUMBER FROM INT_QFS_DONNEES_REF WHERE rownum = 1);
      champCaract = (SELECT FIELDCHARVALUE FROM INT_QFS_DONNEES_REF WHERE rownum = 1);
     
      IF (SELECT fildType FROM INT_QFS_DONNEES_REF) = 'N' THEN
        (SELECT champModifer FROM nomTable) = champNum;
         ELSIF (SELECT fildType FROM INT_QFS_DONNEES_REF) = 'C' THEN
           (SELECT champModifer FROM nomTable) = champCaract;                                  
     
    END;

  14. #14
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Et pourquoi ne pas remplacé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     IF (SELECT actiontype FROM INT_QFS_DONNEES_REF WHERE rownum = 1) = 'D' THEN
        DELETE (SELECT * FROM nomTable AND colonne1 = chaine1 AND colonne2 = chaine2);
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM nomTable WHERE colonne1 = chaine1 AND colonne2 = chaine2 AND EXISTS (SELECT 1 FROM  INT_QFS_DONNEES_REF WHERE actiontype = 'D' )
    Sinon, les données ne sont pas ordonnées dans une table. Une table c'est comme un sac de billes. Sélectionner la première ligne n'a pas plus de sens que prendre la première bille.

    Et j'imagine que tu es consciens que ton code est tout sauf du PL/SQL

  15. #15
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Franchement arrêtez-vous d'écrire du "PL/SQL" un peu et respirez profondément. Prenez ensuite votre première instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    nomTable = (SELECT tableName FROM INT_QFS_DONNEES_REF WHERE rownum = 1;
    ...
    et essayez de la faire fonctionner. Déjà ça sera une victoire.

  16. #16
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Portugal

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 2
    Points
    2
    Par défaut
    Merci pour toutes vos réponses et tous vos conseils

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

Discussions similaires

  1. [Mapping] One to Many ne ramène que le 1er enregistrement
    Par Manopower dans le forum Hibernate
    Réponses: 4
    Dernier message: 23/11/2011, 15h50
  2. comment ne sélectionner que le 1er enregistrement d'un groupe ?
    Par skywaukers dans le forum Langage SQL
    Réponses: 7
    Dernier message: 18/12/2007, 10h39
  3. Réponses: 3
    Dernier message: 06/12/2005, 13h44
  4. Utiliser que le processeur
    Par Neilos dans le forum OpenGL
    Réponses: 5
    Dernier message: 31/07/2005, 11h24
  5. Aff d'une variable je ne recupere que le 1er mot
    Par mitchb dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/06/2005, 17h06

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