OpenOffice потерял соединение с MySQL на открытом курсоре
Создание отчетов из инвентаря OCS-NG с использованием OpenOffice Base.
Из-за плохой функциональности редактора исходного кода OOOs (он даже не имеет возможности поиска!), Я предпочитаю разрабатывать скрипты в MySQL Workbench (как в Windows, так и в Linux). Дебаговый скрипт для копирования в ООО.
До сегодняшнего дня все работало нормально, включая хранимые процедуры и функции. Сегодня я написал еще одну хранимую функцию с использованием курсора базы данных. На Workbench скрипт работает просто отлично и дает полезные результаты.
Я скопировал скрипт в базу, и он завершился с ошибкой 2013 "потерянное соединение...". В WB выполнение сценария занимает около 3-4 секунд, чтобы вернуть 348 строк при 4-мегабитном интернет-соединении и еще меньше в Gbit LAN., Поэтому таймауты не оплачиваются.
Закомментируя части хранимой функции, я обнаружил, что сбой происходит на open cursor_name
заявление. Ну... я могу скопировать и вставить вывод сценария WB в электронную таблицу, но использовать офисный пакет "все в одном" удобнее.
Напомним: один и тот же скрипт, вызывающий ту же функцию, работает в WB.
Итак, если кто-то использует OOO для доступа к базам данных MySQL, может быть, у вас есть решение? Я спросил Q's на форумах OOO и спросил TS, но не получил никакого пригодного ответа.
редактировать: начало функции
DELIMITER $$
CREATE DEFINER=`root`@`%` FUNCTION `get_monitors`(gmhwid int(11)) RETURNS text CHARSET utf8
BEGIN
declare MOV tinytext;
declare RetVal text;
declare NumOfMons, RowNum int;
# CURSOR-related variables
DECLARE done INT DEFAULT FALSE;
declare gmM, gmC, gmD, gmS tinytext charset utf8;
declare MonCursor cursor for select
MANUFACTURER,CAPTION,DESCRIPTION,SERIAL
from ocsweb.monitors
where ocsweb.monitors.hardware_id=gmhwid;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
# If there''s an overrider, use it and return
set MOV=(select Realmonitor from accinfo where hardware_id=gmhwid);
if ((MOV<>'') and (not isnull(MOV))) then
return mov;
end if;
# how many monitors for this computer
set NumOfMons=(select count(*) from monitors where hardware_id=gmhwid);
set RowNum=0;
set RetVal='';
#set @sel:=(select MANUFACTURER,CAPTION,DESCRIPTION,SERIAL from monitors where monitors.hardware_id=gmhwid);
return '-';
open MonCursor;
Обратите внимание на две последние строки. Поддельное возвращение с тире - это своего рода точка останова. При этом функция работает в ООО, но, конечно, не дает никакого usabel результата. Затем начался основной цикл:
lup: loop
set MOV='';
fetch MonCursor into gmM, gmC, gmD, gmS;
Но исполнение никогда не достигнет lup:
ярлык, если выполняется в ООО.