Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & Oracle
PHP & Oracle Forum d'entraide sur Oracle avec PHP. Avant de poster -> FAQ Oracle et Cours Oracle
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 10/08/2006, 09h22   #1
Nouveau Membre du Club
 
Inscription : mai 2004
Messages : 84
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mai 2004
Messages : 84
Points : 36
Points : 36
Par défaut Connaitre le nombre de lignes affectées par un update à l'avance

Bonjour,

tout est dit dans le titre :

Comment connaitre le nombre de lignes affectées par un update à l'avance ?
C'est-à-dire, sans faire le valider (sans commit).

Pour mon appli, je veux être sûr qu'il est n'y ait pas plus d'une ligne à jour (surtout pour des updates sur plusieurs tables).

J'ai pensé à un select préliminaire avec le même where et mêmes tables ... mais je ne trouve ça pas top.

Merci par avance
lionheart33806 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2006, 09h33   #2
Membre Expert
 
Avatar de SnakemaN
 
Bidouille-tout Android
Inscription : juillet 2006
Messages : 871
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Bidouille-tout Android

Informations forums :
Inscription : juillet 2006
Messages : 871
Points : 1 102
Points : 1 102
c'est normal que j'a rien compris ?
__________________
C'est le signe d'un fou, qu'avoir honte d'apprendre
Ubuntu 10.04 Lucid Lynx @home
LE guide libre Linux & Ubuntu pour tous : Simple comme Ubuntu
SnakemaN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2006, 09h37   #3
Membre éclairé
 
Avatar de Joe Le Mort
 
Inscription : avril 2006
Messages : 392
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 392
Points : 361
Points : 361
Envoyer un message via MSN à Joe Le Mort
Citation:
Envoyé par lionheart33806
Bonjour,

tout est dit dans le titre :

Comment connaitre le nombre de lignes affectées par un update à l'avance ?
C'est-à-dire, sans faire le valider (sans commit).

Pour mon appli, je veux être sûr qu'il est n'y ait pas plus d'une ligne à jour (surtout pour des updates sur plusieurs tables).

J'ai pensé à un select préliminaire avec le même where et mêmes tables ... mais je ne trouve ça pas top.
Si tu es en mysql, je ne pense pas que tu puisses, en oracle par contre oui.
Ouais, je pense que le select serait utilisé avant de faire ton update.
Joe Le Mort est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2006, 09h42   #4
Nouveau Membre du Club
 
Inscription : mai 2004
Messages : 84
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mai 2004
Messages : 84
Points : 36
Points : 36
Citation:
Envoyé par Joe Le Mort
Si tu es en mysql, je ne pense pas que tu puisses, en oracle par contre oui.
Ouais, je pense que le select serait utilisé avant de faire ton update.
Tu ferais comment exactement avec Oracle ?
Et pour MySql ?
lionheart33806 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2006, 09h45   #5
Membre Expert
 
Avatar de SnakemaN
 
Bidouille-tout Android
Inscription : juillet 2006
Messages : 871
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Bidouille-tout Android

Informations forums :
Inscription : juillet 2006
Messages : 871
Points : 1 102
Points : 1 102
Je ne sais pas si j'ai compris ce que tu voulais faire mais, tu as mysql_num_rows qui te permet de savoir combien de ligne t'a requete t'a renvoyée...ici un update...
__________________
C'est le signe d'un fou, qu'avoir honte d'apprendre
Ubuntu 10.04 Lucid Lynx @home
LE guide libre Linux & Ubuntu pour tous : Simple comme Ubuntu
SnakemaN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2006, 09h46   #6
Expert Confirmé

 
Avatar de Amara
 
Inscription : juillet 2004
Messages : 2 684
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : juillet 2004
Messages : 2 684
Points : 2 910
Points : 2 910
Citation:
Envoyé par SnakemaN
Je ne sais pas si j'ai compris ce que tu voulais faire mais, tu as mysql_num_rows qui te permet de savoir combien de ligne t'a requete t'a renvoyée...ici un update...
Oui mais là le problème c'est que c'est avant la requête et pas après...
__________________
Pas de questions techniques par MP, le forum est là pour ça et est plus efficace.

Orthographe : une connexion (avec un x), un langage (sans u), une requête (un seul t), 'une quote' (avec qu), une syntaxe (sans h)
Amara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2006, 09h49   #7
Nouveau Membre du Club
 
