2016-09-19 75 views
-2

我有一個表有ID鍵列使用binary(16)來存儲GUID/UUID,其餘列是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列的行,以及末尾的一些空列,但不是完全匹配。 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傾向於將列與自身進行比較。