mysql begin end 定界符_mysql存储过程:delimiter定界符导致You have an error in your SQL syntax; check the manual t...

本文介绍了一个MySQL函数的调试过程,包括解决语法错误、修改存储过程定界符及声明函数属性等问题,确保函数能够正确生成随机字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

执行如下存储过程:CREATE FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET latin1

BEGIN

DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

DECLARE return_str varchar(255) DEFAULT '' ;

DECLARE i INT DEFAULT 0;

WHILE i 

SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*62 ),1));

SET i = i +1;

END WHILE;

RETURN return_str;

END;

出现错误:原因是没有修改定界符:

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

默认情况下,delimiter ";" 用于向mysql提交查询语句。在执行存储过程中每个语句的结尾都有个";",这个时候每逢";"就像mysql提交的话,当然会出问题。于是在写存储过程代码之前,先修改mysql的存储定界符delimiter,等存储过程执行之后,在修改回";"

比如修改为"//";

代码示例:delimiter //

执行存储过程:delimiter //

CREATE FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET latin1

BEGIN

DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

DECLARE return_str varchar(255) DEFAULT '' ;

DECLARE i INT DEFAULT 0;

WHILE i 

SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*62 ),1));

SET i = i +1;

END WHILE;

RETURN return_str;

END;//

执行完记着修改delimiter

delimiter ;

新的错误出现了

ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

解决办法:

创建子程序(存储过程、函数、触发器)时,声明为DETERMINISTIC或NO SQL与READS SQL DATA中的一个,

就是在begin关键在之前声明,我这里声明为DETERMINISTIC

完整代码:delimiter //

CREATE FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET latin1

DETERMINISTIC

BEGIN

DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

DECLARE return_str varchar(255) DEFAULT '' ;

DECLARE i INT DEFAULT 0;

WHILE i 

SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*62 ),1));

SET i = i +1;

END WHILE;

RETURN return_str;

END;//

在执行一次发现完美执行

.....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值