Inscription : mai 2004
Messages : 84
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mai 2004
Messages : 84
Points : 36
Points : 36
Citation:
Envoyé par JWhite
Oui mais là le problème c'est que c'est avant la requête et pas après...
Exactement, le but est connaitre le nombre de ligne pour savoir si "on" va vraiment faire le update ou pas.

- Je construis le update
- Je teste magiquement le nombre de lignes qu'il va modifier
- Si nombre de lignes égal 1, faire le update
lionheart33806 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2006, 09h50   #8
Membre Expert
 
Avatar de SnakemaN
 
Bidouille-tout Android
Inscription : juillet 2006
Messages : 871
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Bidouille-tout Android

Informations forums :
Inscription : juillet 2006
Messages : 871
Points : 1 102
Points : 1 102
Citation:
Envoyé par lionheart33806
....
Comment connaitre le nombre de lignes affectées par un update à l'avance ?
C'est-à-dire, sans faire le valider (sans commit).
.....
Ahh en fait tu fais un update de toute table mais tu veux savoir combien d'enregistrement on été modifié ?

Mais je ne sais pas exactement comment marche un update, est-ce qu'il met a jour tout les champs meme si la nouvelle valeur et égale a l'ancienne, dans ce cas le mysql_num_row te renvera toutes tes lignes, OU BIEN est-ce que il y un test "automatique" pour voir si la nouvelle valeur et égale a l'ancienne si c'est le cas il passe au suivant, dans ce cas le mysql_num_rows serait de mise...
__________________
C'est le signe d'un fou, qu'avoir honte d'apprendre
Ubuntu 10.04 Lucid Lynx @home
LE guide libre Linux & Ubuntu pour tous : Simple comme Ubuntu
SnakemaN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2006, 09h51   #9
Membre Expert
 
Avatar de SnakemaN
 
Bidouille-tout Android
Inscription : juillet 2006
Messages : 871
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Bidouille-tout Android

Informations forums :
Inscription : juillet 2006
Messages : 871
Points : 1 102
Points : 1 102
Arrf grilled
__________________
C'est le signe d'un fou, qu'avoir honte d'apprendre
Ubuntu 10.04 Lucid Lynx @home
LE guide libre Linux & Ubuntu pour tous : Simple comme Ubuntu
SnakemaN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2006, 09h53   #10
Membre Expert
 
Avatar de SnakemaN
 
Bidouille-tout Android
Inscription : juillet 2006
Messages : 871
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Bidouille-tout Android

Informations forums :
Inscription : juillet 2006
Messages : 871
Points : 1 102
Points : 1 102
Citation:
Envoyé par lionheart33806
Exactement, le but est connaitre le nombre de ligne pour savoir si "on" va vraiment faire le update ou pas.

- Je construis le update
- Je teste magiquement le nombre de lignes qu'il va modifier
- Si nombre de lignes égal 1, faire le update
Si c'est un MYSQL récent il est possible de faire cela en requetes imbriquées...donc rapide a l'execution

Je crois qu'on peu y integrer un requete pour faire une condition (ici un where peut etre)

ps : Si c'est UNe ligne de concernée ? tu sais laquelle ? premiere, ....?
__________________
C'est le signe d'un fou, qu'avoir honte d'apprendre
Ubuntu 10.04 Lucid Lynx @home
LE guide libre Linux & Ubuntu pour tous : Simple comme Ubuntu
SnakemaN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2006, 09h55   #11
Membre Expert
 
Avatar de SnakemaN
 
Bidouille-tout Android
Inscription : juillet 2006
Messages : 871
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Bidouille-tout Android

Informations forums :
Inscription : juillet 2006
Messages : 871
Points : 1 102
Points : 1 102
Citation:
Dans la version 3.23 de MySQL, vous pouvez utilisez le code LIMIT # pour vous assurer que seul un nombre d'enregistrements bien précis est changé.

Avant MySQL 4.0.13, LIMIT est une restrictions sur le nombre de lignes affectées. Cette clause stoppe dès que row_count ont été trouvées par la clause WHERE.

