Cruz: DBI::st=HASH(0xd18dc)

Hallihallo,

die DBI Funktionen prepare() und execute geben mir so ein Ding zurück.

Also z.B. $cursor = $dblink->prepare("select * from user");

dann ist $cursor = DBI::st=HASH(0xd18dc), wenn ich $cursor einfach mit print ausgebe.

Gibt es eine Möglichkeit so ein Ding aufzulösen und eine klare Information zu erhalten, wie z.B. wie viele rows meine SQL Abfrage zurückliefert?

Und was sind diese "Dinger" eigentlich ganz genau? Ich weiß, daß man solche Teile erhält, wenn man z.B. eine Referenz zu einem Array ausgibt...aber das hier ist noch ein bisschen anders.

Vielen Dank
Cruz

  1. Hi Cruz!

    dann ist $cursor = DBI::st=HASH(0xd18dc), wenn ich $cursor einfach mit print ausgebe.

    Und was sind diese "Dinger" eigentlich ganz genau? Ich weiß, daß man solche Teile erhält, wenn man z.B. eine Referenz zu einem Array ausgibt...aber das hier ist noch ein bisschen anders.

    Nun ja, es ist offensichtlich eine Referenz auf einen Hash. Kannst Du mit

    print("$key = $value\n") while (($key, $value) = each(%$cursor));

    ausgeben.

    Ich kenne DBI nicht, aber ich nehme an, auf das 'prepare' muss auch noch ne Art 'execute' folgen, bevor Du Dein Ergebnis bekommst. Da kann Dir das Manual sicher weiterhelfen.

    So long

    1. ...aber das hier ist noch ein bisschen anders.

      Nun ja, es ist offensichtlich eine Referenz auf einen Hash. Kannst Du mit

      print("$key = $value\n") while (($key, $value) = each(%$cursor));

      ausgeben.

      Funktioniert leider nicht. :( Die Zeile gibt gar nichts aus.

      Danke trotzdem
      Cruz

  2. Hallihallo,

    die DBI Funktionen prepare() und execute geben mir so ein Ding zurück.

    Also z.B. $cursor = $dblink->prepare("select * from user");

    dann ist $cursor = DBI::st=HASH(0xd18dc), wenn ich $cursor einfach mit print ausgebe.

    Gibt es eine Möglichkeit so ein Ding aufzulösen und eine klare Information zu erhalten, wie z.B. wie viele rows meine SQL Abfrage zurückliefert?

    Und was sind diese "Dinger" eigentlich ganz genau? Ich weiß, daß man solche Teile erhält, wenn man z.B. eine Referenz zu einem Array ausgibt...aber das hier ist noch ein bisschen anders.

    $curser ist eine referenz auf einen Hash.
    Du sprichst die Inhalte so an:
    $curser->{'keyname'}

    Wenn du alle Keys ausgeben   willst:

    foreach $key (keys %{$curser}) {
      print "$key = $curser->{$key}\n";
    }

    Alternative, falls in diesen Hashwerten rekursiv weiter auf hashes verwiesen wird
    ist mit der Abfrage ref() zu testen was es ist.

    Noch besser:
    Hol dir das Modul Data::Dumper
      
      my $cursor = $dblink->prepare("select * from user");
      use Data::Dumper;
      print Dumper($curser);

    Ciao,
      Wolfgang

    1. Hallo Wolfgang,

      »

      Wenn du alle Keys ausgeben   willst:

      foreach $key (keys %{$curser}) {
        print "$key = $curser->{$key}\n";
      }

      das ist doch das selbe, was Calocybe gesagt hat:
      print("$key = $value\n") while (($key, $value) = each(%$cursor));

      und das gibt leider gar nichts aus. Ich habe die Referenz von $cursor mit ref($cursor) abgefragt:

      $cursor = $dblink -> prepare("select * from user");
      print ref($cursor);

      und das gibt witzigerweise "DBI::st" aus.
      D.h. $cursor ist nicht einfach nur eine Referenz, da steckt noch etwas mehr dahinter.

      Ich habe auch versucht einfach mal mit print DBI::st auszugeben, das gibt auch nichts. In der DBI Doku habe ich auch nichts über DBI::st gefunden.

      Oh god I`m so lost!

      Danke trotzdem!
      Cruz

      1. das ist doch das selbe, was Calocybe gesagt hat:
        print("$key = $value\n") while (($key, $value) = each(%$cursor));

        Richtig.

        und das gibt leider gar nichts aus. Ich habe die Referenz von $cursor mit ref($cursor) abgefragt:

        Benutze Data::Dumper, wie es Wolfgang vorgeschlagen hat, wenn Du wissen willst, was eine Variable alles enthaelt und von welchem Typ sie ist. (Aber Vorsicht, solche Listings koennen mitunter sehr lang werden.)

        $cursor = $dblink -> prepare("select * from user");
        print ref($cursor);

        und das gibt witzigerweise "DBI::st" aus.
        D.h. $cursor ist nicht einfach nur eine Referenz, da steckt noch etwas mehr dahinter.

        Es ist also eine Referenz, die in das DBI::st Package ge-blessed wurde. Oder weniger technisch: Es ist ein DBI::st Objekt. Trotzdem ist es nachwievor auch eine Hash-Referenz.

        Ich habe auch versucht einfach mal mit print DBI::st auszugeben, das gibt auch nichts. In der DBI Doku habe ich auch nichts über DBI::st gefunden.

        Also ich hab mal eben bei Active State nachgeschaut, und da findet sich unter <http://www.activestate.com/Products/ActivePerl/docs/site/lib/DBI.html#dbi database handle objects>:

        Prepares a single statement for later execution by the database engine and returns a reference to a statement handle object.
        The returned statement handle can be used to get attributes of the statement and invoke the execute method. See Statement Handle Methods [<http://www.activestate.com/Products/ActivePerl/docs/site/lib/DBI.html#statement handle methods>].
        Note that prepare should never execute a statement, even if it is not a select statement, it only prepares it for execution.

        Weiter oben bei "Notation and Conventions" steht
        $sth    Statement handle object

        Was Du zurueck bekommst, ist also ein statement handle object und, wie ich bereits vermutet hatte, kannst/musst Du von diesem Objekt die execute-Methode aufrufen. Aber wieso liesst Du nicht einfach selber die Dokumentation, steht doch alles drin?

        So long

        1. Benutze Data::Dumper, wie es Wolfgang vorgeschlagen hat, wenn Du wissen willst, was eine Variable alles enthaelt und von welchem Typ sie ist. (Aber Vorsicht, solche Listings koennen mitunter sehr lang werden.)

          Kann ich leider nicht machen. Ich spiele hier sowieso schon Feurwehr und versuche eine Errorhandling für ein sowieso instabiles System einzurichten. Wenn ich noch anfange zusätzliche Module zu installieren, reißen die mir den Kopf ab. Oder ist Data ein Standardmodul? (klingt ganz danach)

          Ist ja auch egal. Das auf jedes prepare ein execute folgen muss, das habe ich schon gerafft. Die Anwendung des DBI Moduls ist hier auch gar nicht das Problem. Ich wollte lediglich die Rückgabe...bzw. die Referenz, die prepare einrichtet auswerten und auf Fehler untersuchen. Nach konsultierung von allen Perl Köpfen, die ich ken (inkl. Selfhtml Forum Besucher) bin ich zum Schluß gekommen, daß es entweder nicht möglich ist diese Referenz auszuwerten, oder es mehr Zeit kostet dahinterzukommen, als ich eigentlich habe.

          Man kann aber den Rückgabewert von execute wunderbar auswerten und daran habe ich mein Error Handling auch geknüpft.

          Es ist also eine Referenz, die in das DBI::st Package ge-blessed wurde. Oder weniger technisch: Es ist ein DBI::st Objekt. Trotzdem ist es nachwievor auch eine Hash-Referenz.

          Uh..über blessing habe ich mal was gelesen...ich muss das gelegentlich nochmal nachschlagen. :)

          Aber wieso liesst Du nicht einfach selber die Dokumentation, steht doch alles drin?

          Ich habe sie gelesen, ich habe meine Doku bei CPAN gefunden, und da steht noch genaueres über die Rückgabewerte von prepare und execute drin. Wei gesagt, prepare schmeißt eine Referenz raus, mit der ich nicht klargekommen bin und daher habe ich gefragt.

          Vielen dank für die Hilfe
          Cruz

  3. Hallihallo,

    die DBI Funktionen prepare() und execute geben mir so ein Ding zurück.

    Also z.B. $cursor = $dblink->prepare("select * from user");

    dann ist $cursor = DBI::st=HASH(0xd18dc), wenn ich $cursor einfach mit print ausgebe.

    Gibt es eine Möglichkeit so ein Ding aufzulösen und eine klare Information zu erhalten, wie z.B. wie viele rows meine SQL Abfrage zurückliefert?

    Und was sind diese "Dinger" eigentlich ganz genau? Ich weiß, daß man solche Teile erhält, wenn man z.B. eine Referenz zu einem Array ausgibt...aber das hier ist noch ein bisschen anders.

    Vielen Dank
    Cruz

    gruesse,
    also, was Du von prepare() zurueckbekommst ist ein sogenanntes statement-handle,
    waehrend $dblink ein sog. database-handle ist.
    sicherlich, es ist eine referenz auf ein hash, oder auch eine objekt-instanz oder was auch immer, je nach betrachtungsweise.
    aber wen interessierts!!
    normalerweise solltes Du nicht auf die werte dieses hashs direkt zugreifen muessen. dafuer gibt es funktionen, welche durch DBI
    und dem Datenbank-Modul (DBD::xxx) bereitgestellt werden.
    wie ich dem text entnehme, willst Du eigentlich die anzahl der datensaetze wissen, welches dieses statement
    zurueckliefern wird. spielts nicht, oder nicht immer, auf jeden fall nicht ohne execute().
    Informationen ueber die Daten, wie Spaltennamen, Datentypen und rowcount usw., bekommt man nicht immer
    geliefert, das ist vom DBD-modul abhaengig.
    bitte aufmerksam die doku von DBI und dem entsprechenden DBD-modul lesen.
    sonst hilft nur noch 'Programming the Perl DBI' aus dem Hause O'Reilley.

    viel spass noch
    klaus