nixp.ru v3.0

30 мая 2017,
вторник,
06:40:00 MSK

DevOps с компанией «Флант»
Аватар пользователя OlegL
OlegL написал 31 января 2008 года в 10:50 (702 просмотра) Ведет себя как мужчина; открыл 14 тем в форуме, оставил 60 комментариев на сайте.

Вчера мучился, хотя вроде и не проблемный вопрос, но у меня время отнял, может кому и пригодится. Есть тестовая функция:

function `test`(pkey int) returns varchar(255) charset utf8

begin

declare res varchar(255);

select name into res from test where code=pkey;

return res;

end

и две процедуры:

procedure `test`(in pkey int,out res varchar(255))

begin

select name into res from test where code=pkey;

end

procedure `test0`()

begin

select * from cardtypes;

end

C функцией всё просто:

$result=$db->Execute(«select test($pkey);»);

С первой процедурой немногим сложнее:

$db->Execute(«call test($pkey,@res);»);

$result=$db->Execute(«select @res»);

А вот третья процедура при попытке

$result=$db->Execute(«call test0()»);

вызывала ошибку '…can’t return a result set in a given context…’, причём не у меня одного, достаточно набрать эту строку в поисковике, чтобы увидеть. Не хотела набор данных отдавать и всё.

Решение: соединяться с базой надо так

$flags = 131074;

$connection=«$database_driver://$database_user:$database_password@».

$database_host/$database_name?persist&clientflags=$flags»;

$db=ADONewConnection($connection);

и всё проходит, во всяком случае для драйвера mysqli. Оказалось достаточным взвести флаг CLIENT_MULTI_RESULT, но дошло не сразу, поэтому и решил поделиться.

OlegL

Ошибочка вышла. Вот persist тут как раз и не нужно. Оказалось, что есть баг в MySQL и после вызова процедуры, возвращающей набор данных, единственный способ освободить память, это disconnect. Увы. Но при persist память не освободится и таким образом. Значит тогда:

$flags=131074;

$connection=«$database_driver://$database_user:$database_password@».

«$database_host/$database_name?clientflags=$flags»;

До устранения ошибочки во всяком случае.