Проблема с хранимой функцией MySQL - PullRequest
1 голос
/ 16 июня 2011

Я создаю хранимую функцию следующим образом

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))
RETURNS INT
BEGIN
DECLARE a INT;
SELECT vendorid FRO' в строке1

Ответы [ 3 ]

3 голосов
/ 16 июня 2011

Функции 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 голосов
/ 16 июня 2011
  1. нет IN для функций
  2. INTO после списка выбора, до FROM
  3. ЧИТАЕТ SQL DATA, чтобы избежать проблем с двоичным журналом

Итак, ваше определение функции должно выглядеть так:

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 ;
1 голос
/ 16 июня 2011

Почему весь этот код?Используйте это:

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, '%')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...