Perl DBI 数据库操做

本次会议将教你如何使用PERL访问Oracle数据库和其余数据库。html

  • Oraperl模块以访问Oracle,请查看Oraperl手册mysql

  • DBI模块使用通用的方式来访问数据库。在本章中,咱们将讨论这个模块。sql

自Perl 5中已经变得很是容易使用DBI编写数据库应用程序. DBI表明独立于数据库的接口Perl DBI为Perl代码和底层数据库之间提供了一个抽象层,这意味着, 让你能够很容易地切换数据库的实现方式。数据库

DBI是一个Perl 编程语言的数据库访问模块。 它定义了一套方法,变量和约定来提供一个一致的数据库接口, 独立于实际使用的数据库。编程

DBI应用程序的体系结构

DBI是独立于现有的任何数据库在后端。不管你正在使用Oracel,MySQL,Informix等,您可使用DBI。下面是一个结构图。后端

DBI是负责全部经过API,应用程序编程接口执行SQL命令,并派遣他们实际执行相应的驱动程序。最后DBI是负责任的驱动程序,它给调用scritp结果。yii

标记和惯例

整个这一章中,将使用下面的符号而且它建议,你也应该遵循相同的约定。编程语言

  $dsn    Database source name
  $dbh    Database handle object
  $sth    Statement handle object
  $h      Any of the handle types above ($dbh, $sth, or $drh)
  $rc     General Return Code  (boolean: true=ok, false=error)
  $rv     General Return Value (typically an integer)
  @ary    List of values returned from the database.
  $rows   Number of rows processed (if available, else -1)
  $fh     A filehandle - by www.yiibai.com
  undef   NULL values are represented by undefined values in Perl
  \%attr  Reference to a hash of attribute values passed to methods

数据库链接

假设咱们要使用MySQL数据库。链接到数据库以前,请确保如下:学习

  • 你已经建立了数据库 TESTDB。fetch

  • 你已经建立表TEST_TABLE 在 TESTDB中。

  • 这个表有如下几个字段 FIRST_NAME, LAST_NAME, AGE, SEX 和 INCOME.

  • 数据库用户ID(用户名) "testuser" 和密码 "test123" 设置正确能访问到 TESTDB

  • Perl DBI模块已经安装在你的机器上。

  • 你已经经历了MySQL教程,并学习了解MySQL的基础。

如下是一个链接到 MySQL 数据库 "TESTDB"的例子

#!/usr/bin/perl

use DBI
use strict;

  my $driver = "mysql"; 
  my $database = "TESTDB";
  my $dsn = "DBI:$driver:database=$database";
  my $userid = "testuser";
  my $password = "test123";
  my $dbh = DBI->connect($dsn, $userid, $password ) 
              or die $DBI::errstr;

若是创建与数据源的链接,而后将返回一个数据库句柄,并保存到$dbh为进一步使用,不然$dbh设置为undef值和$DBI :: errstr返回一个错误字符串。

插入操做

你要建立或写入表TEST_TABLE记录时,INSERT操做是必需的。所以,一旦咱们创建数据库链接,咱们准备建立记录TEST_TABLE。如下是建立单记录到TEST_TABLE的步骤。以相似的方式,您能够建立多条记录。

