Beate Mielke: Perl - MySQL

Hallo Forum,

schoen, dass man hier wieder fragen kann :-)

Ich kriege es einfach nicht hin, select-Anfragen über Perl an MySQL an eine Perl-Variable zu übergeben, und die dann auszulesen.

Das habe ich:

my $dbh = ...
my $sth = $dbh->prepare('select * from TABLE where A="abc" and B="123"');
$sth->execute();

Ich möchte jetzt wissen, was Perl mir als Ergebnis zurückliefert. Z.B. ob das Ergebnis leer ist, also ob "select" eine leere Menge zurueckgeliefert hat, und wenn nicht, mit welchem Befehl kann ich an das Ergebnis herankommen?

Ausserdem koennen die Ergebnisse von Abfrage zu Abfrage ja sehr unterschiedlich ausfallen. Zum Beispiel verschiedene Anzahlen an Zeilen oder Spalten.

Weiß jemand wie das geht?

Viele Grüße

Beate Mielke

  1. hi!

    my $dbh = ...
    my $sth = $dbh->prepare('select * from TABLE where A="abc" and B="123"');
    $sth->execute();

    Ich möchte jetzt wissen, was Perl mir als Ergebnis zurückliefert.
    Z.B. ob das Ergebnis leer ist, also ob "select" eine leere Menge
    zurueckgeliefert hat, und wenn nicht, mit welchem Befehl kann ich
    an das Ergebnis herankommen?

    while (my @data = $sth->fetchrow_array)
    {
      print "Spalte 1: $data[0], Spalte 2: $data[1], ...";
    }

    Bei dieser Methode musst du natürlich wissen, in welcher Reihenfolge du die Spalten deiner Tabelle ausgeben lässt, aber das kannst du ja im SELECT-Statement mit angeben: SELECT Spalte3, Spalte5, Spalte1 FROM tabelle.

    Statt fetchrow_array kannst du auch noch fetchrow_arrayref und fetchrow_hashref verwenden, die beide eine Referenz zurückgeben, und zwar auf einen Hash oder ein Array. Ich bin mir jetzt nicht ganz sicher, wie das funktioniert. Ungefähr so:

    while (my $data = $sth->fetchrow_hashref) { ... }

    Jedes $data ist dann eine Referenz auf ein Hash. Um das Hash auszulesen musst du mal in der Perl-Dokumentation die Stellen zur Dereferenzierung durchlesen, kenne ich jetzt nicht auswendig.

    bye, Frank!

    1. Hallo Frank,

      while (my @data = $sth->fetchrow_array)
      {
        print "Spalte 1: $data[0], Spalte 2: $data[1], ...";
      }

      Das klingt ja schonmal sehr vielversprechend. Allerdings habe ich im Moment noch soviele andere Fehlermeldungen, daß ich noch nicht herausfinden kann, ob es läuft.

      Statt fetchrow_array kannst du auch noch fetchrow_arrayref und fetchrow_hashref verwenden, die beide eine Referenz zurückgeben, und zwar auf einen Hash oder ein Array. Ich bin mir jetzt nicht ganz sicher, wie das funktioniert. Ungefähr so:

      while (my $data = $sth->fetchrow_hashref) { ... }

      Muss das hier nicht @data heissen?

      Jedes $data ist dann eine Referenz auf ein Hash. Um das Hash auszulesen musst du mal in der Perl-Dokumentation die Stellen zur Dereferenzierung durchlesen, kenne ich jetzt nicht auswendig.

      Übrigens, wenn Du eine gute deutsche Dokumentation zu dem Thema kennen solltest, lass es mich bitte wissen.

      Viele Gruesse

      Beate Mielke

      1. Hallo,

        while (my @data = $sth->fetchrow_array)
        {
          print "Spalte 1: $data[0], Spalte 2: $data[1], ...";
        }
        Das klingt ja schonmal sehr vielversprechend. Allerdings habe ich im Moment noch soviele andere Fehlermeldungen, daß ich noch nicht herausfinden kann, ob es läuft.

        Also bei mir läuft's so ähnlich schon lange... :)

        while (my $data = $sth->fetchrow_hashref) { ... }
        Muss das hier nicht @data heissen?

        Nein, wenn dann wäre es ein "%data" - aber hier bekommst du eine Referenz zurück. Das ist sowas ähnliches wie die Pointer in C, wenn dir das weiterhilft.
        Auf den Inhalt kannst du dann mit $$data{"feldname"} zugreifen.
        Oder du verwendest "my %data = %{$sth->fetchrow_hashref}" (bewirkt dasselbe wie $dataref = $sth->fetchrow_hashref; %data = %$dataref;), dann hast du einen "normalen" Hash.

        Übrigens, wenn Du eine gute deutsche Dokumentation zu dem Thema kennen solltest, lass es mich bitte wissen.

        Sorry, ich kenn auch nur die Man-Pages (bei ActivePerl pratischerweise als HTML dabei) und CPAN...

        Ciao,
        Mirko

        1. Hallo,

          while (my @data = $sth->fetchrow_array)
          {
            print "Spalte 1: $data[0], Spalte 2: $data[1], ...";

          Das ist so richtig. Eine andere Variante (bei relativ wenigen Variablen) die ich häufig anwende:

          $sth=$db->prepare("SELECT var1, var2, var3... FROM datenbank WHERE ...);
          $sth->execute();

          while (($var1, $var2, $var3) = $sth->fetchrow_array())
          { und hier die einzelnen Variablen verwenden }

          Und wenn Du die Variablennamen analog der Feldbezeichenr in der Datenbank verwendest, brauchst Du nicht soviel über die Indices nachdenken.

          Gruß
          Timothy

      2. Hallo Beate,

        Übrigens, wenn Du eine gute deutsche Dokumentation zu dem Thema kennen solltest, lass es mich bitte wissen.

        Ich habe nicht genau verstanden, ob du nach einer Doku zu Referenzen oder zu dem DBI Modul suchst. Für DBI guck doch mal in:
        http://www.ora.de/german/perl/perlmod/manpages/dbi.htm

        Uli

        1. Hallo Uli,

          Ich habe nicht genau verstanden, ob du nach einer Doku zu Referenzen oder zu dem DBI Modul suchst. Für DBI guck doch mal in:
          http://www.ora.de/german/perl/perlmod/manpages/dbi.htm

          merci beaucoup - endlich mal eine deutsche Anleitung zu so einem komplizierten Thema

          viele Gruesse

          Beate Mielke

    2. Hi!
      Eine perfekte Step-by-Step-Beschriebung findest Du eigentlich unter www.perl-archiv.de . Leider ist die Site heute gerade nicht verfügbar, falls Du möchtest kann ich Dir sie aber als .zip senden, hatte sie mir mal gespeichert.

      Gruß Torsten

      1. Hi!
        Eine perfekte Step-by-Step-Beschriebung findest Du eigentlich unter www.perl-archiv.de .

        Der genaue Link ist http://www.perl-archiv.de/perl/odbc/odbc.shtml
        ist zwar eine Beschriebung für Win und Access, funktioniert aber (zumindest was das Perl-Script angeht) auch unter UNIX und mit mySQL.

        Gruß Torsten