如何从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();
当我运行它时,它没有出错。但是当我检查数据库时,我什么也得不到。如果我直接在数据库中运行它,存储过程工作正常。 任何人都可以帮助我吗?
答案 0 :(得分:3)
听起来很奇怪,你需要从语句句柄中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
(您可能还需要考虑在RaiseError => 1
选项中设置connect()
,以避免在每次通话后都执行所有... or die ...
内容。)
答案 1 :(得分: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的语法是正确的,只要程序没有返回任何内容就应该正常工作......
哦,你规定了DBD :: ODBC而不是DBD :: Informix。因此,你知道DBD :: Informix,我不知道很多代码的摆布。
我们可以假设您可以使用DBD :: ODBC成功连接到数据库吗?并修改它等等?
您可能需要打开DBI跟踪。您可能还需要打开较低级别。您使用的是由Informix提供的ODBC驱动程序,还是IBM DB2 CLI(C Common Client)驱动程序或其他人提供的驱动程序?您使用的是哪个版本的Informix(IDS)?你在哪个平台上运行?您使用的是哪个版本的Perl,DBI,DBD :: ODBC和各种驱动程序?
ODBC驱动程序可以改变发送给它的SQL。我不清楚我提到的各种驱动程序会对声明做些什么。
您是否考虑过联系dbi-users@perl.org
邮件列表?这就是DBI和DBD :: ODBC的维护者在那里闲逛的地方。