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

SGBD Perl Discussion :

[DBI][ORACLE] Problème à l'execution d'un update


Sujet :

SGBD Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Par défaut [DBI][ORACLE] Problème à l'execution d'un update
    Bonjour,

    j'ai un problème incroyable avec un script que j'ai écrit sous perl. J'utilise une connexion DBI à oracle pour faire des updates sur une table.

    Le script lit récursivement des lignes dans un fichier et construit une requete SQL en UPDATE.

    elle est de la forme : "UPDATE table machin SET truc=? WHERE numero=?";

    Je commence par un begin_work();
    ensuite je fais un prepare()
    puis bind_param sur les 2 params en varchar
    et enfin execute()

    Sur 5 lignes cela fonctionne, puis dans la 6ème, l'execute ne rend jamais la main. Pas d'erreur, rien dans la trace DBI... Il reste en attente et n'en sort jamais...

    Le plus incroyable c'est que les valeurs sont par exemple :
    WHERE numero='207566652-01' ne fonctionne pas
    par contre
    WHERE numero='207566652-02' fonctionne...

    Dans les 2 cas, il n'y a aucun enregistrement à updater mais le blocage existe quand même.

    Je suis sur un serveur Sun solaris, en perl 5.8.4 et oracle 10g.

    Est-ce que quelqu'un à une idée ?? Cela me sauverait la vie...

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    questions en vrac :

    La ligne de la table ne serait pas lockée par ailleurs ?

    tu es sur que la valeur lue du fichier est cohérente ?

    Tu peux poster la partie du script en question ?
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Par défaut
    Salut,

    j'estime qu'il est possible que l'enregistrement soit locké, mais mon script est le seul à travailler sur la table et je suis le seul user (script en dev).
    Comment savoir si mon enregistrement est locké ? Comment le détecter pour logger l'info et passer à la suite, parce que pour l'instant c'est carrément bloquant.
    En plus, quelle erreur j'aurais pu commettre pour qu'il y ait un lock sur l'enregistrement ? C'est bizarre...

  4. #4
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Et ton script ?
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Par défaut
    Ah oui... 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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    logInfo("Debut de la sequence d'insertion des donnees");
    	open(IGECA, "./tmp/$igecaFileName") || termine(-1); #Améliorer le log pour l'erreur
    	@IGECA_IN = <IGECA>;
    	$line_nb = 0;
    	$nb_ok = 0;
    	$nb_ko = 0;
    	$erreurs_nb = 0;
     
    	foreach $line (@IGECA_IN) {
    		chomp($line);
    		@champ = split(/;/, $line);
     
    		#La première ligne contient les noms des colonnes
    		if($line_nb > 0) {
    			# Il faut vérifier si nous avons bien le bon nombre de champs (5 minimum)
    			if(@champ >= 5) { 
    				$ndCommande = trim(@champ[0]); 
    				#Le ND peut être soit à 9 chiffres soit à 10 chiffres, on l'étend systématiquement à 10 chiffres en ajoutant un 0 si besoin au début
    				if(length($ndCommande) < 10) { $ndCommande = "0$ndCommande"; }
     
    				$dateEnvoi = trim(@champ[4]);
    				$chronoCommande = trim(@champ[3]);
    				$dateBss = trim(@champ[2]);
     
    				my $requete = q{UPDATE INTERNET_SEC_COMMANDE SET CHRONO_COMMANDE=?, DATE_ENVOI=to_date(?, 'YYYY-MM-DD HH24:MI:SS'), 
    					EMPLACEMENT_COMMANDE='IGECA' WHERE ND_COMMANDE=? AND DATE_BSS=to_date(?, 'YYYY-MM-DD HH24:MI:SS')};
     
    				# logInfo("Requete d'update : $requete");
    				logInfo("ndCommande=$ndCommande");
    				if($dbmod) {
    					$db->begin_work;
     
    					my $sth = $db->prepare($requete);
     
    					eval {
    						$sth->bind_param(1, $chronoCommande, { ora_type => ORA_CHAR });
    						$sth->bind_param(2, $dateEnvoi, { ora_type => ORA_CHAR });
    						$sth->bind_param(3, $ndCommande, { ora_type => ORA_CHAR });
    						$sth->bind_param(4, $dateBss, { ora_type => ORA_CHAR });						
    						#$sth->execute(@$_) foreach (@updates) or print "Erreur : $DBI::errstr\n";						
    						$sth->execute();
    					};
     
    					if( $@ ) {
    						$db->rollback;
    						logErreur("Une erreur s'est produite lors de l'execution de la requete pour ndCommande=$ndCommande");
    						$db->errstr;
    					} else {
    						$db->commit;
    						#print "ndCommande : $ndCommande";
    					}
     
    					if($sth->rows() > 0) { $nb_ok++; } else { $nb_ko++; }
    					$sth->finish();	
    				}
    			} else { # La ligne était mal formatée, on reporte
    				logErreur("La ligne était mal formatée : $line"); 
    				$erreurs_nb++;
    			}
    		}
     
    		$line_nb++;

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Par défaut
    Merci Vicenzo pour ton aide, en réalité tu avais raison c'était bien un problème de lock, mais pas de mon script. Je ne trouvais pas de lock de mon script mais en fait il y avait un lock de SQL Developer. Je ne comprends pas du tout pourquoi sql developper avait posé un lock sur ma table, alors que je ne la visualisais pas et que je ne fais que des select très simples depuis cette application... peut-être un bug ?

    En tout cas cette histoire m'a fait perdre une journée entière, c'est cool !

    Merci pour ton aide !

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/08/2007, 15h05
  2. [ORACLE] problème de syntaxe UPDATE
    Par magic charly dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/05/2006, 12h26
  3. [C#] [Oracle] Problème d'Update
    Par _Air_ dans le forum Windows Forms
    Réponses: 12
    Dernier message: 06/04/2005, 13h56
  4. [C#] Execution d'un UPDATE
    Par kenzo080 dans le forum ASP.NET
    Réponses: 7
    Dernier message: 26/05/2004, 16h37
  5. problème lancement executable avec winexec()
    Par semenzato dans le forum MFC
    Réponses: 5
    Dernier message: 19/01/2004, 11h48

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