设为首页 收藏本站
查看: 736|回复: 0

[经验分享] Perl DBI模块的例子

[复制链接]

尚未签到

发表于 2018-8-31 06:23:57 | 显示全部楼层 |阅读模式
  安装DBI模块
  DBD的包中有介绍。如大多数Perl模块一样,安装DBI/DBD是很容易的:
  localhost:/opt/src/perl_modules/DBI-1.13$ perl Makefile.PL && make && make test && make install
  装完DBI 跟 DBD,你可以这样得到更多的信息:
  localhost:~$ perldoc DBI
  连接数据库:
  连接不同的数据库需要不同的方法。为得到详尽的信息,请阅读DBD的说明文档。 下面的例子适用于连接Oracle:
复制代码代码如下:use strict;  use DBI;
  my $dbh = DBI->connect( 'dbi:Oracle:orcl',
  'jeffrey',
  'jeffspassword',
  );
  上面的连接字符串(DSN)有三个参数:数据源,用户名和密码。DSN(数据源名称) 形式是这样的:dbi:驱动名称:实列 。但是我们怎么知道连接是成功还是失败了呢?首先,如果connect方法连接成功,将返回一个true,否则返回false。其次,DBI将在包变量$DBI::errstr设置一个错误消息串。
复制代码代码如下:  use strict;
  use DBI;
  my $dbh = DBI->connect( 'dbi:Oracle:orcl',
  'jeffrey',
  'jeffspassword',
  ) || die "Database connection not made: $DBI::errstr";
  $dbh->disconnect();
  使用disconnect()方法将避免出现“Database handle destroyed without explicit disconnect”这样的错误。
  选项:
  connect()方法可以带一个哈希选项。常用的哈希选项包括:AutoCommit,当它为true时,事务处理将被自动提交。RaiseError,它在DBI遇到错误时调用croak $DBI::errstr。PrintError,它将调用DBI的warn $DBI::errstr。
  在这个程序中,我们想使用事务处理,因此我们关闭AutoCommit,开启RaiseError,PrintError用其默认设置。
复制代码代码如下:  use strict;
  use DBI;
  my $dbh = DBI->connect( 'dbi:Oracle:orcl',
  'jeffrey',
  'jeffspassword',
  {
  RaiseError => 1,
  AutoCommit => 0
  }
  ) || die "Database connection not made: $DBI::errstr";
  $dbh->disconnect();
  注意的是,对于不支持事务处理的数据库而言,设置AutoCommit为false将导致严重错误。
  发出SQL:
  现在我们打算在数据库上作些有用的事。有两种得到数据库SQL声明的方法。对于查询,将发挥行记录,比如SELECT,我们将使用prepare 方法对于其他查询,比如CREATE  跟 DELETE,我们将使用 do 方法。让我们先来看一下后者,等一下下再看前一种情况。
  这个程序将在数据库中建立一个雇员表 :
复制代码代码如下:  use strict;
  use DBI;
  my $dbh = DBI->connect( 'dbi:Oracle:orcl',
  'jeffrey',
  'jeffspassword',
  {
  RaiseError => 1,
  AutoCommit => 0
  }
  ) || die "Database connection not made: $DBI::errstr";

  my $sql = qq{ CREATE TABLE employees (>  name VARCHAR2(128),

  >  phone CHAR(8)
  ) };
  $dbh->do( $sql );
  $dbh->disconnect();
  中级
  我们已经看到了怎样连接数据库,怎样发现错误以及发出简单SQL声明了。现在让我们继续前进看看更有用的代码吧。
  SELECT 声明:
  SELECT大概是SQL中最常用使用的了。为了用SELECT声明,我们首先将prepare(准备)声明,然后execute(执行)它。下列代码中,$sth 变量是声明句柄,我们将利用它来访问SELECT的结果。
