0

我正在尝试运行以下存储过程。

CREATE PROCEDURE RNS_CLEANTEXT_MAX_LENGTH()
BEGIN
 SELECT MAX(LENGTH(rns_cleantext) - LENGTH(REPLACE(rns_cleantext," ", ""))+1) FROM rns;
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 '' at line 3

我也尝试过单引号、转义引号和双引号。

任何想法。

由@eggyal 修复:

固定查询现在如下所示:

CREATE FUNCTION RNS_CLEANTEXT_MAX_LENGTH()
 SELECT MAX(LENGTH(rns_cleantext) - LENGTH(REPLACE(rns_cleantext," ", ""))+1) FROM fns;

正如@eggyal 指出的那样,不需要 Begin 和 End 语句。在它们所在的情况下,我必须修改分隔符。

谢谢!

4

1 回答 1

1

定义存储程序中所述:

每个存储的程序都包含一个由 SQL 语句组成的主体。;该语句可能是由分号 ( ) 字符分隔的多个语句组成的复合语句。例如,以下存储过程的主体由包含语句的块和本身包含另一个语句的BEGIN ... END循环组成:SETREPEATSET

CREATE PROCEDURE dorepeat(p1 INT)
BEGIN
  SET @x = 0;
  REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
END;

如果使用mysql客户端程序定义包含分号字符的存储程序,就会出现问题。默认情况下,mysql本身将分号识别为语句分隔符,因此必须临时重新定义分隔符,以使mysql将整个存储的程序定义传递给服务器。

要重新定义mysql分隔符,请使用delimiter命令。以下示例显示了如何为dorepeat()刚刚显示的过程执行此操作。定界符更改为//使整个定义能够作为单个语句传递给服务器,然后;在调用过程之前恢复。这使得;过程主体中使用的分隔符能够传递到服务器,而不是由mysql本身解释。

mysql>delimiter //

mysql> CREATE PROCEDURE dorepeat(p1 INT)
    -> BEGIN
    ->   SET @x = 0;
    ->   REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
    -> END
    ->//
查询正常,0 行受影响(0.00 秒)


mysql>delimiter ;

mysql>CALL dorepeat(1000);
查询正常,0 行受影响(0.00 秒)

mysql>SELECT @x;
+------+
| @x |
+------+
| 1001 |
+------+
一组中的 1 行(0.00 秒)

您可以将分隔符重新定义为除 之外的字符串//,并且分隔符可以由单个字符或多个字符组成。您应该避免使用反斜杠(“<code>\”)字符,因为它是 MySQL 的转义字符。

下面是一个函数示例,该函数接受一个参数,使用 SQL 函数执行操作并返回结果。在这种情况下,不需要使用delimiter,因为函数定义不包含内部;语句分隔符:

mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
    ->RETURN CONCAT('Hello, ',s,'!');
查询正常,0 行受影响(0.00 秒)

mysql>SELECT hello('world');
+----------------+
| 你好('世界') |
+----------------+
| 你好世界!|
+----------------+
一组中的 1 行(0.00 秒)

在您的情况下,由于您的 sproc 仅包含一个语句,您可以简单地删除该BEGIN ... END块。

于 2013-10-25T07:43:44.567 回答