2016-09-19 2 views
-2

Ich habe eine Tabelle, die eine ID Schlüsselspalte mit binary(16) zum Speichern einer GUID/UUID hat, der Rest der Spalten sind varchar(45).Warum funktioniert der Vergleich falsch eine gespeicherte Prozedur/Funktion?

Ich habe eine Funktion geschrieben, die eine Auswahl für ID in den anderen Spalten ausgeführt, und wenn ID nicht gefunden wird, dann erstellt eine neue. Mein Problem ist, dass diese Funktion eine ID zurückgibt, die nicht mit meinen Daten übereinstimmt. Wenn ich nur den Select-Teil der Funktion auf der Workbench ausführe, wird nichts erwartet zurückgegeben.

Hier ist meine Funktion:

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 

Der nächste Block ist mein Testanruf, die ein falsches Ergebnis zurückgibt. Diese Gruppe von Spalten/Testtyp existiert nicht in der Tabelle. Der zurückgegebene Wert stammt aus einer Zeile mit einer übereinstimmenden Spalte TYPE sowie einigen Nullspalten am Ende, ist jedoch keine vollständige Übereinstimmung. ToGuid ist eine Funktion, die binären macht (16) guid Menschen lesbare .:

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

Und doch, wenn ich die Auswahlfunktion in eine neue Abfrage Registerkarte Typen gibt es 0 Ergebnisse wie erwartet:

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

Benennen Sie Variablen oder Parameter niemals so wie die Spalten, mit denen Sie sie vergleichen möchten. – fancyPants

+0

@fancyPants Das sollte eine Antwort sein, weil es mein Problem war. – Fr33dan

Antwort

0

MySQL kann nicht feststellen, ob Sie einen Spaltennamen oder einen Parameter- oder Variablennamen meinen. Wenn diese also die gleichen Namen haben, vergleicht MySQL die Spalte mit sich selbst, wenn Sie Ihre Prozedur/Funktion so schreiben.

Verwandte Themen