問題がありますが、私のエラーは見つかりませんでしたが、このストアドプロシージャは機能しません。理論的には、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を使用しています。
:
はそれを得るために、我々はどちらかは、私たちが手続き変数に格納された値を参照したい場合は、我々は単一引用符を省略する必要があるだろう、
必要かでしょう「うまくいきません」とは、あなたが観察する行動の非常にあいまいで、実際には役に立たない記述です。何が起こるか、起こらないと思いますか?WHERE句の 'system_uuid'と' equipo_id 'のリテラル文字列を比較している理由を理解できません。文字列リテラルではなく、手続き引数 'equipo_id'を参照したいと思うように思えます。私はSELECTがどのように結果セットを返すことができるか理解していません。私はあなたが何を達成しようとしているのか分かりません。 – spencer7593
@ spencer7593、私の貧弱な説明には申し訳ありませんが、何が間違っているのか分かっていれば私はここにいません... system_uuidはシステムテーブルのvarcharですので、私は 'equipo_id 'と比較しようとしました。またvarcharなので、何が間違っているのか分かりません。**私のSPのアイデアは、最小限のビルド/カーネルバージョンではありませんか?_、** then **、_run SP ... _ ** else **、_do何もないし、幸せになれ... _カーソルとif文を正しい方法で使用しているかどうかはわかりません。あなたが何かを理解していない場合は、私にもう一度尋ねてください...私は本当に助けが必要です:(おかげさまで、事前に –