Perl DBI ¤Jªù

¥Ø¿ý

¥»¤å¬O¥H "Perl DBI Examples by Jeffrey William Baker" ¬°ÂÅ¥»¡A°t¦X DBMaker ¦n¾Ç©ö¥Îªº¯S©Ê¡A¥H¤Î´X­Ó²LÅã©öÀ´ªº¨Ò¤l¡A§Æ±æ¯à°÷¤@¨B¨B¦a±a»â¨Ï¥ÎªÌ¾Ç²ß Perl DBI modules ¦s¨ú DBMaker ¸ê®Æ®wªº¤èªk¡C¦Ó­ì§@ªÌ¼¶¼g¥D­n­ì°Ê¤O¬O§Æ±æÂǥѳo½g¤å³¹ªº°Ý¥@¡A¥H­°§C DBI mailing list ¤¤¤@¦A­«½Æ¥X²{ªº FAQ¡C

Ū§¹¥»¤å¤§«á¡A§Ú­Ì´N¯à¾Ç¨ì§Q¥Î DBI «Ø¥ß¤@­Ó§¹³Æªº¸ê®Æ®wµ{¦¡¡C ¥H¤U´N¥ý¥Ñ DBI ªº°ò¥»¥\¯à¶}©l¡AµM«á¦A³v¨B¬ã¨s§ïµ½®Ä¯à»P¥i¾a«×§Þ¥©¡C

°ò¥»¥\¯à

DBI - Database independent interface for Perl. Perl DBI ¬O Perl µ{¦¡»y¨¥¦s¨ú¸ê®Æ®w®Éªº¼Ð·ÇÀ³¥Îµ{¦¡¤¶­± (API)¡C DBI ¤¤©w¸q¤F¤@²Õ¨ç¼Æ¡BÅܼƩM¤@­P©Êªº¸ê®Æ®w¤¶­±¡A ¥iº¡¨¬»P¯S©w¸ê®Æ®wµLÃöªº¯S©Ê¡C

­È±o¤@´£ªº¡ADBI ¥u¬O¤@­Óµ{¦¡¤¶­±¡A§Q¥Î¤@²Õ¤Q¤À»´¥©ªº¼h­±¡A ±N§AªºÀ³¥Îµ{¦¡»P¤@­Ó¥H¤Wªº¸ê®Æ®wÅX°Êµ{¦¡ºò±K¦aµ²¦X¦b¤@°_¡A DBI ªº¬[ºc¥D­n¥u¬O´£¨Ñ¼Ð·Çªº¤¶­±¡A¥Øªº¬O¬°¤F¤è«K¨Ï¥ÎªÌ¤U¹F¤@¨Ç²³æªº«ü¥O¡A ´N¥i¥H»´©ö¦aÅý¨º¨ÇÅX°Êµ{¦¡µo´§§@¥Î

­º¥ý¸Ó°µªº¨Æ´N¬O«Øºc¥H¤Î¦w¸Ë DBI¡A ¸Ô²Óªº¨BÆJ¥i°Ñ¦Ò DBI INSTALL ¤å¥ó¤¤¦³»¡©ú. µM«á¦A¨Ó´N¬O«Øºc¥X©Ò»Ýªº¸ê®Æ®wÅX°Êµ{¦¡¡A©Î¬O°Ñ¦Ò DBD. ¦b¨C­Ó DBD ®M¥ó¤¤³£À³¸Ó·|¦³«Øºcµ{§Ç¡C »P¨ä¥L Perl ¼Ò²Õ¬Û¸û¤§¤U¡A ¦w¸Ë DBI/DBD ¨BÆJºâ¬O¬Û·í®e©ö

 localhost:~/DBI-1.08$ perl Makefile.PL && make 
        && make test && make install 

¦b DBI »P DBD ¦w¸Ë§¹¦¨¤§«á¡A ±z¥i¥H°õ¦æ¤U¦C«ü¥O¾\Ū§ó¦hªº¸ê°T:

 localhost:~$ perldoc DBI 

«Ø¥ß³s½u

¨C¤@ºØ¸ê®Æ®w³£¦³¤£¦Pªº³s½u¤è¦¡¡A ­Y¬O·Qª¾¹D¯S®í¥Îªk¡A ½Ð°È¥²¾\Ū DBD ©Ò´£¨Ñªº»¡©ú¤å¥ó¡C ¤U­±ªº¨Ò¤l¬O³s½u¨ì DBMaker ªº°ò¥»¤èªk.

use strict;
use DBI;

my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
                        'jerry',
                        'jerrypassword',
                      );
    

¤W­zªº connect ¨ç¼Æ¥Î¨ì¤F¤T­Ó°Ñ¼Æ: ¸ê®Æ¨Ó·½¦WºÙ (data source name, DSN), ¨Ï¥ÎªÌ¦WºÙ©M±K½X¡C ¨ä¤¤ DSN ªº®æ¦¡¬° dbi:DriverName:instance. ¤£¹L§Ú­Ì­n¦p¦óª¾¹D³s½u¦¨¤£¦¨¥\©O? ­º¥ý¥i¥H¬d¬Ý connect ªº¶Ç¦^­È¡Atrue ¥Nªí¦¨¥\¡Afalse ´N¬O¥Nªí¥¢±Ñ¡C ¨ä¦¸¡A·í¦³¿ù»~µo¥Í®É¡A DBI ·|§â¿ù»~°T®§¦s©ñ¦b package variable $DBI::errstr ¤§¤¤¡C

use strict;
use DBI;

my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
                        'jerry',
                        'jerrypassword',
                      )
          || die "Database connection not made: $DBI::errstr";
$dbh->disconnect();
    

µ²§ô¸ê®Æ®w³s½u½Ð¨Ï¥Î disconnect() ¨ç¼Æ¡A ¥¿½T¦a¨Ï¥Î¥iÁ×§K¿ù»~°T®§ "Database handle destroyed without explicit disconnect" ªºµo¥Í.

¿ï¶µ

¦b³s½u¸ê®Æ®w®É connect() ³o­Ó¤èªk¥i¥H±µ¨ü hash «¬ºAªº¿ï¶µ¡A±`¥Îªº¿ï¶µ¥]¬A¤F: AutoCommit¡A³]¬° true ªí¥Ü¸ê®Æ®w¥æ©ö¦Û°Ê½T»{¡F RaiseError¡A§i¶D DBI ¦b¿ù»~µo¥Í®ÉIJµo¨Ò¥~ croak $DBI::errstr ¦Ó¤£¥u¬O¶È¶Ç¦^¿ù»~¥N½X¡FPrintError¡AÅý DBI ¥Hĵ§i¤è¦¡ warn $DBI::errstr ¶Ç¦^¿ù»~°T®§.

¦b¤U¤@¬qµ{¦¡¤¤¡A¬O§Æ±æ¶i¦æ±Ä¥æ©ö³B²zªº¥Îªk¡A³]©w¦¨ AutoCommit off¡ARaiseError on¡A¦ÓÅý PrintError ¨Ï¥Î¤º©w­È on.

use strict;
use DBI;

my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
                        'jerry',
                        'jerrypassword',
                        {
                          RaiseError => 1,
                          AutoCommit => 0
                        }
                      )
          || die "Database connection not made: $DBI::errstr";
$dbh->disconnect();
    

¦³¤@ÂI­n¯S§Oª`·N¡A¦pªG¸ê®Æ®w¥»¨­¤£¤ä´©¥æ©ö³B²zªº¥\¯à®É¡A³]©w AutoCommit off ·|±µ¦¬¨ì¿ù»~µo¥Íªº¶Ç¦^­È.

¤U¹F SQL

²{¦b¶}©l¥i¥H¹ï§Ú­Ìªº¸ê®Æ®w°µ¤@¨Ç¦³·N¸qªº¨Æ¤F. ¤U¹F¦Ü¸ê®Æ®wªº SQL Üt­z¤À¦¨¨âÃþ. ¤@¬O¬d¸ß«ü¥O¡A¹w´Á·|¦³¼Æµ§¸ê®Æ¶Ç¦^¡A¨Ò¦p SELECT¡A³o¤@Ãþªº«ü¥O§Ú­Ì·|¨Ï¥Î prepare ¤èªk. ¥t¤@Ãþªº«ü¥O¡A¦p CREATE ©M DELETE¡A§Ú­Ì·|¨Ï¥Î do ¤èªk. §Ú­Ì¥ý¬Ý¬Ý«áªÌ¦p¦ó¨Ï¥Î.

³o¤@¬qµ{¦¡¥Ü½d¦b¸ê®Æ®w¤¤«Ø¥ß¤@­Ó­û¤u¸ê®Æªí®æªº¤èªk.

use strict;
use DBI;

my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
                        'jerry',
                        'jerrypassword',
                        {
                          RaiseError => 1,
                          AutoCommit => 0
                        }
                      )
          || die "Database connection not made: $DBI::errstr";

my $sql = qq{ CREATE TABLE employees ( id INTEGER NOT NULL, 
                                       name VARCHAR(128), 
                                       title VARCHAR(128), 
                                       phone CHAR(10) 
                                     ) };
$dbh->do( $sql );
$dbh->commit();
$dbh->disconnect();
    

¶i¶¥¥\¯à

§Ú­Ì¤w¸g¾Ç·|¤F³s½u¸ê®Æ®w¡A¿ù»~°»´ú¡A¥H¤Î¤U¹F²³æªº SQL Üt­zªº¤èªk. ¬O¸Ó¾Ç¤@¨Ç§ó¦³¥Îªºµ{¦¡»yªkªº®É­Ô¤F.

SELECT Üt­z

¦b SQL ªºÜt­z¤¤¡A³Ì±`¨Ï¥Îªº«ü¥O²ö¹L©ó SELECT Üt­z. ¬°¤F¨Ï¥Î SELECT¡A§Ú­ÌÀ³¸Ó¥ý prepare ³o¤@¬qÜt­z¡AµM«á¶i¦æ execute °Ê§@. ¦b¤U­±ªºµ{¦¡¤ù¬q¤¤¡A§Ú­Ì³£·|¨Ï¥Î statement handle $sth ¦³¦s¨ú SELECT ªºµ²ªG.

use strict;
use DBI;

my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
                        'jerry',
                        'jeerrypassword',
                        {
                          RaiseError => 1,
                          AutoCommit => 0
                        }
                      )
          || die "Database connection not made: $DBI::errstr";

my $sql = qq{ SELECT * FROM employees };
my $sth = $dbh->prepare( $sql );
$sth->execute();

$dbh->disconnect();
    

¤W­zµ{¦¡­n¨D DBMaker ¸ê®Æ®w¬°¬d¸ß«ü¥O¥ý·Ç³Æ¦n°õ¦æ­pµe¡A¤§«á¦A°õ¦æ¸Ó¬d¸ß«ü¥O. ¨ì¥Ø«e¬°¤îÁÙ¨S¦³¥ô¦ó¤@µ§°O¿ý¶Ç¦^. µy«á§Ú­Ì·|¨Ï¥Î bind_columns ªº§Þ³N¥H¨ú±o¸ê®Æ®w¿é¥Xªº°O¿ý. bind_columns ¤À§O±N¨C­Ó¿é¥XÄæ¦ìôµ²¨ì¤@­Ó scalar reference. ¤@¥¹©I¥s¨ì fetch ®É¡A³o¨Ç scalars ´N·|¶ñ¤J³o¸ê®Æ®w¶Ç¦^ªº­È.

use strict;
use DBI;

my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
                        'jerry',
                        'jerrypassword',
                        {
                          RaiseError => 1,
                          AutoCommit => 0
                        }
                      )
          || die "Database connection not made: $DBI::errstr";

my $sql = qq{ SELECT id, name, title, phone FROM employees };
my $sth = $dbh->prepare( $sql );
$sth->execute();

my( $id, $name, $title, $phone );
$sth->bind_columns( undef, \$id, \$name, \$title, \$phone );

while( $sth->fetch() ) {
  print "$name, $title, $phone\n";
}

$sth->finish();
$dbh->disconnect();
    

³o­Ë¬O¤@­Ó¦C¦L¥X¥þ¤½¥q¹q¸Ü³sµ¸Ã¯ªº¦n¤èªk¡A¤×¨ä¬O WHERE °Ï¶ôªº¨Ï¥ÎÅý§Ú­Ì»´©ö¦a¨ú¥X©Ò¦³ªº¸ê®Æ¿é¥X! ¤U­±·|§Q¥Î¨ì bind_param ¥ý±N SQL Üt­z°µ¤@¦¸ prepare¡A´N¯à°÷°ª³t¦a°õ¦æ³\¦h¦¸.

use strict;
use DBI;

my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
                        'jerry',
                        'jerrypassword',
                        {
                          RaiseError => 1,
                          AutoCommit => 0
                        }
                      )
          || die "Database connection not made: $DBI::errstr";

my @names = ( "Larry%", "Tim%", "Randal%", "Doug%" );

my $sql = qq{ SELECT id, name, title, phone FROM employees WHERE name LIKE ? };
my $sth = $dbh->prepare( $sql );

for( @names ) {
  $sth->bind_param( 1, $_);
  $sth->execute();

  my( $id, $name, $title, $phone );
  $sth->bind_columns( undef, \$id, \$name, \$title, \$phone );

  while( $sth->fetch() ) {
    print "$name, $title, $phone\n";
  }
}

$sth->finish();
$dbh->disconnect();
    

°ªµ¥§Þ¥©

¥æ©ö¾÷¨î

¨ì¥Ø«e¬°¤î¡A§Ú­Ìªº°Ê§@³£ÁÙ¤£»Ý­n¨Ï¥Î¨ì¥æ©ö¾÷¨îªº¥\¯à¡A¤£¹L·í¤U¹F UPDATE ©Î¬O DELETE Üt­z®É¡A§Ú­Ì´N·|§Æ±æ¨Ï¥Î¨ì¥¦¤F. ®Ú¾Ú DBI ¤å¥ó«ü¥X¡A¦pªG·Q»s§@¤@®Mí©Tªº¥æ©ö¾÷¨î¡A´NÀ³¸Ó°t¦X eval{...} °Ï¶ô¨ÓÄdºI¿ù»~ªºµo¥Í¡A³Ì«á¦A¨Ï¥Î commit ©Î rollback ¨Ó§¹¦¨¾ã­Ó¥æ©öµ{§Ç. ³o´N¬O§Ú­Ì¥H¤U©Ò­n½Íªº¤º®e.

¥»µ{¦¡¥Ü½d«OÃÒ¥|µ§°O¿ý¼g¤J¸ê®Æ®wªº¤èªk.

use strict;
use DBI qw(:sql_types);

my $dbh = DBI->connect( 'dbi:DBMaker:dbsample',
                        'jerry',
                        'jerrypassword',
                        {
                          RaiseError => 1,
                          AutoCommit => 0
                        }
                      )
          || die "Database connection not made: $DBI::errstr";

my @records = (
                [ 0, "Larry Wall",      "Perl Author",  "555-0101" ],
                [ 1, "Tim Bunce",       "DBI Author",   "555-0202" ],
                [ 2, "Randal Schwartz", "Guy at Large", "555-0303" ],
                [ 3, "Doug MacEachern", "Apache Man",   "555-0404" ] 
              );

my $sql = qq{ INSERT INTO employees VALUES ( ?, ?, ?, ? ) };
my $sth = $dbh->prepare( $sql );


for( @records ) {
  eval {
    $sth->bind_param( 1, @$_->[0]);
    $sth->bind_param( 2, @$_->[1]);
    $sth->bind_param( 3, @$_->[2]);
    $sth->bind_param( 4, @$_->[3]);
    $sth->execute();
    $dbh->commit();
  };

  if( $@ ) {
    warn "Database error: $DBI::errstr\n";
    $dbh->rollback(); #just die if rollback is failing
  }
}

$sth->finish();
$dbh->disconnect();
    

ª`·N¨Æ¶µ

  1. Ãö©ó finish ªº©I¥s¦b§Ú­Ìªº¨Ò¤lùب䣬O¥²­nªº. ³o­Ó¨ç¼Æ¾A¥Î©ó statement handle §¹¦¨®É©Ò¨Ï¥Î¡C
  2. ¥Ã»·­n¥[¤W use strict¡C
  3. ¥J²Ó¾\Ū Perl DBI manual ¥H²`¤JÁA¸Ñ DBI ¬[ºc

[ Back To Manuals Index ]


This document rewrite to Chinese by DBMaker team. Last modified 20 May 1999
This document Copyright Jeffrey William Baker. Last modified 10 October 1998
Copyright 2002 SYSCOM Computer Engineering Co. All rights reserved.