我遇到了问题,我没有发现错误,但此存储过程无效。理论上,当OSbuild太旧时,此SP将运行另一个发出警报的SP。
我的SP收到一个uuid(varchar)和两个时间戳(现在我不使用它们)。
我的表格名为" tb_build_requerido"有了这个信息:
________________________________________
|build_requerido | so |
|------------------------|-------------|
|3.12.50 | linux |
|7200 | windows |
|________________________|_____________|
事实上,如果PC具有以前的Linux内核版本或以前的Windows版本,那么它将使我的SP运行另一个SP(acceir_generar_alerta_lista)。
在我的SP中,我做了一些选择,以便了解PC是否具有Windows或Linux(该数据位于" System"表中),然后知道它具有哪个版本/内核版本。
这是我的SP代码。
DROP PROCEDURE `acceir_so_necesario`//
CREATE DEFINER=`root`@`localhost` PROCEDURE `acceir_so_necesario`(IN equipo_id Varchar(100), IN ts_actual BIGINT(20), IN ts_anterior BIGINT(20))
BEGIN
DECLARE v_equipo VARCHAR(100);
DECLARE v_build VARCHAR(100);
DECLARE v_so VARCHAR(100);
DECLARE v_build_requerido VARCHAR(100);
DECLARE `eof` BOOL;
DECLARE so_cursor CURSOR FOR SELECT system_uuid, system_build_number, so FROM ( (SELECT DISTINCT system_uuid, CONVERT( system_build_number, UNSIGNED INTEGER ) AS system_build_number, 'windows' AS so FROM `system` WHERE ( system_build_number REGEXP '^[0-9]{4}') )UNION ( SELECT DISTINCT system_uuid, INET_ATON( CONCAT( substring_index( system_build_number, '-', 1 ) , REPEAT( '.0', 3 - CHAR_LENGTH( substring_index( system_build_number, '-', 1 ) ) + CHAR_LENGTH( REPLACE( substring_index( system_build_number, '-', 1 ) , '.', '' ) ) ) ) ) AS system_build_number, 'linux' AS so FROM `system` WHERE system_build_number NOT REGEXP '^[0-9]{4}' ) )T1 WHERE system_uuid LIKE 'equipo_id' ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET eof = TRUE;
OPEN so_cursor;
`lp`: LOOP
FETCH so_cursor INTO v_equipo, v_build, v_so;
IF `eof` IS TRUE THEN
LEAVE `lp`;
END IF;
IF v_so = 'windows' THEN
SET v_build_requerido = (SELECT CONVERT(build_requerido, UNSIGNED INTEGER) AS build_requerido FROM `tb_build_requerido` WHERE build_requerido_so = 'windows' ORDER BY tb_build_requerido.build_requerido_timestamp DESC LIMIT 1);
IF v_build < v_build_requerido THEN
CALL acceir_generar_alerta_lista (equipo_id, 'actualizar sistema operativo windows', 'actualizar sistema operativo windows');
END IF;
END IF;
IF v_so = 'linux' THEN
SET v_build_requerido = (SELECT INET_ATON( CONCAT( build_requerido, REPEAT( '.0', 3 - CHAR_LENGTH(build_requerido) + CHAR_LENGTH(REPLACE(build_requerido, '.','')) ))) AS build_requerido FROM `tb_build_requerido` WHERE build_requerido_so = 'linux' ORDER BY tb_build_requerido.build_requerido_timestamp DESC LIMIT 1);
IF v_build < v_build_requerido THEN
CALL acceir_generar_alerta_lista (equipo_id, 'actualizar sistema operativo linux', 'actualizar sistema operativo linux');
END IF;
END IF;
END LOOP;
CLOSE so_cursor;
END//
我使用的数据就是这个INPUT参数equipo_id:&#39; IUA1000.WORKGROUP.Linux&#39;
并且,如果我尝试从SP中选择,它将返回以下(正确)值。
选择 - &gt; so_cursor:
________________________________________________________________
|system_uuid | system_build_number | so |
|------------------------|--------------------------|----------|
|IUA1000.WORKGROUP.Linux | 51183616 | linux |
|________________________|__________________________|__________|
选择 - &gt; v_build_requerido:
__________________
|build_requerido |
|----------------|
|51190880 |
|________________|
任何人都可以告诉我我的错误在哪里?在此先感谢...我使用PHPmyAdmin MySQL,MariaDB,Ubuntu / Suse。
答案 0 :(得分:1)
我认为我的评论很清楚。这是我不理解的查询的一部分:
WHERE system_uuid LIKE 'equipo_id'
^ ^
具体而言,equipo_id
周围的单引号。这些单引号意味着MySQL将其视为 字符串文字 。也就是说,MySQL将其视为常量值。 不是对过程变量的引用。
因此,我不了解查询如何为'IUA1000.WORKGROUP.Linux'
列返回值system_uuid
的值。
满足该查询中谓词的system_uuid
列唯一值与文字字符串完全匹配。
为此,我们需要
WHERE system_uuid LIKE 'IUA1000.WORKGROUP.Linux'
^ ^
或者,如果我们想引用存储在过程变量中的值,我们需要省略单引号:
WHERE system_uuid LIKE equipo_id