【问题标题】:How do I call Informix stored procedures from Perl?如何从 Perl 调用 Informix 存储过程?
【发布时间】:2010-06-14 04:54:48
【问题描述】:

如何从 Perl 调用 informix 存储过程?我使用 DBD::ODBC 连接到 informix 数据库,但我不知道如何调用程序。我的代码是这样的:

my $dbh = DBI->connect("dbi:".DBDRIVE.":".DBNAME,DBUSER,DBPASS,
                      {RaiseError=>0,PrintError=>0,AutoCommit=>1}) ||
          die $DBI::errstr;
    $dbh->do("execute procedure sp_test('2010-05-01 00:00:00')") ||
             warn "failed\n";
    $dbh->disconnect(); 

当我运行它时,它没有出错。但是当我检查数据库时我什么也没得到。如果我直接在数据库中运行存储过程,它可以正常工作。 谁能帮帮我?

【问题讨论】:

    标签: perl informix


    【解决方案1】:

    听起来很奇怪,您需要在语句句柄中输入fetch() 才能真正执行您的存储过程。尝试将您的 do() 调用改为:

    my $sth = $dbh->prepare("execute procedure sp_test('2010-05-01 00:00:00')")
      or die $dbh->errstr
    $sth->execute() or die $dbh->errstr
    $sth->fetch(); # SPL actually executed here
    

    (您可能还需要考虑在您的connect() 选项中设置RaiseError => 1,以避免在每次通话后都必须做所有... or die ... 的事情。)

    【讨论】:

    • 如果您使用 DBD::Informix 并且如果存储过程没有返回数据,那么您将不需要提取(实际上,提取会失败 - 如果过程没有返回数据,则没有任何内容获取,因此 EXECUTE PROCEDURE 不被视为 SELECT)。
    【解决方案2】:

    通过 1

    我想 DBDRIVE、DBNAME、DBUSER 和 DBPASS 是通过常量模块定义的:

    use constant DBDRIVE => "informix";  # ...mitsake...
    use constant DBNAME  => "stores";    # Or whatever
    use constant DBUSER  => "me";
    use constant DBPASS  => "mine";
    

    您应该使用“或”而不是“||”在拨打DBI->connect()之后。

    来自“perldoc DBI”:

        $dbh = DBI−>connect($data_source, $username, $password, \%attr)
                   or die $DBI::errstr;
    

    使用“RaiseError=>1”和/或“PrintError=>1”可以在解决问题时获得更好的帮助;这就是他们的目的。

    一般来说,EXECUTE PROCEDURE 的语法是正确的,只要该过程不返回任何内容就应该可以正常工作...

    通过 2

    哦,您规定的是 DBD::ODBC 而不是 DBD::Informix。因此,您受制于许多我不太了解的代码,而我对 DBD::Informix 了解得并不多。

    我们可以假设您可以使用 DBD::ODBC 成功连接到数据库吗?并进行修改等等?

    您可能需要打开 DBI 跟踪。您可能还需要打开较低级别。您使用的 ODBC 驱动程序是由 Informix 提供的,还是 IBM DB2 CLI (C Common Client) 驱动程序,还是其他人提供的驱动程序?您使用的是哪个版本的 Informix (IDS)?你在哪个平台上运行?您使用的是哪个版本的 Perl、DBI、DBD::ODBC 和各种驱动程序?

    ODBC 驱动程序可以处理发送给它的 SQL。我不清楚我提到的各种驱动程序会如何处理该声明。

    通过 3

    您是否考虑联系dbi-users@perl.org 邮件列表?这就是 DBI 和 DBD::ODBC 的维护者常去的地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-09
      • 2014-01-07
      • 1970-01-01
      • 2012-07-28
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多