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

时间:2010-06-14 04:54:49

标签: 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;
    $dbh->do("execute procedure sp_test('2010-05-01 00:00:00')") ||
             warn "failed\n";
    $dbh->disconnect(); 

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

2 个答案:

答案 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)

通过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跟踪。您可能还需要打开较低级别。您使用的是由Informix提供的ODBC驱动程序,还是IBM DB2 CLI(C Common Client)驱动程序或其他人提供的驱动程序?您使用的是哪个版本的Informix(IDS)?你在哪个平台上运行?您使用的是哪个版本的Perl,DBI,DBD :: ODBC和各种驱动程序?

ODBC驱动程序可以改变发送给它的SQL。我不清楚我提到的各种驱动程序会对声明做些什么。

通过3

您是否考虑过联系dbi-users@perl.org邮件列表?这就是DBI和DBD :: ODBC的维护者在那里闲逛的地方。

相关问题