Как мне вызвать хранимые процедуры Informix из Perl? - PullRequest
2 голосов
/ 14 июня 2010

Как мне вызвать хранимые процедуры informix из Perl? Я использую 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 ]

3 голосов
/ 14 июня 2010

Как бы странно это не звучало, вам нужно 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 голос
/ 14 июня 2010

Pass 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-запросы.Я не уверен, что различные драйверы, которые я упомянул, будут делать с этим утверждением.

Pass 3

Вы рассматривали возможность обращения к списку рассылки dbi-users@perl.org?Вот где тусуются сопровождающие DBI и DBD :: ODBC.

...