Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > DBI и Хранимые процедуры


Автор: djkostya 20.7.2006, 09:59
Ребята есть процедура в Mysql 5

CREATE PROCEDURE `p`()
COMMENT 'Procedure'
SELECT * FROM test;



Вопрос а как обратиться из под DBI к этой процедуре

Вроде должно быть call только она не пашет....
 

Автор: comtat 20.7.2006, 11:18
Т.е не пашет ? А что говорит ? И как ты ее вызываешь ?

Добавлено @ 11:25 
вот так нужно вызывать
Код

my $s0=$s->prepare (qq{CALL p});
$s0->execute ();
 

Автор: djkostya 20.7.2006, 11:51
DBD::mysql::st execute failed: PROCEDURE agent.proc5 can't return a result set in the given context at test_dbi.pl line 39.

Добавлено @ 11:51 
Мне нажо чтоб в обратку пришли данные 

Автор: comtat 20.7.2006, 12:08
Ошибка говорит что не может возвратить набор результата в данном контексте
а че на в test_dbi.pl line 39 ?? 

Автор: djkostya 20.7.2006, 12:09
Ну это скрипт и строка в скрипте...

Не подскажешь куда копать???????????? 

Автор: comtat 20.7.2006, 12:29
Че в этой строке делается ??
не там ли вызывается эта процедура ?? 

Автор: djkostya 20.7.2006, 12:46
my $sth = $dbh->prepare(qq{CALL p()});
$sth->execute();

my @site;
while (my @row = $sth->fetchrow_array() ){
    print "$row[0]<br>";
}


В 39 вызываеться $sth->execute();

Толк то

Пробовал и так 
my $sth = $dbh->prepare("CALL p()");
$sth->execute(); 

Автор: djkostya 20.7.2006, 13:11
Самое интересное что в командной строке она нормально выполняеться 

Автор: comtat 20.7.2006, 13:35
Если ты написал в командной CALL p()
и все сработало, а в перле не работает, значит синтаксически все правильно...
Очень похоже на несовпадение версий...
Сервак 5, а клиент 3... например  

Автор: djkostya 20.7.2006, 13:49
Нет всё ставил из портов

p5-DBD-mysql50-3.0006
Mysql 5.0.22
DBI 1.51

Вопрос вобще кто нибудь их нормально запустил эти процедуры...  

Автор: comtat 20.7.2006, 15:48
Я даже не знаю чем, тебе щас помочь у меня варианты закончились  smile  

Автор: comtat 27.7.2006, 07:56
я делаю так создаю *.pm файл в нем процедуру
Код

#!/usr/bin/perl
use DBI;
use strict;

my $cc;

my $operator="'$ENV{REMOTE_USER}\@$ENV{REMOTE_ADDR}'" || "USER()";

BEGIN
{
$cc=DBI->connect ("DBI:mysql:дб:хост", "юзер", "пароль", {RaiseError=>0, PrintError=>0});
}
...
sub C_Update_Record
{
   #процедура
}

А из *.pl вызываю так
Код

C_Update_Record (параметры) || return undef;

Может применишь такой способ ??  smile   

Автор: djkostya 24.10.2006, 21:27
Короче проблема решена объясняю в чём было дело...

Если у вас стоит ниже этого DBD-mysql-3.0008_1 то хранимые процедуры пахать не будут будут пахать максимум функции....


Для соединения с базой пользуемся 

my $dbh = DBI->connect("DBI:mysql:database=$base;host=$hostname;mysql_multi_results=1", "$user", "$password");

Это бяка должна стоять обязательно mysql_multi_results=1

Добавлено @ 21:39 
Добавлю

под mod_perl часто возникает такая ошибка плохо или хорошо я не знаю, так но вроде пашет

DESTROY: Error Commands out of sync; you can't run this command now while close stmt

Автор: comtat 25.10.2006, 20:26
Как и предпологались проблема в версии
спасибо за инфу возможно прегодится 

Автор: djkostya 30.10.2006, 16:28
Блин ну я псих


Народ что знали все mysql_multi_results=1 отключите её нафиг.....если вы используете хранимые более чем один раз в скрипте...
И включите тогда когда вам надо с базы вытаскивать большие запросы....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)