1

这是我的脚本:

$db_handle=DBI->connect("$dbstr", "", "",
{RaiseError => 0, AutoCommit => 0, PrintError => 1}) 
|| die "Connect error: $DBI::errstr" ;
$result=$db_handle->selectrow_array("set isolation to dirty read");

注意:$dbstr是一个有效的数据库名称。

我不是数据库程序员。我做错了什么导致 Perl 脚本失败说:

DBD::Informix::db selectrow_array 失败:SQL:-400:在未打开的游标上尝试获取。

如果我编写一个简单的脚本来连接数据库$dbstr并显示表格内容,它可以正常工作,但上面的代码不起作用。

4

4 回答 4

3

selectrow_array方法旨在与返回结果集的语句一起使用。SET ISOLATION 语句不是这样的语句 - 它会失败。

错误 -400 是否是可能的最佳错误有点值得商榷 - 有时我会看看是否可以做任何事情。但是,IIRC,该selectrow_array方法是由 DBI 而不是 DBD::Informix 提供的,因此 DBI 从较低级别的原语构建它。因此,这些原语不能提供高级函数可以提供的验证,因为它们也必须单独工作。

编写该代码的正确方法是:

$db_handle->do("set isolation mode to dirty read");
于 2009-05-07T14:09:31.440 回答
3

您正在执行的语句中没有结果可供您获取:

set isolation to dirty read

selectrow_array()错误的调用方法也是如此。改用$dbh->do(...)

$db_handle->do('set isolation to dirty read');

以下是对 -400 错误的详细解释:

-400 在未打开的游标上尝试获取。

此 FETCH 语句命名一个从未打开或已关闭的游标。查看程序逻辑,并检查它是否会在此之前打开光标,而不是意外关闭它。除非游标声明为 WITH HOLD,否则它会由 COMMIT WORK 或 ROLLBACK WORK 语句自动关闭。

正如 Jonathan 指出的那样,这可能不是最明显的错误,但一旦您了解发生了什么,它确实是有道理的。

于 2009-05-07T14:16:26.307 回答
1

请阅读DBD::Informix的文档,尤其是“CONNECTING_TO_A_DATABASE”部分。连接到 Informix 数据库所需的最少代码似乎是:

$dbh = DBI->connect("dbi:Informix:$database");

因此,您必须提供的不仅仅是数据库的名称。

于 2009-05-07T13:54:30.010 回答
1

set isolation to dirty read不是查询,而是语句。只有查询进入selectrow_array。你需要do

#!usr/bin/perl

use strict;
use warnings;

use DBI;

my $dbi = "dbi:Informix:dbname";

my $dbh = DBI->connect(
    $dbi,
    "",
    "",
    {
        RaiseError => 1,
        AutoCommit => 0,
        PrintError => 1,
        ChopBlanks => 1,
    }
) or die "Connect error: $DBI::errstr";

my $result = $dbh->do("set isolation to dirty read");

$dbh->disconnect;
于 2009-05-07T15:10:24.663 回答