Bonjour,

J'essaye d'insere des tuples dans une base de donnees, pour cela j'utilise DBI..

Je souhaiterai savoir si je suis oblige de faire un SELECT avant mon INSERT pour verifier si le tuple exite ou non, ou si je peux passer par les messages d'erreurs renvoyes par la BD pour verifier ca...Sachant que l'autocommit est a 0
et de meme il y a t il un moyen de recuperer la cle primaire apres l'insertion d'un tupple sans avoir a repasser par un SELECT dans le cas d'une table avec une cle primaire en integer auto-incremente?

Merci,

Je vous laisse mon code...qui ne marche pas

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
eval{
  $db = DBI -> connect($dsn,$dbUser,$dbPwd, { RaiseError => 1, AutoCommit => 0,PrintError=>1 });
 };
 
if($DBI::state != undef){
  push(@errors, [$DBI::state, $DBI::errstr, " Connexion Error"]);
}
 
 eval{
    $req = $db->prepare("INSERT INTO Organisation (Name) values(\'$organisation\')");
    $req->execute();
  };
  if($DBI::state != '23505' && $DBI::state != undef && $DBI::state != '25P02'){ 
    push(@errors, [$DBI::state, $DBI::errstr, "INSERT INTO Organisation (Name) values(\'$organisation\')"]);
  }
 
  if(@errors > 0){
    my $j;
    for($j=0;$j<scalar(@errors);$j++){
      print LOG_FILE "count=".@errors."\n";
      print LOG_FILE "--------------------------------------------------\n";
      print LOG_FILE "Error Code : ".$errors[$j][0]."\n";
      print LOG_FILE "Error : ".$errors[$j][1]."\n";
      print LOG_FILE "Remark : ".$errors[$j][2]."\n";
      print LOG_FILE "--------------------------------------------------\n";
    }
    if($db){
      $db->rollback;
      $req->finish();
      $db->disconnect(); 
      exit_ui(0);
    }
  }else{
    $db->commit;
    $req->finish();
    $db->disconnect(); 
  }
$DBI::state != '23505' => Duplicate key
$DBI::state != '25P02' => Operation aborded (renvoye quand on essaye de passer une requete et qu'une erreur s'est produite sur une requete precedante, les requetes suivant l'erreurs sont "aborded" en mode autocommit a 0

voila, ce code est un test pour eviter de faire des Select count(*) avant pour tester si le tupple a inserer exite...je le trouve pas tres joli et i marche pas de toute facon, parce que postgre annule systematiquement toutes les requetes suivant celle qui a une cle primaire deja existante...

j'espere avoir etait comprehensible...

Merci pour votre aide!