我有一个Perl脚本,使用DBI打开与Oracle数据库的ODBC连接。选择了一些数据,做了一些工作,实际上没有数据被提交回数据库,但我无法判断这是否有什么不同。
在 END
脚本块的数据库被断开。
END
{
$$db->disconnect() if defined $$db;
exit 0;
}
perl.exe不会退出,而是会因为Oracle DLL的故障而崩溃。
故障应用程序名称:perl.exe,版本:0.0.0.0,时间戳。0x5407ac11 故障模块名称:OraOCIICUS19.dll_unloaded,版本:19.6.0.0,时间戳:0x5e1181b2。0x5e1181b2 异常代码: 0xc0000005 0xc0000005 故障偏移量:0x0000000000df18b0
我试着添加了一个 commit()
方法调用前 disconnect()
ing,但这并没有帮助。
编辑1: $$db
在整个脚本中,当调用对象上的方法时,都会用到DBI连接。我认为这是因为DBI连接是在一个模块方法中创建的。
my $db = MyModule::OpenDB();
my ( $foo, $bar ) = MyModule::GetFoo( $db );
my $rows = $$db->selectall_arrayref( $SQLStr, { Slice => {} } );
如果我试着在single$上调用一个方法,那么我得到的错误是 Can't call method "commit" on unblessed reference
编辑2:打开DBI连接的模块是这样做的。
sub OpenDB
{
my ($params) = @_;
my $db = DBI->connect( "dbi:ODBC:Driver={Oracle in instantclient_19_6};Dbq=MYDB", "MYUSER", "MYPASS", {AutoCommit => 0, RaiseError => 1, PrintError => 0, ShowErrorStatement => 1 } ) or croak $DBI::errstr;
$db->{LongReadLen} = 20480;
$db->{LongTruncOk} = 1;
return \$db;
}
我已经尝试过切换 AutoCommit
开启和关闭,以防止出现任何奇怪的情况。
你不需要在脚本退出时断开DB的连接。当DB-handle离开作用域时,Perl (DBI)会自动为你做这件事。
通常(如果$db是对$dbh-handle的 "非弱化 "引用),这种情况之前不应该发生,所以这样做不应该抛出任何错误,但我猜测这个错误源于你代码的其他部分。
总之--在端块中删除断开连接是安全的。
在整个脚本中,当调用对象上的方法时,都会使用$$db。我认为这是因为DBI连接是在一个模块方法中创建的。
你好。
mhh,如果你真的使用DBI,你也许应该看看你的模块.thats我是怎么做的。
sub mysql_connect($$$$) {
my ($f_database, $f_host, $f_user, $f_password) = (shift, shift, shift, shift);
my $f_handler = DBI->connect("DBI:mysql:database=$f_database;host=$f_host", $f_user, $f_password, {RaiseError=>0,PrintError=>1});
return $f_handler;
};
my $dbh = mysql_connect($db, $host, $user, $pass);
my $sql = "SELECT X FROM Y.Z";
my $stmt = $dbh->prepare($sql);
my $response = $stmt->execute();
while(my $rowref = $stmt->fetchrow_hashref()){
my %row = %$rowref;
for(keys %row){
print $_." => ".$row{$_}."\n";
}
}
$dbh->disconnect();
EDIT:试试吧,但改变mysql到oracle。
connect('DBI:Oracle:XE',"us01","us01")