首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL,存储过程中使用CONCAT的问题

MySQL,存储过程中使用CONCAT的问题
EN

Stack Overflow用户
提问于 2021-01-18 06:49:47
回答 1查看 440关注 0票数 0

--我在MySQL过程中使用CONCAT()有问题。

我使用的是MySQL版本: 8.0.22

在命令行中,CONCAT适用于以下两种情况。因此,在我看来,我应该能够在一个过程中使用这些格式之一。

代码语言:javascript
运行
复制
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)

这是我用来测试我的过程的数据

  • 这是很好的数据。所以没有要报告的错误。
代码语言:javascript
运行
复制
CALL mdy_exp_constraints.checkColorsForTooFewChars('red', 'ff');
Query OK, 0 rows affected (0.00 sec)
  • 这是错误的数据,因为数据对IN primary_color_value CHAR(2)来说太长了。此错误由MySQl服务器处理。
代码语言:javascript
运行
复制
CALL mdy_exp_constraints.checkColorsForTooFewChars('green', 'fff');
ERROR 1406 (22001): Data too long for column 'primary_color_value' at row 1
  • 这是糟糕的数据,因为数据对于CHAR(2)来说太短了。我想要做的是报告这个错误。但是,它似乎不喜欢我在过程中使用CONCAT()的方式。
代码语言:javascript
运行
复制
CALL mdy_exp_constraints.checkColorsForTooFewChars('blue', 'a');
ERROR 1644 (45000): Data too short for column.

下面,我定义了我的程序。

代码语言:javascript
运行
复制
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 ;

这就是我所收到的错误。

代码语言:javascript
运行
复制
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()的行,这个过程在针对测试data...except运行它时工作,它不会报告primary_color_name,这就是我希望它做的。

谢谢,

麦克

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-18 07:08:58

发生此错误是因为SET MESSAGE_TEXT不接受表达式。

代码语言:javascript
运行
复制
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 ;

小提琴

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65769956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档