2011-06-15 84 views
1

我创建这样MySQL存储功能问题

CREATE FUNCTION getVendorID(IN venname VARCHAR(255)) 
RETURNS INT 
BEGIN 
    DECLARE a INT; 
    SELECT vendorid FROM vendors WHERE vendorname LIKE venname INTO a; 
    RETURN a; 
END$$ 

存储功能,但是我收到一个错误:

ERROR 1064 (42000): 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 'IN venname VARCHAR(255))
RETURNS INT
BEGIN
DECLARE a INT;
SELECT vendorid FRO' at line 1

回答

3

MySQL的功能,只需要IN-参数,为此他们不能声明为IN

DELIMITER $$ 
CREATE FUNCTION getVendorID(venname VARCHAR(255)) 
RETURNS INT 
BEGIN 
    DECLARE a INT; 
    SELECT vendorid INTO a FROM vendors WHERE vendorname LIKE venname; 
    RETURN a; 
END$$ 
DELIMITER ; 
2
  1. 没有IN的功能
  2. INTO后选择列表,之前,从
  3. READS SQL数据,以避免二进制日志的问题

所以你的函数定义应该如下:

DELIMITER $$ 
DROP FUNCTION IF EXISTS getVendorID$$ 
CREATE FUNCTION getVendorID(venname VARCHAR(255)) 
RETURNS INT 
READS SQL DATA 
BEGIN 
    DECLARE a INT; 
    SELECT vendorid INTO a FROM vendors WHERE vendorname LIKE venname; 
    RETURN a; 
END$$ 
DELIMITER ; 
+0

SQL读**不**影响二进制日志,SQL写做!,仍然+ 1虽然。 – Johan 2011-06-15 23:06:54

+0

READS需要SQL DATA来告诉mysql函数不会写任何东西 – piotrm 2011-06-15 23:09:44

+0

官方文档说:*“CONTAINS SQL表示该例程不包含读取或写入数据的语句,如果没有给出这些特征,则这是默认值这样的语句的例子是SET @x = 1或者DO RELEASE_LOCK('abc'),它们既执行又不读或写数据。“*注意**这是默认的**部分。 – Johan 2011-06-15 23:13:07

1

为什么所有的代码?使用这个:

CREATE FUNCTION getVendorID(IN venname VARCHAR(255)) 
RETURNS INT 
BEGIN 
    RETURN (SELECT vendorid FROM vendors WHERE vendorname LIKE venname LIMIT 1); 
END$$ 

另外注意介绍od LIMIT 1。如果有多个供应商匹配,您的代码将会爆炸;您不能将来自多行的vendorid放入一个变量中。

您可以考虑自动包装与%作为服务您的来电:WHERE vendorname LIKE CONCAT('%', venname, '%')