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

いくつかの構文エラーがありました -

そのうちの 1 つは、すべての宣言が 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 に答える