MySQL CREATE FUNCTION 语法

63

我正在尝试在MySQL中创建一个函数:

以下是SQL代码:

CREATE FUNCTION F_Dist3D (x1 decimal, y1 decimal) 
RETURNS decimal
DETERMINISTIC
BEGIN 
 DECLARE dist decimal;
 SET dist = SQRT(x1 - y1);
 RETURN dist;
END;

我遇到了以下错误:

#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 '' at line 10

我在phpMyAdmin中运行此创建语句。这个函数有什么问题?

4个回答

106

你需要用类似于$$的东西来覆盖你的分号;,以避免出现这种错误。

在函数定义之后,你可以将分隔符重新设置为;

这样应该就可以了:

DELIMITER $$
CREATE FUNCTION F_Dist3D (x1 decimal, y1 decimal) 
RETURNS decimal
DETERMINISTIC
BEGIN 
  DECLARE dist decimal;
  SET dist = SQRT(x1 - y1);
  RETURN dist;
END$$
DELIMITER ;

搞定了。我以为使用phpMyAdmin会消除分隔符黑客攻击。谢谢! - Mel
DELIMITER $$ CREATE PROCEDURE mysql_user_count() BEGIN SELECT 'Mysql用户表' description, COUNT(*) record_count FROM mysql.user; END$$ DELIMITER ; - Keith John Hutchison
3
如果你要处理函数/存储过程,我建议使用HeidiSQL,因为PHPMyAdmin很棒。 - Adam Fowler
有人能解释一下为什么用不同的分隔符包装函数/过程会使它工作吗?我不理解其中的问题。 - saki709

27

MySQL创建函数语法:

DELIMITER //

CREATE FUNCTION GETFULLNAME(fname CHAR(250),lname CHAR(250))
    RETURNS CHAR(250)
    BEGIN
        DECLARE fullname CHAR(250);
        SET fullname=CONCAT(fname,' ',lname);
        RETURN fullname;
    END //

DELIMITER ;

在您的查询中使用此函数

SELECT a.*,GETFULLNAME(a.fname,a.lname) FROM namedbtbl as a


SELECT GETFULLNAME("Biswarup","Adhikari") as myname;

观看这个视频,学习如何创建 MySQL 函数并在查询中使用它。

创建 MySQL 函数的视频教程


1
+1 Biswarup,看起来你有一些很棒的视频。我有一种感觉,我会从你那里学到很多东西。感谢你把这些视频放在一起。 - Johnny
感谢 @Johnny 的宝贵评论。 - biswarupadhikari

0
一个函数可以运行多个SQL语句,从调用者那里获取多个参数和多个值,然后将一个值返回给调用者。*文档详细解释了函数的用法。
例如,您可以按照下面的示例创建一个名为test的表:
CREATE TABLE test (
  num int
);

然后,您将其插入行,其num2,如下所示:
INSERT INTO test (num) VALUES (2);

现在,你可以创建一个名为addition(value INT)的函数,它将value加到num上,并将value作为返回值返回给调用者,如下所示。*如果没有使用DETERMINISTIC,会出现错误我的答案解释了DETERMINISTIC,你必须设置RETURN语句RETURNS <type>子句,否则会出现错误错误,在函数中,允许使用SELECT INTO,但不允许使用没有INTOSELECT,因为基本上会出现错误,所以在创建函数时,需要将默认分隔符;更改为类似$$的内容,否则会出现错误,然后在创建函数后,需要将分隔符$$改回;,如下所示,我的答案解释了分隔符,创建存储过程时,必须选择一个数据库,否则会出现错误
DELIMITER $$

CREATE FUNCTION addition(value INT) RETURNS INT 
DETERMINISTIC
BEGIN
UPDATE test SET num = num + value;
SELECT num INTO value FROM test;
RETURN value;
END$$ 

DELIMITER ;

然后,你可以使用SELECT语句调用addition(3),然后返回5并将5添加到num中,如下所示:
mysql> SELECT addition(3);
+-------------+
| addition(3) |
+-------------+
|           5 |
+-------------+
...
mysql> SELECT num FROM test;
+------+
| num  |
+------+
|  5   |
+------+

此外,您可以创建一个名为addition()的函数,其中包含用户定义的会话变量the user-defined session variable,例如@my_value,并且不带参数,如下所示:
DELIMITER $$

CREATE FUNCTION addition() RETURNS INT 
DETERMINISTIC
BEGIN                       -- ↓ Here
UPDATE test SET num = num + @my_value;
SELECT num INTO @my_value FROM test;
RETURN NULL;    -- ↑ Here
END$$ 

DELIMITER ;

然后,你使用@my_value设置为3并调用addition(),然后3被加到num上,@my_value的值变为5,如下所示:
mysql> SET @my_value = 3;
...
mysql> SELECT addition();
+------------+
| addition() |
+------------+
|       NULL |
+------------+
...
mysql> SELECT num FROM test;
+------+
| num  |
+------+
|  5   |
+------+
...
mysql> SELECT @my_value;   
+-----------+
| @my_value |
+-----------+
|         5 |
+-----------+

在下面的情况下,您可以创建addition(value INT)函数,而无需更改分隔符为$$,也不会出现错误。
CREATE FUNCTION addition(value INT) RETURNS INT
DETERMINISTIC
RETURN value;

0

为了完整起见,接受的答案 的基础上,这里介绍如何删除并调用函数,以及简化操作以删除中间变量(尽管 OP 可能还需要在函数中做更多的工作,只是想让语法正常运行):

DROP FUNCTION IF EXISTS F_Dist3D;

DELIMITER $$
CREATE FUNCTION F_Dist3D (x1 decimal, y1 decimal) 
RETURNS decimal
DETERMINISTIC
BEGIN 
  RETURN SQRT(x1 - y1);
END$$
DELIMITER ;

SELECT F_Dist3D(11, 2); -- => 3

请注意,这里的假设是x1大于y1,因为SQRT需要一个正数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接