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: ярлык, если выполняется в ООО.

0 ответов

Другие вопросы по тегам