Могу ли я использовать подзапрос в пользовательской функции - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь использовать подзапрос в пользовательской функции mysql, получаю сообщение об ошибке, поэтому вы не могли бы мне помочь с одним примером. Вот мой код:

CREATE DEFINER=`root`@`localhost` FUNCTION `findsubName`(counts INT) 
RETURNS varchar(255) CHARSET utf8
BEGIN
DECLARE result VARCHAR(500) DEFAULT NULL;
DECLARE v_name VARCHAR(200);
DECLARE finished INT(1) DEFAULT 0;
DECLARE my_cursor CURSOR FOR
   SELECT id, (SELECT t_name FROM ajctb_titles b WHERE a.jt_id=b.t_id)
   as tableName FROM ajctb_vacancies a limit counts;

   DECLARE CONTINUE HANDLER 
   FOR NOT FOUND 
   SET finished = 1;

   OPEN my_cursor;
   calc_change: LOOP
   FETCH my_cursor INTO v_name;

   IF finished THEN
     LEAVE calc_change;
   END IF;
   IF result<>'' THEN 
     SET result = CONCAT_WS(',',result,v_name);
   ELSE
     SET result = v_name;
   END IF;
   END LOOP calc_change;
   CLOSE my_cursor;
  RETURN result;
END

Сообщение об ошибке: Код ошибки: 1328. Неверное количество переменных FETCH

1 Ответ

0 голосов
/ 06 января 2019

Сообщение об ошибке: Код ошибки: 1328. Неверное количество переменных FETCH

Сообщения об ошибках пытаются сообщить вам, в чем проблема. Это в FETCH. Смотря на документацию:

13.6.6.3 Синтаксис FETCH курсора

FETCH [[NEXT] FROM] имя_курсора INTO имя_параметра [, имя_переменного] ...

Этот оператор выбирает следующую строку для Оператор SELECT, связанный с указанным курсором (который должен быть открыть) и перемещает указатель курсора. Если строка существует, извлекается столбцы хранятся в именованных переменных. Количество столбцов извлеченный оператором SELECT должен соответствовать номеру вывода переменные, указанные в операторе FETCH . https://dev.mysql.com/doc/refman/8.0/en/fetch.html

2 столбца в вашем запросе:

SELECT
    id
  , (
        SELECT
            t_name
        FROM ajctb_titles b
        WHERE a.jt_id = b.t_id
    )
    AS tableName

означает 2 переменные необходимы FETCH

Он еще даже не пытался выполнить подзапрос.

Что касается коррелированного подзапроса , это может быть проблемой. При использовании подзапроса в предложении select, подобном этому, MUST возвращает не более одного значения. Поэтому вы должны использовать limit 1, если продолжите этот подзапрос.

Этот подзапрос может быть заменен объединением. например,

SELECT
    id
  , b.t_name AS tableName
FROM ajctb_vacancies a
LEFT JOIN ajctb_titles b ON a.jt_id = b.t_id

Вы можете использовать INNER JOIN, если вам всегда нужно возвращать ненулевое имя таблицы.

...