Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 (Deutsch) » SQL Anywhere Server - Programmierung » Perl/DBI-Unterstützung » Perl-Skripten, die DBD::SQLAnywhere verwenden

 

Ergebnismengen mit Perl DBI abrufen

Nachdem Sie ein Handle für eine offene Verbindung erhalten haben, können Sie auf die Daten in der Datenbank zugreifen und sie ändern. Der einfachste Vorgang ist dabei, einige Zeilen abzurufen und auszudrucken.

SQL-Anweisungen, die Zeilenmengen zurückgeben, müssen vor ihrer Ausführung vorbereitet werden. Die prepare-Methode gibt ein Handle für diese Anweisung zurück. Mit diesem Handle führen Sie die Anweisung aus. Anschließend rufen Sie die Metadaten der Ergebnismenge und die Zeilen der Ergebnismenge ab.



#!/usr/local/bin/perl -w
#
use DBI;
use strict;
my $database = "demo";
my $data_src = "DBI:SQLAnywhere:SERVER=$database;DBN=$database";
my $uid      = "DBA";
my $pwd      = "sql";
my $sel_stmt = "SELECT ID, GivenName, Surname
                FROM Customers
                ORDER BY GivenName, Surname"; 
my %defaults = (
     AutoCommit => 0, # Require explicit commit or rollback.
     PrintError => 0
   );
my $dbh = DBI->connect($data_src, $uid, $pwd, \%defaults)
  or die "Cannot connect to $data_src: $DBI::errstr\n";
&db_query($sel_stmt, $dbh);
$dbh->rollback;
$dbh->disconnect;
exit(0);

sub db_query {
      my($sel, $dbh) = @_;
      my($row, $sth) = undef;
      $sth = $dbh->prepare($sel);
      $sth->execute;
      print "Fields:     $sth->{NUM_OF_FIELDS}\n";
      print "Params:     $sth->{NUM_OF_PARAMS}\n\n";
      print join("\t\t", @{$sth->{NAME}}), "\n\n";
      while($row = $sth->fetchrow_arrayref) {
         print join("\t\t", @$row), "\n";
      }
      $sth = undef;
}
__END__

Vorbereitete Anweisungen werden vom Datenbankserver nicht gelöscht, bis der Perl-Anweisungshandle entfernt wird. Sie entfernen einen Anweisungshandle, indem Sie die Variable erneut verwenden oder auf "undef" setzen. Durch den Aufruf der finish-Methode wird der Handle nicht gelöscht. Die finish-Methode sollte grundsätzlich nur dann aufgerufen werden, wenn eine Ergebnismenge nicht gelesen werden soll.

Um Handle-Leaks zu erkennen, begrenzt der SQL Anywhere-Datenbankserver standardmäßig die Anzahl von Cursorn und vorbereiteten Anweisungen auf maximal 50 pro Verbindung. Der Ressourcenwächter generiert automatisch einen Fehler, wenn diese Grenzwerte überschritten werden. Wenn dieser Fehler auftritt, suchen Sie nach nicht entfernten Anweisungshandles. Verwenden Sie prepare_cached mit Bedacht, da die Anweisungshandles nicht entfernt werden.

Erforderlichenfalls können Sie diese Grenzwerte ändern, indem Sie die Optionen max_cursor_count und max_statement_count definieren.

 Siehe auch