Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/05/2011, 09h04   #1
 
Homme
Étudiant
Inscription : 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.
kouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 09h23   #2
Membre du Club
 
Homme
Développeur informatique
Inscription : décembre 2006
Messages : 104
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : décembre 2006
Messages : 104
Points : 49
Points : 49
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 :
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;
webfranc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 11h06   #3
 
Homme
Étudiant
Inscription : 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
Merci, j'ai trouvé la solution, il faut utiliser ROWNUM = 1 pour ne prendre en compte que le premier enregistrement.
kouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 11h37   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 438
Points : 10 438
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Non c'est faux.
Écrit simplement, ROWNUM = 1 vous renverra certes une ligne de votre requête, mais n'importe laquelle.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 11h51   #5
 
Homme
Étudiant
Inscription : 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
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?
kouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 11h55   #6
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 438
Points : 10 438
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Ç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.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 14h21   #7
 
Homme
Étudiant
Inscription : 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
Code :
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
Type de fichier : txt doc.txt (575 octets, 1 affichages)
kouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 14h36   #8
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
Un curseur sur ta table peut être?

Il te ramènera ligne par ligne...
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h26   #9
 
Homme
Étudiant
Inscription : 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
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 ?
kouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h29   #10
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
http://sheikyerbouti.developpez.com/...e=Chap1#L1.2.8
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h44   #11
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 438
Points : 10 438
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h57   #12
 
Homme
Étudiant
Inscription : 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
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.
kouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h59   #13
 
Homme
Étudiant
Inscription : 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
Je ne vous ai pas posté le "bon" code. Le voici
Code :
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;
kouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 16h24   #14
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Et pourquoi ne pas remplacé :
Code :
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 :
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/05/2011, 18h42   #15
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 808
Points : 5 808
Franchement arrêtez-vous d'écrire du "PL/SQL" un peu et respirez profondément. Prenez ensuite votre première instruction
Code :
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.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 08h34   #16
 
Homme
Étudiant
Inscription : 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
Merci pour toutes vos réponses et tous vos conseils
kouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h04.


 
 
 
 
Partenaires

Hébergement Web