8

尝试在 MySQL 中声明新的存储函数时出现错误(服务器版本:5.5.13)

基本上,我有一个大表,它根据字符串的开始方式对字符串进行分类。我的函数接受一个字符串(来自用户输入),然后通过在数据库中搜索分类来告诉您该字符串的分类。它有点像 LIKE 查询,除了相反,因为它是包含完整字符串的用户输入,而数据库包含正在搜索的字符串。希望这是有道理的!

它背后的概念和逻辑工作正常,因为我已经在 PHP 中编写/开发了它并且它工作得很好,但是当试图将它转换为存储函数时,我从 MySQL 中得到一个错误。该函数的代码是:

delimiter $

DROP FUNCTION IF EXISTS get_string_class$
CREATE FUNCTION get_string_class(mystring VARCHAR(15))

RETURNS VARCHAR(15)
READS SQL DATA
BEGIN

DECLARE i INT;
SET i = 2;

DECLARE mystringlength INT;
SET mystringlength = LENGTH(mystring);

DECLARE segment VARCHAR(15);
DECLARE String_Class VARCHAR(15);
SET String_Class = NULL;

WHILE i <= mystringlength DO

   SET segment = LEFT(mystring, i);

   SET String_Class = (SELECT String_Class FROM string_class_list WHERE String_Begins = segment);

   IF SELECT FOUND_ROWS() = 1 THEN
      RETURN String_Class
   END IF;

   i = i + 1;

END WHILE;

RETURN String_Class;

END$
delimiter ;

我收到此错误:

#1064 - 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 
'DECLARE mystringlength INT; SET mystringlength = LENGTH(mystring);
DECLARE segm' at line 10 

我已经做了很多尝试,试图找出我哪里出错了。我什至完全去掉了循环来测试它,但仍然得到同样的错误。有谁知道我在声明该 INT 变量时做错了什么?这可能是非常基本的东西......!

首先十分感谢。

4

2 回答 2

14

有一些语法错误 -

其中之一是 -所有声明必须在 BEGIN...END 子句的开头

DELIMITER $

DROP FUNCTION IF EXISTS get_string_class$
CREATE FUNCTION get_string_class(mystring VARCHAR(15))

RETURNS VARCHAR(15)
READS SQL DATA
BEGIN

DECLARE i INT;
DECLARE segment VARCHAR(15);
DECLARE String_Class VARCHAR(15);
DECLARE mystringlength INT;

SET i = 2;
SET mystringlength = LENGTH(mystring);
SET String_Class = NULL;

WHILE i <= mystringlength DO

   SET segment = LEFT(mystring, i);

   SET String_Class = (SELECT String_Class FROM string_class_list WHERE String_Begins = segment);

   IF (SELECT FOUND_ROWS()) = 1 THEN
      RETURN String_Class;
   END IF;

   SET i = i + 1;

END WHILE;

RETURN String_Class;

END$
DELIMITER ;
于 2012-08-01T10:42:21.800 回答
6

DECLARE存储过程中的部分必须在顶部,SET然后其他语句开始。

于 2012-08-01T10:44:09.840 回答