MySQL,在存储过程中使用 CONCAT 时出现问题
MySQL, Problem using CONCAT in stored procedure
我在 MySQL 过程中使用 CONCAT() 时遇到问题。
我使用的是MySQL版本:8.0.22
在命令行中,CONCAT 适用于以下两种情况。因此,在我看来,我应该能够在过程中使用其中一种格式。
root@localhost [mdy_exp_constraints]> SET @primary_color_name = 'yellow';
Query OK, 0 rows affected (0.00 sec)
root@localhost [mdy_exp_constraints]> SELECT CONCAT('Data too short for ', @primary_color_name, ' column.');
+----------------------------------------------------------------+
| CONCAT('Data too short for ', @primary_color_name, ' column.') |
+----------------------------------------------------------------+
| Data too short for yellow column. |
+----------------------------------------------------------------+
1 row in set (0.00 sec)
root@localhost [mdy_exp_constraints]> SET @woof = CONCAT('Data too short for ', @primary_color_name, ' column.');
Query OK, 0 rows affected (0.00 sec)
root@localhost [mdy_exp_constraints]> SELECT @woof;
+-----------------------------------+
| @woof |
+-----------------------------------+
| Data too short for yellow column. |
+-----------------------------------+
1 row in set (0.00 sec)
这是我用来测试程序的数据
- 这是很好的数据。所以,没有错误要报告。
CALL mdy_exp_constraints.checkColorsForTooFewChars('red', 'ff');
Query OK, 0 rows affected (0.00 sec)
- 这是错误数据,因为数据对于
IN primary_color_value CHAR(2)
来说太长了。此错误由 MySQl 服务器处理。
CALL mdy_exp_constraints.checkColorsForTooFewChars('green', 'fff');
ERROR 1406 (22001): Data too long for column 'primary_color_value' at row 1
- 这是错误数据,因为数据对于 CHAR(2) 来说太短了。 我想做的是报告这个错误。但是,它似乎不喜欢我在过程中使用 CONCAT() 的方式。
CALL mdy_exp_constraints.checkColorsForTooFewChars('blue', 'a');
ERROR 1644 (45000): Data too short for column.
下面,我定义我的程序。
CREATE SCHEMA mdy_exp_constraints
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
USE mdy_exp_constraints;
DROP PROCEDURE IF EXISTS mdy_exp_constraints.checkColorsForTooFewChars;
SHOW COUNT(*) WARNINGS;
SHOW WARNINGS;
# -- SHOW all PROCEDUREs for the specified database.
SHOW
PROCEDURE STATUS
WHERE
db = 'mdy_exp_constraints'\G
DELIMITER $
CREATE PROCEDURE checkColorsForTooFewChars(
IN primary_color_name VARCHAR(32),
IN primary_color_value CHAR(2)
)
BEGIN
DECLARE required_str_length TINYINT;
SET required_str_length = 2;
IF CHAR_LENGTH(primary_color_value) < required_str_length THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = CONCAT('Data too short for ', primary_color_name, ' column.');
-- SET MESSAGE_TEXT = 'Data too short for column.';
END IF;
END $
DELIMITER ;
这是我收到的错误。
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('Data too short for ', primary_color_name, ' column.');
END IF' at line 11
如果我注释掉包含 CONCAT() 的行并取消注释不包含 CONCAT() 的行,则此过程在 运行 它针对测试数据时有效...除了,它不会报告 primary_color_name
,这是我希望它做的。
谢谢,
麦克
错误发生是因为SET MESSAGE_TEXT
不接受表达式。
DELIMITER $
CREATE PROCEDURE checkColorsForTooFewChars(
IN primary_color_name VARCHAR(32),
IN primary_color_value CHAR(2)
)
BEGIN
DECLARE required_str_length TINYINT;
SET required_str_length = 2;
IF CHAR_LENGTH(primary_color_value) < required_str_length THEN
SET @errorMsg = CONCAT('Data too short for ', primary_color_name, ' column.');
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = @errorMsg;
END IF;
END $
DELIMITER ;
我在 MySQL 过程中使用 CONCAT() 时遇到问题。
我使用的是MySQL版本:8.0.22
在命令行中,CONCAT 适用于以下两种情况。因此,在我看来,我应该能够在过程中使用其中一种格式。
root@localhost [mdy_exp_constraints]> SET @primary_color_name = 'yellow';
Query OK, 0 rows affected (0.00 sec)
root@localhost [mdy_exp_constraints]> SELECT CONCAT('Data too short for ', @primary_color_name, ' column.');
+----------------------------------------------------------------+
| CONCAT('Data too short for ', @primary_color_name, ' column.') |
+----------------------------------------------------------------+
| Data too short for yellow column. |
+----------------------------------------------------------------+
1 row in set (0.00 sec)
root@localhost [mdy_exp_constraints]> SET @woof = CONCAT('Data too short for ', @primary_color_name, ' column.');
Query OK, 0 rows affected (0.00 sec)
root@localhost [mdy_exp_constraints]> SELECT @woof;
+-----------------------------------+
| @woof |
+-----------------------------------+
| Data too short for yellow column. |
+-----------------------------------+
1 row in set (0.00 sec)
这是我用来测试程序的数据
- 这是很好的数据。所以,没有错误要报告。
CALL mdy_exp_constraints.checkColorsForTooFewChars('red', 'ff');
Query OK, 0 rows affected (0.00 sec)
- 这是错误数据,因为数据对于
IN primary_color_value CHAR(2)
来说太长了。此错误由 MySQl 服务器处理。
CALL mdy_exp_constraints.checkColorsForTooFewChars('green', 'fff');
ERROR 1406 (22001): Data too long for column 'primary_color_value' at row 1
- 这是错误数据,因为数据对于 CHAR(2) 来说太短了。 我想做的是报告这个错误。但是,它似乎不喜欢我在过程中使用 CONCAT() 的方式。
CALL mdy_exp_constraints.checkColorsForTooFewChars('blue', 'a');
ERROR 1644 (45000): Data too short for column.
下面,我定义我的程序。
CREATE SCHEMA mdy_exp_constraints
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
USE mdy_exp_constraints;
DROP PROCEDURE IF EXISTS mdy_exp_constraints.checkColorsForTooFewChars;
SHOW COUNT(*) WARNINGS;
SHOW WARNINGS;
# -- SHOW all PROCEDUREs for the specified database.
SHOW
PROCEDURE STATUS
WHERE
db = 'mdy_exp_constraints'\G
DELIMITER $
CREATE PROCEDURE checkColorsForTooFewChars(
IN primary_color_name VARCHAR(32),
IN primary_color_value CHAR(2)
)
BEGIN
DECLARE required_str_length TINYINT;
SET required_str_length = 2;
IF CHAR_LENGTH(primary_color_value) < required_str_length THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = CONCAT('Data too short for ', primary_color_name, ' column.');
-- SET MESSAGE_TEXT = 'Data too short for column.';
END IF;
END $
DELIMITER ;
这是我收到的错误。
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('Data too short for ', primary_color_name, ' column.');
END IF' at line 11
如果我注释掉包含 CONCAT() 的行并取消注释不包含 CONCAT() 的行,则此过程在 运行 它针对测试数据时有效...除了,它不会报告 primary_color_name
,这是我希望它做的。
谢谢,
麦克
错误发生是因为SET MESSAGE_TEXT
不接受表达式。
DELIMITER $
CREATE PROCEDURE checkColorsForTooFewChars(
IN primary_color_name VARCHAR(32),
IN primary_color_value CHAR(2)
)
BEGIN
DECLARE required_str_length TINYINT;
SET required_str_length = 2;
IF CHAR_LENGTH(primary_color_value) < required_str_length THEN
SET @errorMsg = CONCAT('Data too short for ', primary_color_name, ' column.');
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = @errorMsg;
END IF;
END $
DELIMITER ;