存储过程不起作用,我不知道为啥
Posted
技术标签:
【中文标题】存储过程不起作用,我不知道为啥【英文标题】:Stored Procedure doesn't work and I don't know why存储过程不起作用,我不知道为什么 【发布时间】:2016-11-11 08:20:29 【问题描述】:我有一个问题,我没有发现我的错误,但是这个存储过程不起作用。理论上,当 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(该数据在“系统”表中),然后知道它具有哪个构建/内核版本。
这是我的 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 PARAMETERequipo_id : 'IUA1000.WORKGROUP.Linux'
而且,如果我尝试从 SP 中进行选择,它会返回以下(正确的)值。
选择 --> so_cursor:
________________________________________________________________
|system_uuid | system_build_number | so |
|------------------------|--------------------------|----------|
|IUA1000.WORKGROUP.Linux | 51183616 | linux |
|________________________|__________________________|__________|
选择 --> v_build_requerido:
__________________
|build_requerido |
|----------------|
|51190880 |
|________________|
谁能告诉我我的错误在哪里?在此先感谢...我正在使用 phpmyAdmin mysql、MariaDB、Ubuntu/Suse。
【问题讨论】:
“不起作用”是对您观察到的行为的非常模糊且实际上无用的描述。你期望发生什么,或不发生什么?我不明白为什么您的查询将system_uuid
与 WHERE 子句中的文字字符串 'equipo_id'
进行比较。在我看来,您希望引用过程参数equipo_id
,而不是字符串文字。我不明白 SELECT 如何返回显示的结果集。我不确定你想要达到什么目的。
@spencer7593,抱歉我的解释很糟糕,但如果我知道出了什么问题,我就不在这里了...system_uuid
是系统表中的 varchar,所以我尝试比较'equipo_id'
也是一个 varchar,所以我不明白有什么问题... 我的 SP 的想法是 --> 不是最低构建/内核版本? ,然后,运行另一个SP... else,什么都不做,开心点... 我不知道我是否以正确的方式使用游标和 if 语句。如果您有任何不明白的地方,请再问我...我真的需要帮助:(提前谢谢。
【参考方案1】:
我认为我的评论很清楚。这是我不理解的查询部分:
WHERE system_uuid LIKE 'equipo_id'
^ ^
具体来说,equipo_id
周围的单引号。这些单引号意味着 MySQL 将其视为 字符串文字。也就是说,MySQL 将其视为一个常量值。它不是对过程变量的引用。
所以我不明白查询如何为system_uuid
列返回值'IUA1000.WORKGROUP.Linux'
。
满足该查询中谓词的system_uuid
列的唯一值是与文字字符串的完全匹配。
要做到这一点,我们要么需要
WHERE system_uuid LIKE 'IUA1000.WORKGROUP.Linux'
^ ^
或者,如果我们想引用存储在过程变量中的值,我们需要省略单引号:
WHERE system_uuid LIKE equipo_id
【讨论】:
啊啊啊啊啊!!!我真的很爱你!!!!现在我明白你之前所说的了......对不起,我以前从未使用过变量,所以我不知道我需要省略单引号。真的,非常感谢!!!!以上是关于存储过程不起作用,我不知道为啥的主要内容,如果未能解决你的问题,请参考以下文章
我不知道为啥我的 IOCP 的 numberOfConcurrentThreads 参数不起作用
.NET Oracle Provider:为啥我的存储过程不起作用?
仅在 Windows 10 中,Java Keyevent 不起作用..在 Windows 7 和 8 中它运行良好..我不知道为啥