Depuis la version 4.0.13, LIMIT est une restriction sur le nombre de lignes trouvées. La commande s'arrête une fois que row_count lignes ont été trouvées par la clause WHERE, qu'elles ait été changées ou pas.
vu ici http://dev.mysql.com/doc/refman/5.0/fr/update.html
__________________
C'est le signe d'un fou, qu'avoir honte d'apprendre
Ubuntu 10.04 Lucid Lynx @home
LE guide libre Linux & Ubuntu pour tous : Simple comme Ubuntu
SnakemaN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2006, 10h06   #12
Rédacteur
 
Avatar de wamania
 
Développeur Web
Inscription : juillet 2003
Messages : 676
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2003
Messages : 676
Points : 678
Points : 678
je crois qu'il ne veut pas limiter à 1 ligne, mais qu'il veut faire cet update que si il y a une ligne à updater. C'est ça?

Donc si tu as + d'une ligne, tu fais pas l'update?
__________________
Articles sur developpez.com
- Gestion des exceptions avec PHP5
- Chiffrement et hash en PHP contre l'attaque Man in the middle
- Aedituus - Espace membre sécurisé en PHP5

Lithium : ORM ActiveRecord PHP5 extrêmement léger
wamania est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2006, 10h08   #13
Nouveau Membre du Club
 
Inscription : mai 2004
Messages : 84
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mai 2004
Messages : 84
Points : 36
Points : 36
Citation:
Envoyé par wamania
je crois qu'il ne veut pas limiter à 1 ligne, mais qu'il veut faire cet update que si il y a une ligne à updater. C'est ça?

Donc si tu as + d'une ligne, tu fais pas l'update?

Tout à fait
lionheart33806 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2006, 10h09   #14
Membre habitué
 
Inscription : octobre 2003
Messages : 102
Détails du profil
Informations personnelles :
Âge : 39

Informations forums :
Inscription : octobre 2003
Messages : 102
Points : 108
Points : 108
Salut,

juste pour tordre cette idée erronée, les transaction sont possible sous mysql, et pour des versions released, tout comme la gestion de l'intégrité de données (clés étrangère). A condition de typer ses tables INNODB.
le gel de l'autocommit pour une connexion se fait comme suit :
Code :
1
2
 
set autocommit = 0
ou alors tout simplement, pour une transaction ponctuelle, encapsuler le groupe de requetes que l'ont veux grouper en transaction par les instruction BEGIN et COMMIT/ROLLBACK

Code :
1
2
3
4
5
 
mysql_query('begin');
mysql_query($requete);
$aff = mysql_affected_rows():
mysql_query('rollback');
realisable déjà à coup sur sous mysql 4.1.10 (avant jene sais pas).
__________________
il n'y a pas de sotte existence
gisele est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2006, 10h13   #15
Nouveau Membre du Club
 
Inscription : mai 2004
Messages : 84
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mai 2004
Messages : 84
Points : 36
Points : 36
Citation:
Envoyé par gisele
Salut,

...
le gel de l'autocommit pour une connexion se fait comme suit :
Code :
1
2
 
set autocommit = 0
ou alors tout simplement, pour une transaction ponctuelle, encapsuler le groupe de requetes que l'ont veux grouper en transaction par les instruction BEGIN et COMMIT/ROLLBACK
...
Ca me plait bien. A ton avis, ce principe peut être transposé sur Oracle ?
lionheart33806 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2006, 10h35   #16
Membre habitué
 
Inscription : octobre 2003
Messages : 102
Détails du profil
Informations personnelles :
Âge : 39

Informations forums :
Inscription : octobre 2003
Messages : 102
Points : 108
Points : 108
Ca fait longtemps que je n'ai pas fait joujou avec mon Oracle 9i donc renseigne toi sur les syntaxes mais ca peut a fortiori etre transposé sous Oracle.

Ca me rappelle des bons souvenirs ,je me souviens en projet libre j'avais créé une sorte de phpmyadmin (en simplifié) muli SGBD, Oracle 8* et 9* SQL Server 2000, access (le plus chiant sic) et Mysql en version client lourd avec VB et ADO (beurk) et en 3 tiers (php)grace a la couche ADODB je crois que j'avais mis des fonctionnalités de transactions.

Une chose est sure, tu peux activer désactiver l'autocommit, et d'ailleurs Oracle a un sytème de gestion bien plus poussé avec des sortes de points de restauration intermédiaires (voir SAVEPOINT) que tu peux discéminer au milieu de ton flot de requetes et tout et tout.
__________________
il n'y a pas de sotte existence
gisele 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 00h35.


 
 
 
 
Partenaires

Hébergement Web