使用 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:
标签。