Почему нельзя получить правильный логический запрос для оператора if в процедуре mysql? - PullRequest
0 голосов
/ 17 октября 2019

Запрос всех данных, когда год равен 18:

SELECT * from tb where year=18 //
+----+------+------+------+
| id | name | year | num  |
+----+------+------+------+
|  2 | a    |   18 |  400 |
|  4 | b    |   18 |  200 |
|  6 | c    |   18 |  100 |
+----+------+------+------+

Теперь я написал процедуру mysql:

create procedure show_data(in type char,myear int)
begin
if type = "all" then 
    SELECT * from tb where year=myear;
elseif type != "all" then
    SELECT * from tb where name=type and year=myear;
end if;
end //

Логика в процедуре show_data ясна: когда входной аргументtype это все, а мой 18, запрос просто SELECT * from tb where year=18 в соответствии с процедурой.

То, что я получил с call show_data("all",18), выглядит следующим образом:

call show_data("all",18)//
+----+------+------+------+
| id | name | year | num  |
+----+------+------+------+
|  2 | a    |   18 |  400 |
+----+------+------+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected, 1 warning (0.00 sec)

show warnings//
+---------+------+-------------------------------------------+
| Level   | Code | Message                                   |
+---------+------+-------------------------------------------+
| Warning | 1265 | Data truncated for column 'type' at row 1 |
+---------+------+-------------------------------------------+
1 row in set (0.00 sec)

1 Ответ

1 голос
/ 17 октября 2019

Вы объявляете переменную type как char. Это позволяет только один символ. Отсюда ошибка, которую вы получаете, когда пытаетесь назначить строку, содержащую три символа ('all').

Рассмотрим этот пример :

delimiter //
create procedure debug_char(in type char, myear int)
begin
    select type;
end 
//

call debug_char('abc', 1);

Выход:

Error: ER_DATA_TOO_LONG: Data too long for column 'type' at row 1

Вам необходимо изменить тип данных на char(3), чтобы в него могло поместиться значение (вам действительно нужна максимальная длина символа, как в столбце name, если его больше 3).

Примечание: ваш код можно упростить, переместив логику в сам запрос вместо использования if, как показано ниже:

delimiter //
create procedure debug_char(in type char(3), myear int)
begin
    select * from tb where (name = type or type = 'all') and year = myear;
end
//
...