DBD-ShenTong常规操作¶
由于开发者并不直接使用DBD-ShenTong,而是通过perl-dbi与DBD-ShenTong交互,因此应用程序使用perl-dbi进行编程,perl-dbi是一个通用编程接口,他可以访问神通、Oracle、mysql等数据库,且调用方法保持一致。因此本文并不详细说明perl-dbi的各个类和方法,只做一些基本使用的说明。详细的perl-dbi类和方法说明,请查阅DBI官方文档。
变量名约定¶
以下设置了比较常用的变量名命名方法:
$dsn 驱动程序对象的句柄
$dbh 一个数据库对象的句柄
$sth 一个语句或者一个查询对象的句柄
$h 通用的句柄 ($dbh, $sth, 或 $drh),依赖于上下文
$rc 操作代码返回的布什值(true 或 false)
$rv 操作代码返回的整数值
@ary 查询返回的一行值的数组(列表)
$rows 操作代码返回的行数值
$fh 文件句柄
undef NULL 值表示未定义
%attr 引用属性的哈希值并传到方法上
数据库连接¶
使用DBI的connect方法连接数据库:
DBI->connect($dsn, $userid, $password );
connect方法要传入3个参数,每个参数的格式如下:
$dsn : 连接字符串,格式为:DBI:ShenTong:[IP]:[Port]/[dbname] ,DBI:ShenTong:为固定格式,IP为数据的ip地址,prot为端口名称,dbname为神通数据库的实例名称,dsn的示例如下:DBI:ShenTong:127.0.0.1:2003/OSRDB
$userid : 用户名
$password : 密码
完整的connect方法示例如下:
my $host = "localhost"; # 主机地址,默认为 localhost
my $port= "2003"; # 数据库端口
my $driver = "ShenTong"; # 接口类型
my $database = "OSRDB"; # 数据库
my $dsn = "DBI:$driver:$host:$port/$database";
my $userid = "SYSDBA"; # 数据库用户名
my $password = "szoscar55"; # 数据库密码
my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr;
安全连接¶
DBD-ShenTong依赖aci驱动,aci驱动支持了ssl安全通信,且可以通过连接字符串设置,因此DBD-ShenTong也可以在连接字符串设置ssl通信相关配置,多个参数之间用“;”间隔,比如:
my $dsn = "DBI:ShenTong:localhost:2003/OSRDB?ssl_wallet_enable=1;ssl_wallet_path=/opt/wallet/;ssl_wallet_pwd=szoscar55$";
详细可以设置的参数,可参考 《ACI (C/C++)程序员开发手册-->ACI编程概述-->参数配置文件-->参数说明》 中的参数及参数功能描述。
插入操作¶
执行步骤:
使用 prepare() API 预处理 SQL 语句;
使用 execute() API 执行 SQL 语句;
使用 finish() API 释放语句句柄;
最后如果一切顺利就会提交以上执行操作。
my $sth = $dbh->prepare("INSERT INTO Websites
(name, url, alexa, country )
values
('Twitter', 'https://twitter.com/', 10, 'USA')");
$sth->execute() or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;
应用程序还可以绑定输出和输入参数,下面例子通过用变量 取代 ? 占位符的位置来执行一条插入查询:
my $name = "baidu";
my $url = "https://baidu.com/";
my $alexa = 10;
my $country = "china";
my $sth = $dbh->prepare("INSERT INTO Websites
(name, url, alexa, country )
values
(?,?,?,?)");
$sth->execute($name,$url,$alexa, $country)
or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;
更新操作¶
执行步骤:
使用 prepare() API 预处理 SQL 语句;
使用 execute() API 执行 SQL 语句;
使用 finish() API 释放语句句柄;
最后如果一切顺利就会提交以上执行操作。
my $sth = $dbh->prepare("UPDATE Websites
SET alexa = alexa + 1
WHERE country = 'CN'");
$sth->execute() or die $DBI::errstr;
print "更新的记录数 :" + $sth->rows;
$sth->finish();
$dbh->commit or die $DBI::errstr;
应用程序还可以绑定输出和输入参数,下面例子通过用变量取代 ? 占位符的位置来执行一条更新查询:
$name = '神舟通用';
my $sth = $dbh->prepare("UPDATE Websites
SET alexa = alexa + 1
WHERE name = ?");
$sth->execute('$name') or die $DBI::errstr;
print "更新的记录数 :" + $sth->rows;
$sth->finish();
当然我们也可以绑定要设置的值,如下所示将 country 为 CN 的 alexa 都修改为 1000:
$country = 'CN';
$alexa = 1000:;
my $sth = $dbh->prepare("UPDATE Websites
SET alexa = ?
WHERE country = ?");
$sth->execute( $alexa, '$country') or die $DBI::errstr;
print "更新的记录数 :" + $sth->rows;
$sth->finish();
删除操作¶
执行步骤:
使用 prepare() API 预处理 SQL 语句;
使用 execute() API 执行 SQL 语句;
使用 finish() API 释放语句句柄;
最后如果一切顺利就会提交以上执行操作。
以下数据将 Websites 中 alexa 大于 1000 的数据都删除:
$alexa = 1000;
my $sth = $dbh->prepare("DELETE FROM Websites
WHERE alexa = ?");
$sth->execute( $alexa ) or die $DBI::errstr;
print "删除的记录数 :" + $sth->rows;
$sth->finish();
$dbh->commit or die $DBI::errstr;
使用do执行语句¶
do语句可以执行 UPDATE, INSERT, 或 DELETE 操作,使用他比较简短,执行成功返回true,执行失败返回 false,实例如下:
$dbh->do('DELETE FROM Websites WHERE alexa>1000');
事务处理¶
DBD-ShenTong默认为手动提交,任何数据修改必须执行commit进行提交才能生效。
事务开始¶
用begin_work方法开启一个事务,这种方式就不需要在连接数据库的时候设置 AutoCommit = 0 。
$rc = $dbh->begin_work or die $dbh->errstr;
#######################这里执行一些 SQL 操作#####################
$dbh->commit; # 成功后操作-----------------------------
$dbh->rollback; # 失败后回滚
事务自动提交¶
如果想设置为自动,可以在连接数据库时指定属性:
$dbh = DBI->connect($dsn, $userid, $password, {AutoCommit => 0}) or die $DBI::errstr;
以上代码在连接的时候设置了AutoCommit为false, 也就是说当你对数据库进行更新操作的时候, 它不会自动地把那些更新直接写到数据库里, 而是要程序通过 $dbh->commit 来使数据真正地写到数据库里, 或 $dbh->rollback 来回滚刚才的操作。
创建连接完成后,也可以修改是否为自动提交模式:
local $dbh->{AutoCommit} = 1;