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

如何从Perl调用Informix存储过程?,perl,informix,Perl,Informix,如何从Perl调用informix存储过程?我使用DBD::ODBC连接到informix数据库,但我不知道如何调用过程。我的代码如下: my $dbh = DBI->connect("dbi:".DBDRIVE.":".DBNAME,DBUSER,DBPASS, {RaiseError=>0,PrintError=>0,AutoCommit=>1}) || die $DBI::errstr; $db

如何从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 我假设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()
之后,应该使用“or”而不是“||”

从“perldoc DBI”开始:

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

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

通过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的维护人员就是在这里工作的。

听起来很奇怪,为了实际执行存储过程,您需要从语句句柄
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

(您也可以考虑在<代码>连接()/代码>选项中设置<代码> RaSeError=1 >代码>以避免在每次调用后都要执行所有的<代码>…或死亡…<代码> >。< /P>如果您使用DBD::Informix,如果存储过程没有返回数据,那么您就不需要获取。(实际上,获取将失败-如果过程不返回任何数据,则没有任何数据可获取,因此执行过程不会被视为SELECT)。

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