1

使用 OpenOffice Base 从 OCS-NG Inventory 创建报告。

由于 OOOs Base 源代码编辑器的功能很差(它甚至没有搜索功能!),我更喜欢在 MySQL Workbench 中开发脚本(在 Windows 和 Linux 中)。要复制到 OOO 中的调试脚本。

直到今天一切正常,包括存储过程和函数。今天我写了另一个使用数据库游标的存储函数。在 Workbench 上,脚本可以完美运行,产生可用的结果。

我将脚本复制到 Base 并失败,出现错误 2013“丢失连接...”。在 WB 中,脚本执行大约需要 3-4 秒才能在 4Mbit 互联网连接上返回 348 行,而在 Gbit LAN 上则更少,因此不负责超时。

注释掉部分存储函数,我发现失败发生在open cursor_name语句上。嗯...我可以将WB的脚本输出复制粘贴到电子表格中,但是使用多合一办公包更方便。

让我们提醒一下:同样的脚本,调用同样的函数,在 WB 中确实有效。

那么,如果有人使用 OOO 访问 MySQL 数据库,您可能有解决方案吗?我在OOO论坛上问了Q,问了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;

注意最后两行。带有破折号的假返回有点断点。有了它,该函数在 OOO 中工作,但当然不会产生 usabel 结果。然后主循环开始了:

lup: loop
    set MOV='';
    fetch MonCursor into gmM, gmC, gmD, gmS;

但是,如果在 OOO 中执行,执行将永远不会到达lup:标签。

4

0 回答 0