2016-07-08 24 views
0

問題がありますが、私のエラーは見つかりませんでしたが、このストアドプロシージャは機能しません。理論的には、OSbuildが古すぎる場合、このSPは警告を発する別のSPを実行します。ストアドプロシージャが機能せず、理由がわかりません

私のSPは、uuid(varchar)と2つのタイムスタンプ(現在は使用していません)を受け取ります。

私はこの情報と「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コード。私はSPのうちの選択をしようとした場合、それは、以下の(正しい)の値を返し、「IUA1000.WORKGROUP.Linux」

そして:

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// 

データIの使用は、この入力パラメータequipo_idました。

を選択 - > so_cursor:

________________________________________________________________ 
|system_uuid    | system_build_number | so  | 
|------------------------|--------------------------|----------| 
|IUA1000.WORKGROUP.Linux | 51183616    | linux | 
|________________________|__________________________|__________| 

を選択 - > v_build_requerido:私のエラーがどこにある

__________________ 
|build_requerido | 
|----------------| 
|51190880  | 
|________________| 

誰もが私に言うことができます?ありがとうございます...私はPHPmyAdmin MySQL、MariaDB、Ubuntu/Suseを使用しています。

+0

はそれを得るために、我々はどちらかは、私たちが手続き変数に格納された値を参照したい場合は、我々は単一引用符を省略する必要があるだろう、

WHERE system_uuid LIKE 'IUA1000.WORKGROUP.Linux' ^ ^ 

必要かでしょう「うまくいきません」とは、あなたが観察する行動の非常にあいまいで、実際には役に立たない記述です。何が起こるか、起こらないと思いますか?WHERE句の 'system_uuid'と' equipo_id 'のリテラル文字列を比較している理由を理解できません。文字列リテラルではなく、手続き引数 'equipo_id'を参照したいと思うように思えます。私はSELECTがどのように結果セットを返すことができるか理解していません。私はあなたが何を達成しようとしているのか分かりません。 – spencer7593

+0

@ spencer7593、私の貧弱な説明には申し訳ありませんが、何が間違っているのか分かっていれば私はここにいません... system_uuidはシステムテーブルのvarcharですので、私は 'equipo_id 'と比較しようとしました。またvarcharなので、何が間違っているのか分かりません。**私のSPのアイデアは、最小限のビルド/カーネルバージョンではありませんか?_、** then **、_run SP ... _ ** else **、_do何もないし、幸せになれ... _カーソルとif文を正しい方法で使用しているかどうかはわかりません。あなたが何かを理解していない場合は、私にもう一度尋ねてください...私は本当に助けが必要です:(おかげさまで、事前に –

答えて

1

私のコメントはかなり明確だと思いました。具体的に

WHERE system_uuid LIKE 'equipo_id' 
        ^  ^

単一引用符equipo_id周り:これは私が理解していないよクエリの一部です。これらの単一引用符は、MySQLがそれを文字列リテラルと見なすことを意味します。つまり、MySQLはそれを一定の値として認識します。 ではなく、プロシージャー変数への参照です。

したがって、system_uuid列の値が'IUA1000.WORKGROUP.Linux'の値を戻す方法がわかりません。

system_uuid列の唯一の値は、そのクエリの述語を満たすもので、リテラル文字列と完全に一致します。

WHERE system_uuid LIKE equipo_id 
+0

AHHHHHH !!!!私はあなたが大好きです!!!!申し訳ありませんが、私は過去の変数を使用していないので、私は単一引用符を省略する必要があることを知らなかった。本当にありがとう!!!! –