Schrift
[thread]11111[/thread]

query wird nicht ausgeführt

Leser: 1


<< >> 9 Einträge, 1 Seite
plautzenpa
 2008-01-08 17:45
#104490 #104490
User since
2008-01-08
4 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich habe folgende Query:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
my $tabelle = shift;

    # Neue Spalten hinzufügen
    $sql = "ALTER TABLE $tabelle ADD _email_first_part VARCHAR( 255 ) NOT NULL AFTER email, ADD _email_last_part VARCHAR( 255 ) NOT NULL AFTER _email_first_part";
    $dbh->do($sql);
    if($DBI::err) { dbError("3084 dbUpdateEmailPartRows (SQL: $sql) (do): $DBI::errstr"); return 0; }

    # Index über diese Spalten legen
    $sql = "ALTER TABLE $tabelle ADD INDEX ( _email_first_part , _email_last_part )";
    $dbh->do($sql);
    if($DBI::err) { dbError("3089 dbUpdateEmailPartRows (SQL: $sql) (do): $DBI::errstr"); return 0; }

    # Daten aus der Spalte 'email' erzeugen und in die neuen Spalten einfügen.
    $sql = "UPDATE $tabelle SET _email_first_part = SUBSTR( email, 1, POSITION( '\@' IN email) ), _email_last_part = SUBSTRING( email, POSITION( '\@' IN email) , LENGTH( email ) - POSITION( '\@' IN email ) +1 )";
    $dbh->do($sql);
    if($DBI::err) { dbError("3094 dbUpdateEmailPartRows (SQL: $sql) (do): $DBI::errstr"); return 0; }


Die ersten beiden werden richtig ausgeführt, das letzte nicht. Es wird auch keine Fehlermeldung im errstr zurückgegeben.
Führe ich den letzten alleine aus, wenn die ersten schon fertig sind, funktioniert es.

Was mache ich falsch?

Vielen Dank im Voraus
Chris
nepos
 2008-01-08 18:23
#104493 #104493
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Du könntest dich mal mit der trace-Option spielen. Damit werden sehr viele interne Infos von DBI ausgegeben. Siehe auch den Abschnitt TRACING in der Doku zu DBI.
plautzenpa
 2008-01-08 18:33
#104495 #104495
User since
2008-01-08
4 Artikel
BenutzerIn
[default_avatar]
Hallo,

danke, das werd ich mal versuchen.

Folgendes habe ich noch entdeckt:
System auf dem es nicht funktioniert:
Perl 5.8.6 MySQL 4.1.10

Ein anderes System auf dem ich es eben getestet habe und dort geht es!
Perl 5.8.4 MySQL 4.1.22

Sollte es allein an der MySQL Version liegen?
nepos
 2008-01-08 18:44
#104496 #104496
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Schwer zu sagen. Versuch mal das mit dem Trace, vielleicht gibts da was zu finden.
Ansonsten fallen mir spontan nur noch Transaktionen ein, die hier querschiessen könnten.
MartinR
 2008-01-09 08:18
#104518 #104518
User since
2004-06-17
305 Artikel
BenutzerIn
[default_avatar]
plautzenpa+2008-01-08 16:45:33--
Führe ich den letzten alleine aus, wenn die ersten schon fertig sind, funktioniert es.


Vielleicht liegts daran: Evtl. dauert ja das Setzen des Index zu lange, dass die Tabelle noch gesperrt ist wenn Du mit der dritten Anweisung kommst. Wieviele Datensätze sind es denn? Die andere MySQL-Version ist evtl. schneller oder auf einer anderen Maschine. Mach doch mal eine Pause dazwischen ...
plautzenpa
 2008-01-09 10:51
#104520 #104520
User since
2008-01-08
4 Artikel
BenutzerIn
[default_avatar]
Hallo,

mit ner Pause con 10 Sec. hab ichs auch schon versucht, leider auch kein Erfolg :-(

Trotzdem danke :-)
nepos
 2008-01-09 12:04
#104529 #104529
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Was haben denn die Trace-Ausgaben ergeben?
Am besten einmal auf der Maschine, wo es klappt und dann nochmal auf der, wo es nicht geht. Dann kann man da mal vergleichen...

Ne Pause in den SQL-Befehlen wäre für mich komisch. Für meine Begriffe darf DBI->do erst returnen, wenn das Statement fertig ist. Denke also nicht, dass es sowas ist.
Tippe immer noch auf Transaktionen, die hier nicht richtig abgeschlossen werden oder etwas in der Art...
plautzenpa
 2008-01-09 13:05
#104531 #104531
User since
2008-01-08
4 Artikel
BenutzerIn
[default_avatar]
Jetzt muss ich mal anfänger-mässig fragen, ob ich das mit trace richtig mache:

Code (perl): (dl )
$res = $dbh->trace(2);


Das gibt mir nur eine 2 zurück... also ist das bestimmt falsch...
nepos
 2008-01-09 15:00
#104539 #104539
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Du hast dir anscheinend die Doku nicht genau durchgelesen :)
Der Aufruf von trace() setzt das Trace-Level und liefert das alte Level als Wert zurück.
Wenn das Trace-Level ungleich 0 ist, gibt dir DBI je nach Level mehr oder weniger Informationen aus.
Du packst also einfach den Aufruf von trace() vor deine SQL-Aufrufe dazu. Dann sollten auf STDERR die entsprechenden Trace-Meldungen auflaufen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
my $tabelle = shift;

# Neue Spalten hinzufügen
$sql = "ALTER TABLE $tabelle ADD _email_first_part VARCHAR( 255 ) NOT NULL AFTER email, ADD _email_last_part VARCHAR( 255 ) NOT NULL AFTER _email_first_part";
$dbh->do($sql);
if($DBI::err) { dbError("3084 dbUpdateEmailPartRows (SQL: $sql) (do): $DBI::errstr"); return 0; }

# Index über diese Spalten legen
$sql = "ALTER TABLE $tabelle ADD INDEX ( _email_first_part , _email_last_part )";
$dbh->do($sql);
if($DBI::err) { dbError("3089 dbUpdateEmailPartRows (SQL: $sql) (do): $DBI::errstr"); return 0; }

# Da hier der Fehler ist, trace einschalten
$dbh->trace(2);

# Daten aus der Spalte 'email' erzeugen und in die neuen Spalten einfügen. $sql = "UPDATE $tabelle SET _email_first_part = SUBSTR( email, 1, POSITION( '\@' IN email) ), _email_last_part = SUBSTRING( email, POSITION( '\@' IN email) , LENGTH( email ) - POSITION( '\@' IN email ) +1 )";
$dbh->do($sql);
if($DBI::err) { dbError("3094 dbUpdateEmailPartRows (SQL: $sql) (do): $DBI::errstr"); return 0; }

# Und Trace wieder abschalten
$dbh->trace(0);


Wenn dir das mit STDERR nicht gefällt, dann kannst du die Ausgabe von Trace auch in eine Datei umleiten:
Code (perl): (dl )
$dbh->trace(2,'/tmp/dbi_trace.log');
<< >> 9 Einträge, 1 Seite



View all threads created 2008-01-08 17:45.