如何从 Perl 调用 Informix 存储过程?

Posted

技术标签:

【中文标题】如何从 Perl 调用 Informix 存储过程?【英文标题】:How do I call Informix stored procedures from Perl? 【发布时间】: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(); 

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

【问题讨论】:

【参考方案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 的维护者常去的地方。

【讨论】:

以上是关于如何从 Perl 调用 Informix 存储过程?的主要内容,如果未能解决你的问题,请参考以下文章

将存储过程从 MS SQL Server 转换为 Informix

Informix:如何平均存储过程的结果

通过 ADO.Net 命令调用 Informix 存储过程的最佳/正确方法?

如何在 Informix 中正确输入存储过程参数?

Informix:如何将单个参数中的多个值传递、使用和执行到存储过程

Informix:在 Java 中使用存储过程