Вчера мучился, хотя вроде и не проблемный вопрос, но у меня время отнял, может кому и пригодится. Есть тестовая функция:
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, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Ошибочка вышла. Вот persist тут как раз и не нужно. Оказалось, что есть баг в MySQL и после вызова процедуры, возвращающей набор данных, единственный способ освободить память, это disconnect. Увы. Но при persist память не освободится и таким образом. Значит тогда:
$flags=131074;
$connection=«$database_driver://$database_user:$database_password@».
«$database_host/$database_name?clientflags=$flags»;
До устранения ошибочки во всяком случае.