-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
永远不要将变量或参数命名为与要比较的列相同。 – fancyPants
@fancyPants这应该是一个答案,因为这是我的问题。 – Fr33dan