2011-06-15 68 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, '%')