2016-09-19 3 views
-2

GUID/UUIDを格納するためにbinary(16)を使用してIDキー列を持つテーブルがあり、残りの列はvarchar(45)です。比較がストアドプロシージャ/関数を間違って実行するのはなぜですか?

IDの選択を実行し、IDが見つからない場合は、新しい列を作成する関数を作成しました。私の問題は、この関数が私のデータと一致しないIDを返すことです。関数のselect部分をワークベンチ上で実行しただけでは、期待どおりに何も返されません。

CREATE DEFINER=`sa`@`192.100.100.%` FUNCTION `SelectReadingHeaders`(testType VARCHAR(45) 
            , COL1 VARCHAR(45) 
            , COL2 VARCHAR(45) 
            , COL3 VARCHAR(45) 
            , COL4 VARCHAR(45) 
            , COL5 VARCHAR(45) 
            , COL6 VARCHAR(45) 
            , COL7 VARCHAR(45) 
            , COL8 VARCHAR(45) 
            , COL9 VARCHAR(45) 
            , COL10 VARCHAR(45) 
            , COL11 VARCHAR(45) 
            , COL12 VARCHAR(45) 
            , COL13 VARCHAR(45) 
            , COL14 VARCHAR(45) 
            , COL15 VARCHAR(45) 
            , COL16 VARCHAR(45)) RETURNS binary(16) 
BEGIN 
    DECLARE columnID BINARY(16); 
    SELECT `ID` FROM `ate`.`readings_columns` 
     WHERE (`TYPE` <=> testType 
      AND`COL1` <=> COL1 
      AND `COL2` <=> COL2 
      AND `COL3` <=> COL3 
      AND `COL4` <=> COL4 
      AND `COL5` <=> COL5 
      AND `COL6` <=> COL6 
      AND `COL7` <=> COL7 
      AND `COL8` <=> COL8 
      AND `COL9` <=> COL9 
      AND `COL10` <=> COL10 
      AND `COL11` <=> COL11 
      AND `COL12` <=> COL12 
      AND `COL13` <=> COL13 
      AND `COL14` <=> COL14 
      AND `COL15` <=> COL15 
      AND `COL16` <=> COL16) 
     LIMIT 1 
     INTO columnID; 
    IF columnID IS null THEN 
     SET columnID = GuidToBinary(UUID()); 
     INSERT INTO `ate`.`readings_columns` 
     VALUES (columnID 
       , testType 
       , COL1 
       , COL2 
       , COL3 
       , COL4 
       , COL5 
       , COL6 
       , COL7 
       , COL8 
       , COL9 
       , COL10 
       , COL11 
       , COL12 
       , COL13 
       , COL14 
       , COL15 
       , COL16); 
    END IF; 
    RETURN columnID; 
END 

次のブロックが誤った結果を返す私のテストコールです:

は、ここに私の関数です。この列/テストタイプのセットはテーブルに存在しません。返される値は、一致するTYPE列の行、および最後のNULL列の一部ですが、完全一致ではありません。 ToGuidは、バイナリ(16)GUID人間が読めるを作る機能です。:

SELECT ToGuid(SelectReadingHeaders('TCXOHunt','TEMPERATURE','ADC Ratio','AH0','AH1','AH2','BH0','BH1','BH2','INTERNALTEMPERATURE',null,null,null,null,null,null,null)) 

そして、まだ私は新しいクエリ]タブに選択機能を入力する場合に予想されるとして、それが0の結果を返します。

SELECT ToGuid(`ID`) FROM `ate`.`readings_columns` 
    WHERE `TYPE` <=> 'TCXOHunt' 
     AND`COL1` <=> 'TEMPERATURE' 
     AND `COL2` <=> 'ADC Ratio' 
     AND `COL3` <=> 'AH0' 
     AND `COL4` <=> 'AH1' 
     AND `COL5` <=> 'AH2' 
     AND `COL6` <=> 'BH0' 
     AND `COL7` <=> 'BH1' 
     AND `COL8` <=> 'BH2' 
     AND `COL9` <=> 'INTERNALTEMPERATURE' 
     AND `COL10` <=> null 
     AND `COL11` <=> null 
     AND `COL12` <=> null 
     AND `COL13` <=> null 
     AND `COL14` <=> null 
     AND `COL15` <=> null 
     AND `COL16` <=> null 
    LIMIT 1 
+1

変数やパラメータの名前を、比較する列と同じ名前にしないでください。 – fancyPants

+0

@fancyPantsそれは私の問題だったので、答えが必要です。 – Fr33dan

答えて

0

MySQLは、カラム名、パラメータまたは変数名を意味するのかどうかを判断できません。したがって、これらの名前が同じ場合、MySQLは、そのようなプロシージャ/関数を記述するときに、カラムを自身と比較する傾向があります。

関連する問題