如何从Perl调用Informix存储过程?
如何从Perl调用informix存储过程?我使用DBD::ODBC连接到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
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