MySQL存储功能问题

时间:2011-06-15 22:19:12

标签: mysql function

我正在创建一个像这样的存储函数

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$$

但收到错误:

  

错误1064(42000):您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在“IN venname VARCHAR(255)”附近使用正确的语法       返回INT
      BEGIN
              宣布INT;
              在第1行选择vendorid FRO'

3 个答案:

答案 0 :(得分: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 ;

答案 1 :(得分:2)

  1. no IN for functions
  2. INTO在选择列表之后,在FROM
  3. 之前
  4. 读取SQL数据以避免二进制日志问题
  5. 因此,您的函数定义应如下所示:

    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 ;
    

答案 2 :(得分: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, '%')