复制代码代码如下:  use strict;
  use DBI;
  my $dbh = DBI->connect( 'dbi:Oracle:orcl',
  'jeffrey',
  'jeffspassword',
  {
  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();
  以上清单将使数据库安排一个执行声明的计划,然后执行声明。实际上它对返回结果行没有进行任何操作。在接下来的代码清单中,我们将使用bind_columns从数据库中取出记录。bind_columns方法绑定每个数据库行和对应的一个标量引用,然后当fetch方法被调用时,这些变量将装载从数据库里取来的值。
复制代码代码如下:  use strict;
  use DBI;
  my $dbh = DBI->connect( 'dbi:Oracle:orcl',
  'jeffrey',
  'jeffspassword',
  {
  RaiseError => 1,
  AutoCommit => 0
  }
  ) || die "Database connection not made: $DBI::errstr";

  my $sql = qq{ SELECT>  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();
  这是一个打印公司电话薄的好程序。但是WHERE字句怎么处理呢?我们将使用 bind_param方法一次准备一个SQL声明,执行将非常快。
复制代码代码如下:  use strict;
  use DBI qw(:sql_types);
  my $dbh = DBI->connect( 'dbi:Oracle:orcl',
  'jeffrey',
  'jeffspassword',
  {
  RaiseError => 1,
  AutoCommit => 0
  }
  ) || die "Database connection not made: $DBI::errstr";
  my @names = ( "Larry%", "Tim%", "Randal%", "Doug%" );

  my $sql = qq{ SELECT>  my $sth = $dbh->prepare( $sql );
  for( @names ) {
  $sth->bind_param( 1, $_, SQL_VARCHAR );
  $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();
  高级:
  事务处理:
  截止到现在,我们还没有用事务处理来做任何事情。但是如果我们想发出UPDATE 或者  DELETE声明,我们将会使用事务处理。通过参考DBI文档,用DBI执行健壮的事务处理的最好方法是使用eval{...} 块去捕获错误。然后使用commit() 或者 rollback()来结束事务处理。这就是我们下面的代码清单所做的事情。
  程序往数据库里装载四条记录。
复制代码代码如下:  use strict;
  use DBI qw(:sql_types);
  my $dbh = DBI->connect( 'dbi:Oracle:orcl',
  'jeffrey',
  'jeffspassword',
  {
  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], SQL_INTEGER );
  $sth->bind_param( 2, @$_->[1], SQL_VARCHAR );
  $sth->bind_param( 3, @$_->[2], SQL_VARCHAR );
  $sth->bind_param( 4, @$_->[3], SQL_VARCHAR );
  $sth->execute();
  $dbh->commit();
  };
  if( $@ ) {
  warn "Database error: $DBI::errstr\n";
  $dbh->rollback(); #just die if rollback is failing
  }
  }
  $sth->finish();
  $dbh->disconnect();
  调用Oracle存储过程:
  通过DBI用户邮件列表,我通常被问及的一个问题是,怎么用DBD::Oracle调用存储过程。这里我给出复杂多变的例子。
  这个程序用一个参数调用存储过程,没有返回值。我们假设这个不过不调用commit。注意程序中位置占位符的使用,同时也注意eval块的使用:如果你的Oracle程序产生了列外,在你的Perl程序中将被“翻译”成die,错误信息将被保留在$@ 和 $DBI::errstr变量中。
复制代码代码如下:  use strict;
  use DBI;
  my $dbh = DBI->connect(
  'dbi:Oracle:orcl',
  'jeffrey',
  'jeffspassword',
  {
  RaiseError => 1,
  AutoCommit => 0
  }
  ) || die "Database connection not made: $DBI::errstr";
  eval {
  my $func = $dbh->prepare(q{
  BEGIN
  jwb_function(
  parameter1_in => :parameter1
  );
  END;
  });
  $func->bind_param(":parameter1", 'Bunce'); #位置占位符时方便的
  $func->execute;
  $dbh->commit;
  };
  if( $@ ) {
  warn "Execution of stored procedure failed: $DBI::errstr\n";
  $dbh->rollback;
  }
  $dbh->disconnect;
  下一个程序调用带返回值的存储过程,从一个函数中返回一个值,我们使用bind_param_inout来绑定占位符。当使用这种方法时,我们必须通知DBD::Oracle模块返回值有多少字节。
复制代码代码如下:  use strict;
  use DBI;
  my $dbh = DBI->connect(
  'dbi:Oracle:orcl',
  'jeffrey',
  'jeffspassword',
  {
  RaiseError => 1,
  AutoCommit => 0
  }
  ) || die "Database connection not made: $DBI::errstr";
  my $rv; #holds the return value from Oracle stored procedure
  eval {
  my $func = $dbh->prepare(q{
  BEGIN
  :rv := jwb_function(
  parameter1_in => :parameter1
  );
  END;
  });
  $func->bind_param(":parameter1", 'Bunce');
  $func->bind_param_inout(":rv", \$rv, 6);
  $func->execute;
  $dbh->commit;
  };
  if( $@ ) {
  warn "Execution of stored procedure failed: $DBI::errstr\n";
  $dbh->rollback;
  }
  print "Execution of stored procedure returned $rv\n";
  $dbh->disconnect;
  说明:
  1.这些例子中的finish方法不是必需的。
  如果你是用声明句柄而不是自己的程序来做,那么你应该调用finish方法。
  2.永远使用use strict句法。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-559013-1-1.html 上篇帖子: perl first day-geek 下篇帖子: perl 中部分正则表达式中匹配非空字符和正常使用字符
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表