Вызов хранимой процедуры с использованием входных и выходных параметров возвращает разные результаты по сравнению с запуском кода хранимой процедуры непосредственно в виде запроса. Я не могу понять, почему MySQL 8 будет обрабатывать хранимую процедуру таким образом. Был бы признателен, если бы кто-нибудь мог объяснить это поведение и причину этого.
Версия MySQL: GPL версии 8.0.18
Реконструированный код
DELIMITER $$
USE `temp`$$
CREATE TABLE `TestTable` (
`id1` smallint(5) unsigned NOT NULL,
`id2` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`text1` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
`text2` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0',
UNIQUE KEY `uq_TestTable_id1_id2` (`id1`,`id2`),
KEY `ix_TestTable_id1_id2` (`id1`,`id2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci$$
CREATE PROCEDURE `proc_test`(
IN id1 smallint unsigned,
IN id2 nvarchar(10),
OUT outtext1 nvarchar(20),
OUT outtext2 nvarchar(10)
)
BEGIN
SET outtext1 = '';
SET outtext2 = '';
SELECT
`text1`, `text2`
INTO outtext1, outtext2
FROM `TestTable`
WHERE
`id1` = id1 AND
`id2` = id2
LIMIT 1;
END$$
INSERT INTO `TestTable`
(`id1`, `id2`, `text1`, `text2`)
VALUES
(1, 'id2', 'text1', 'text2')$$
DELIMITER ;
-- Returns text1 and text2 values
call proc_test(1, 'id2', @outtext1, @outtext2);
select @outtext1, @outtext2;
-- Should return nothing but returns text1 and text2 values while there is no id2 with a value of xxx
call proc_test(1, 'xxx', @outtext1, @outtext2);
select @outtext1, @outtext2;
-- Should return nothing but returns text1 and text2 values while there is no id1 with a value of 9
call proc_test(9, 'id2', @outtext1, @outtext2);
select @outtext1, @outtext2;
-- Run normal query: Result text1 and text2 as expected
SELECT `text1`, `text2`
FROM `TestTable`
WHERE `id1` = 1 AND `id2` = 'id2';
-- Run normal query: Result is empty as expected
SELECT `text1`, `text2`
FROM `TestTable`
WHERE `id1` = 1 AND `id2` = 'xxx';
-- Run normal query: Result is empty as expected
SELECT `text1`, `text2`
FROM `TestTable`
WHERE `id1` = 9 AND `id2` = 'id2';
-- Cleanup
DROP PROCEDURE `proc_test`;
DROP TABLE `testtable`;
`id1` = id1
как столбецid1
; следовательно, условие всегда истинно. Просто измените имена ввода, например. dbfiddle.uk/ - person Nick   schedule 19.02.2020