Schrift
[thread]11142[/thread]

Update auf db mit perl (Seite 2)

Leser: 1


<< |< 1 2 >| >> 20 Einträge, 2 Seiten
Duff
 2008-01-16 10:42
#104774 #104774
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Nein, ich mache nichts mit transaktionen.

Ich möchte nur ein "einfaches" update absetzen und danach vermeiden, dass ich ein lock auf die DB verursache.

Ich müsste dass Ganze doch dann so realisieren können:
Code (perl): (dl )
1
2
3
4
5
6
my $stmt = "UPDATE tabellenname SET spalte1 = ?, spalte2 = ? WHERE spalte3 = ?";
my $rows = $dbh->do( $stmt, undef, $spalte1, $spalte2, $spalte3 );

print "$rows Zeilen aktualisiert\n";

$dbh->commit;


Und gut ist.
Wofür ist das undef eigentlich in dem do?
D'OH
Daniel
renee
 2008-01-16 10:50
#104775 #104775
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Stell einfach AutoCommit auf 1. Das ist für diesen Fall sehr gut geeignet...

Anstelle des undef kannst Du eine Hashreferenz mit Attributen übergeben.

Aus der DBI-Doku:
Code: (dl )
The \%attr parameter can be used to alter the default settings of PrintError, RaiseError, AutoCommit, and other attributes
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Duff
 2008-01-16 11:11
#104776 #104776
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Also in %attr habe ich PrintError => 1 und AutoCommit => 0.

Was spricht denn gegen diese Variante?
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub update {
  my $spalte1 = shift;
  my $spalte2 = shift;
  my $spalte3 = shift;

  my $stmt = "UPDATE tabellenname SET spalte1 = ?, spalte2 = ? WHERE spalte3 = ?";
  my $rows = $dbh->do( $stmt, $spalte1, $spalte2, $spalte3 );

  print "$rows Zeilen aktualisiert\n";

  $dbh->commit;
}

update($spalte1, $spalte2, $spalte3);
D'OH
Daniel
renee
 2008-01-16 11:21
#104777 #104777
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Die drei shifts - und das undef fehlt... ;-)

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
sub update {
  my $stmt = "UPDATE tabellenname SET spalte1 = ?, spalte2 = ? WHERE spalte3 = ?";
  my $rows = $dbh->do( $stmt, undef, @_[0..2] );

  print "$rows Zeilen aktualisiert\n";

  $dbh->commit;
}

update($spalte1, $spalte2, $spalte3);
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2008-01-16 11:23
#104778 #104778
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Bzw. wenn Du %attr verwendest:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
sub update {
  my %attr = ( PrintError => 1, AutoCommit => 0 );
  my $stmt = "UPDATE tabellenname SET spalte1 = ?, spalte2 = ? WHERE spalte3 = ?";
  my $rows = $dbh->do( $stmt, \%attr, @_[0..2] );

  print "$rows Zeilen aktualisiert\n";

  $dbh->commit;
}

update($spalte1, $spalte2, $spalte3);
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Duff
 2008-01-16 11:42
#104779 #104779
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Danke, aber das %attr benutze ich nur beim DBI->connect.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sub update {
  my $dbh = shift;
  my $stmt = "UPDATE tabellenname SET spalte1 = ?, spalte2 = ? WHERE spalte3 = ?";
  my $rows = $dbh->do( $stmt, undef, @_[1..3] );
 
  print "$rows Zeilen aktualisiert\n";

  $dbh->commit;
}

my $dbh=DBI->connect("dbi:Oracle:$db_name",$db_user, $db_pw, \%attr) or die "Fehler $DBI::errstr";

update($dbh,$spalte1, $spalte2, $spalte3);

$dbh=DBI->diconnect();
D'OH
Daniel
renee
 2008-01-16 11:48
#104780 #104780
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
da du shift verwendest, muss es @_[0..2] heißen!
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Duff
 2008-01-16 11:58
#104781 #104781
User since
2006-10-06
283 Artikel
BenutzerIn

user image
renee+2008-01-16 10:48:36--
da du shift verwendest, muss es @_[0..2] heißen!

Stimmt, mit shift entferne ich ja das erste Element aus dem Array.

Muss ich denn jetzt trotzdem noch das undef benutzen?
Ich verstehe das leider noch immer nicht genau.
D'OH
Daniel
renee
 2008-01-16 12:16
#104784 #104784
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ja, das undef musst Du benutzen, weil DBI als zweiten Parameter die Attribute erwartet. Wenn Du das undef weglässt, denkt DBI, dass der Wert für Spalte1 die Attribute sind und da das keine Hashref ist, wird das fehlschlagen. Außerdem erwartet DBI in dem Beispiel 3 bind-Parameter und ohne das undef bekommt DBI nur zwei...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Duff
 2008-01-16 12:53
#104791 #104791
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Alles klar. Habe es nun verstanden.

Vielen Dank.
D'OH
Daniel
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2008-01-15 16:34.