mysql - 存储过程不起作用,我不知道为什么

标签 mysql linux stored-procedures phpmyadmin

我有一个问题,我没有发现我的错误,但是这个存储过程不起作用。理论上,当 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 PARAMETER equipo_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。

最佳答案

我认为我的评论很清楚。这是我不理解的查询部分:

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

关于mysql - 存储过程不起作用,我不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38272161/

相关文章:

stored-procedures - 如何在 BigQuery 过程中将表名作为参数传递?

php - mysql_connect 未定义

mysql - Inner Join vs. Natural Join,速度方面?

MySQL LAST_INSERT_ID() 与 INSERT INTO 表 SELECT FROM 表

c - uboot/kernel开发中uboot从哪里获取flash、RTC、RAM的信息

linux - 解析 laSTLog 的输出?

sql - 动态 sql 与存储过程 - 优缺点?

php - 如何按频繁值对 "GROUP BY"查询结果进行排序?

linux - 文本文件中日期的grep用法

c# - 使用 OUT 参数调用 MySQL 过程