如何从 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
通过 ADO.Net 命令调用 Informix 存储过程的最佳/正确方法?