记录建立须要如下步骤

  • 准备SQL语句使用INSERT语句。这项工做将使用prepare() API.

  • 执行SQL查询从数据库中选择的结果。这将经过使用execute() API.

  • 释放语句句柄。经过使用finish() API

  • 若是一切顺利,而后 commit此操做,不然你能够rollback 完成事务。提交和回滚解释在接下来的章节。

 my $sth = $dbh->prepare("INSERT INTO TEST_TABLE
                          (FIRST_NAME, LAST_NAME, SEX, AGE, INCOME )
                           values
                          ('john', 'poul', 'M', 30, 13000)");
 $sth->execute() or die $DBI::errstr;
 $sth->finish();
 $dbh->commit or die $DBI::errstr;

使用绑定值

当没有事先给出被输入的值时,有可能出现一种状况。 在这样的状况下,绑定的值被使用。使用一个问号代替实际值和实际值,而后经过execute() API。

 my $first_name = "john";
 my $last_name = "poul";
 my $sex = "M";
 my $income = 13000;
 my $age = 30;
 my $sth = $dbh->prepare("INSERT INTO TEST_TABLE
                          (FIRST_NAME, LAST_NAME, SEX, AGE, INCOME )
                           values
                          (?,?,?,?)");
 $sth->execute($first_name,$last_name,$sex, $age, $income) 
             or die $DBI::errstr;
 $sth->finish();
 $dbh->commit or die $DBI::errstr;

读取操做

任何数据库的读操做是指从数据库中获取一些有用的信息。所以,一旦咱们创建数据库链接,咱们已经准备好到这个数据库中进行查询。如下是程序查询年龄大于20的全部记录。这将须要四个步骤

  • 准备SQL基于SQL查询所需的条件。这项工做将使用prepare() API.

  • 执行SQL查询从数据库中选择的结果。这项工做将使用execute()API。

  • 提取全部结果一个接一个,打印这些结果。这将使用 fetchrow_array() API.

  • 释放语句句柄。这将使用 finish() API

  my $sth = $dbh->prepare("SELECT FIRST_NAME, LAST_NAME
                           FROM TEST_TABLE 
                           WHERE AGE > 20");
  $sth->execute() or die $DBI::errstr;
  print "Number of rows found :" + $sth->rows;
  while (my @row = $sth->fetchrow_array()) {
     my ($first_name, $last_name ) = @row;
     print "First Name = $first_name, Last Name = $last_name\n";
  }
  $sth->finish();

使用绑定值

尚未事先给出的条件时,有可能出现一种状况。在这样的状况下,绑定的值被使用。采用的是一个问号代替实际值和实际值,而后经过execute() API. 下面的例子。

$age = 20;
  my $sth = $dbh->prepare("SELECT FIRST_NAME, LAST_NAME
                           FROM TEST_TABLE
                           WHERE AGE > ?");
  $sth->execute( $age ) or die $DBI::errstr;
  print "Number of rows found :" + $sth->rows;
  while (my @row = $sth->fetchrow_array()) {
     my ($first_name, $last_name ) = @row;
     print "First Name = $first_name, Last Name = $last_name\n";
  }
  $sth->finish();

更新操做

任何数据库更新操做意味着已经能够在数据库中更新一个或多个记录。如下是更新全部的记录SEX 更新为'M'的过程。 在这里,咱们将增长AGE的全部男性一年。 这将须要三个步骤

  • 准备SQL查询基于所需的条件。这项工做将使用 prepare() API.

  • 执行SQL查询从数据库中选择的结果。这项工做将使用execute() API.

  • 释放语句句柄。这项工做将使用finish() API

  • 若是一切顺利,而后提交此操做,不然你能够回滚完成事务。请参阅下一节的提交和回滚的API。

  my $sth = $dbh->prepare("UPDATE TEST_TABLE
                           SET   AGE = AGE + 1 
                           WHERE SEX = 'M'");
  $sth->execute() or die $DBI::errstr;
  print "Number of rows updated :" + $sth->rows;
  $sth->finish(); // by www.yiibai.com
  $dbh->commit or die $DBI::errstr;

使用绑定值

若是没有事先给出的条件时,有可能出现一种状况。在这样的状况下,绑定的值被使用。采用的是一个问号代替实际值和实际值,而后经过 execute()API.,下面的例子。

$sex = 'M';
  my $sth = $dbh->prepare("UPDATE TEST_TABLE
                           SET   AGE = AGE + 1
                           WHERE SEX = ?");
  $sth->execute('$sex') or die $DBI::errstr;
  print "Number of rows updated :" + $sth->rows;
  $sth->finish();
  $dbh->commit or die $DBI::errstr;

在某些状况下,你想设置一个值,这是不预先给定的,因此你可使用绑定值以下。在此示例中,将被设置的全部男性收入为10000。

$sex = 'M';
  $income = 10000;
  my $sth = $dbh->prepare("UPDATE TEST_TABLE
                           SET   INCOME = ?
                           WHERE SEX = ?");
  $sth->execute( $income, '$sex') or die $DBI::errstr;
  print "Number of rows updated :" + $sth->rows;
  $sth->finish();

删除操做

DELETE操做是必需的,当你想从数据库中删除一些记录。下面的程序是删除TEST_TABLE全部年龄等于30的记录。 此操做将采起如下措施。

  • 准备SQL查询基于所需的条件。这项工做将使用 prepare() API。

  • 执行SQL查询到所需的记录,从数据库中删除。这项工做将使用 execute() API.

  • 释放语句句柄。 这项工做将使用 finish() API

  • 若是一切顺利,而后提交此操做,不然你能够回滚完成事务。

  $age = 30;
  my $sth = $dbh->prepare("DELETE FROM TEST_TABLE
                           WHERE AGE = ?");
  $sth->execute( $age ) or die $DBI::errstr;
  print "Number of rows deleted :" + $sth->rows;
  $sth->finish();
  $dbh->commit or die $DBI::errstr;

使用do 语句

若是你在使用UPDATE, INSERT, DELETE,那将没有返回从数据库中的数据,因此,有一个捷径来执行此操做。您可使用 do 语句执行的任何命令。

$dbh->do('DELETE FROM TEST_TABLE WHERE age =30');

do 返回一个值假如它执行成功, 若是失败返回false值。其实,若是成功的话返回受影响的行数。在这个例子中,它会返回实际删除的行数。

提交操做

Commit是操做数据库来完成的变化给出了一个绿色的信号,此操做后没有变化,能够恢复。

下面是一个简单的例子来调用commit API.

$dbh->commit or die $dbh->errstr;

回滚操做

若是您不满意的变化,你想恢复这些变化,而后使用 rollback API.

下面是一个简单的例子来调用 rollback API.

$dbh->rollback or die $dbh->errstr;

开始事务

许多数据库支持事务。这意味着,你能够作一大堆的查询将要修改的数据库,但其实是没有变化。 而后在结束时发出特殊的SQL查询语句:COMMIT,而后全部的修改同时进行。或者您能够发出查询 ROLLBACK,在这种状况下,全部查询都被丢弃。

begin_work API使事务(经过关闭自动提交),直到下一次调用commit或rollback。 一个COMMIT或ROLLBACK后,自动提交将被自动打开了。

$rc  = $dbh->begin_work   or die $dbh->errstr;

自动提交选项

若是你的事务很简单,你能够保存,不用发出了不少提交。当您链接调用,您能够指定一个自动提交选项,将执行自动提交操做后,每个成功的查询。这里它看起来像:

my $dbh = DBI->connect($dsn, $userid, $password,
              {AutoCommit => 1}) 
              or die $DBI::errstr;

在这里,将AutoCommit值设置为1或0。

自动错误处理

当你链接调用,你能够指定一个引起错误的选项,自动为您处理错误。当发生错误时,DBI将终止您的程序,而不是返回一个故障代码。若是你想要的是停止程序上的错误,这多是方便。这里它看起来像这样:

my $dbh = DBI->connect($dsn, $userid, $password,
              {RaiseError => 1})
              or die $DBI::errstr;

这里RaiseError 值能够是1或0。

断开数据库连接

要断开数据库链接,使用disconnect API.

$rc = $dbh->disconnect  or warn $dbh->errstr;

本次事务行为与disconnect方法,是不肯定的。 一些数据库系统(如Oracle和Ingres)会自动提交全部未完成的更改, 但另外一些(如Informix)将回滚任何未完成的更改。 不使用自动提交的应用程序必须显式的调用commit或rollback,而后再调用断开。